mirror of
https://github.com/denoland/deno.git
synced 2024-11-22 15:06:54 -05:00
b2cd254c35
Deno v1.39 introduces `vm.runInNewContext`. This may cause problems when using `Object.prototype.isPrototypeOf` to check built-in types. ```js import vm from "node:vm"; const err = new Error(); const crossErr = vm.runInNewContext(`new Error()`); console.assert( !(crossErr instanceof Error) ); console.assert( Object.getPrototypeOf(err) !== Object.getPrototypeOf(crossErr) ); ``` This PR changes to check using internal slots solves them. --- current: ``` > import vm from "node:vm"; undefined > vm.runInNewContext(`new Error("message")`) Error {} > vm.runInNewContext(`new Date("2018-12-10T02:26:59.002Z")`) Date {} ``` this PR: ``` > import vm from "node:vm"; undefined > vm.runInNewContext(`new Error("message")`) Error: message at <anonymous>:1:1 > vm.runInNewContext(`new Date("2018-12-10T02:26:59.002Z")`) 2018-12-10T02:26:59.002Z ``` --------- Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
60 lines
1.6 KiB
JavaScript
60 lines
1.6 KiB
JavaScript
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
|
|
// @ts-check
|
|
/// <reference path="../../core/internal.d.ts" />
|
|
/// <reference path="../webidl/internal.d.ts" />
|
|
/// <reference path="../web/internal.d.ts" />
|
|
/// <reference lib="esnext" />
|
|
|
|
import { core, primordials } from "ext:core/mod.js";
|
|
const ops = core.ops;
|
|
import * as webidl from "ext:deno_webidl/00_webidl.js";
|
|
import { DOMException } from "ext:deno_web/01_dom_exception.js";
|
|
const {
|
|
ObjectPrototypeIsPrototypeOf,
|
|
TypeErrorPrototype,
|
|
} = primordials;
|
|
|
|
/**
|
|
* @param {string} data
|
|
* @returns {string}
|
|
*/
|
|
function atob(data) {
|
|
const prefix = "Failed to execute 'atob'";
|
|
webidl.requiredArguments(arguments.length, 1, prefix);
|
|
data = webidl.converters.DOMString(data, prefix, "Argument 1");
|
|
try {
|
|
return ops.op_base64_atob(data);
|
|
} catch (e) {
|
|
if (ObjectPrototypeIsPrototypeOf(TypeErrorPrototype, e)) {
|
|
throw new DOMException(
|
|
"Failed to decode base64: invalid character",
|
|
"InvalidCharacterError",
|
|
);
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {string} data
|
|
* @returns {string}
|
|
*/
|
|
function btoa(data) {
|
|
const prefix = "Failed to execute 'btoa'";
|
|
webidl.requiredArguments(arguments.length, 1, prefix);
|
|
data = webidl.converters.DOMString(data, prefix, "Argument 1");
|
|
try {
|
|
return ops.op_base64_btoa(data);
|
|
} catch (e) {
|
|
if (ObjectPrototypeIsPrototypeOf(TypeErrorPrototype, e)) {
|
|
throw new DOMException(
|
|
"The string to be encoded contains characters outside of the Latin1 range.",
|
|
"InvalidCharacterError",
|
|
);
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
export { atob, btoa };
|