summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKitson Kelly <me@kitsonkelly.com>2021-06-22 07:17:35 +1000
committerGitHub <noreply@github.com>2021-06-22 07:17:35 +1000
commitcda15f2a98b10330422d1c8352d163d703ee6a49 (patch)
treea221c21283d1d19675cf77a66929f5c2b2936861
parent2d2b5625e04a466362c9a4afb05e2f559c4fb4b0 (diff)
feat: Deno namespace configurable and unfrozen (#11062)
Closes #11033
-rw-r--r--cli/tests/unit/globals_test.ts50
-rw-r--r--runtime/js/06_util.js4
-rw-r--r--runtime/js/99_main.js7
3 files changed, 16 insertions, 45 deletions
diff --git a/cli/tests/unit/globals_test.ts b/cli/tests/unit/globals_test.ts
index 7603457b9..08ae23765 100644
--- a/cli/tests/unit/globals_test.ts
+++ b/cli/tests/unit/globals_test.ts
@@ -62,8 +62,8 @@ unitTest(function DenoNamespaceEqualsWindowDeno(): void {
assert(Deno === window.Deno);
});
-unitTest(function DenoNamespaceIsFrozen(): void {
- assert(Object.isFrozen(Deno));
+unitTest(function DenoNamespaceIsNotFrozen(): void {
+ assert(!Object.isFrozen(Deno));
});
unitTest(function webAssemblyExists(): void {
@@ -77,46 +77,14 @@ declare global {
}
}
-unitTest(function DenoNamespaceImmutable(): void {
- const denoCopy = window.Deno;
- try {
- // deno-lint-ignore no-explicit-any
- (Deno as any) = 1;
- } catch {
- // pass
- }
- assert(denoCopy === Deno);
- try {
- // deno-lint-ignore no-explicit-any
- (window as any).Deno = 1;
- } catch {
- // pass
- }
- assert(denoCopy === Deno);
- try {
- // deno-lint-ignore no-explicit-any
- delete (window as any).Deno;
- } catch {
- // pass
- }
- assert(denoCopy === Deno);
-
- const { readFile } = Deno;
- try {
- // deno-lint-ignore no-explicit-any
- (Deno as any).readFile = 1;
- } catch {
- // pass
- }
- assert(readFile === Deno.readFile);
- try {
- // deno-lint-ignore no-explicit-any
- delete (window as any).Deno.readFile;
- } catch {
- // pass
- }
- assert(readFile === Deno.readFile);
+unitTest(function DenoNamespaceConfigurable() {
+ const desc = Object.getOwnPropertyDescriptor(globalThis, "Deno");
+ assert(desc);
+ assert(desc.configurable);
+ assert(!desc.writable);
+});
+unitTest(function DenoCoreNamespaceIsImmutable(): void {
const { print } = Deno.core;
try {
Deno.core.print = 1;
diff --git a/runtime/js/06_util.js b/runtime/js/06_util.js
index 9df9ac88a..3809cc9d0 100644
--- a/runtime/js/06_util.js
+++ b/runtime/js/06_util.js
@@ -117,6 +117,7 @@
return {
value,
writable: true,
+ enumerable: false,
configurable: true,
};
}
@@ -125,6 +126,8 @@
return {
value,
enumerable: true,
+ writable: false,
+ configurable: true,
};
}
@@ -132,6 +135,7 @@
return {
get: getter,
enumerable: true,
+ configurable: true,
};
}
diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js
index 09a2ebb55..91a4dcefd 100644
--- a/runtime/js/99_main.js
+++ b/runtime/js/99_main.js
@@ -492,10 +492,9 @@ delete Object.prototype.__proto__;
Object.assign(finalDenoNs, denoNsUnstable);
}
- // Setup `Deno` global - we're actually overriding already
- // existing global `Deno` with `Deno` namespace from "./deno.ts".
- util.immutableDefine(globalThis, "Deno", finalDenoNs);
- Object.freeze(globalThis.Deno);
+ // Setup `Deno` global - we're actually overriding already existing global
+ // `Deno` with `Deno` namespace from "./deno.ts".
+ Object.defineProperty(globalThis, "Deno", util.readOnly(finalDenoNs));
Object.freeze(globalThis.Deno.core);
Object.freeze(globalThis.Deno.core.sharedQueue);
signals.setSignals();