summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsnek <snek@deno.com>2024-07-09 10:07:56 -0700
committerGitHub <noreply@github.com>2024-07-09 10:07:56 -0700
commitc461f8fd2e36904b3334c9705726b713712f4a69 (patch)
tree796892fa6c0427b959e4350ed01bbe4597694779
parent839caf6fafdf9ca1cdec6cd9cef38296be41145f (diff)
fix: do not return undefined for missing global properties (#24474)
accessing e.g. `Buffer` in `Mode::Deno` mode should throw, not return undefined. --------- Signed-off-by: snek <snek@deno.com>
-rw-r--r--ext/node/global.rs4
-rw-r--r--ext/web/02_timers.js6
-rw-r--r--tests/node_compat/test/common/index.js1
-rw-r--r--tests/unit/globals_test.ts14
4 files changed, 20 insertions, 5 deletions
diff --git a/ext/node/global.rs b/ext/node/global.rs
index e01fca95e..2367814f9 100644
--- a/ext/node/global.rs
+++ b/ext/node/global.rs
@@ -305,6 +305,10 @@ pub fn getter<'s>(
let reflect_get = v8::Local::new(scope, reflect_get);
let inner = v8::Local::new(scope, inner);
+ if !inner.has_own_property(scope, key).unwrap_or(false) {
+ return v8::Intercepted::No;
+ }
+
let undefined = v8::undefined(scope);
let Some(value) = reflect_get.call(
scope,
diff --git a/ext/web/02_timers.js b/ext/web/02_timers.js
index e30071971..559147861 100644
--- a/ext/web/02_timers.js
+++ b/ext/web/02_timers.js
@@ -35,7 +35,7 @@ function checkThis(thisArg) {
function setImmediate(callback, ...args) {
if (args.length > 0) {
const unboundCallback = callback;
- callback = () => ReflectApply(unboundCallback, window, args);
+ callback = () => ReflectApply(unboundCallback, globalThis, args);
}
return core.queueImmediate(
@@ -55,7 +55,7 @@ function setTimeout(callback, timeout = 0, ...args) {
}
if (args.length > 0) {
const unboundCallback = callback;
- callback = () => ReflectApply(unboundCallback, window, args);
+ callback = () => ReflectApply(unboundCallback, globalThis, args);
}
timeout = webidl.converters.long(timeout);
return core.queueUserTimer(
@@ -77,7 +77,7 @@ function setInterval(callback, timeout = 0, ...args) {
}
if (args.length > 0) {
const unboundCallback = callback;
- callback = () => ReflectApply(unboundCallback, window, args);
+ callback = () => ReflectApply(unboundCallback, globalThis, args);
}
timeout = webidl.converters.long(timeout);
return core.queueUserTimer(
diff --git a/tests/node_compat/test/common/index.js b/tests/node_compat/test/common/index.js
index 2ebb22da2..bc1ea05e4 100644
--- a/tests/node_compat/test/common/index.js
+++ b/tests/node_compat/test/common/index.js
@@ -62,7 +62,6 @@ let knownGlobals = [
self,
sessionStorage,
setImmediate,
- window,
];
if (global.AbortController)
diff --git a/tests/unit/globals_test.ts b/tests/unit/globals_test.ts
index 8e07cf005..e4cbe7daf 100644
--- a/tests/unit/globals_test.ts
+++ b/tests/unit/globals_test.ts
@@ -1,7 +1,12 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
// deno-lint-ignore-file no-window-prefix no-window
-import { assert, assertEquals, assertRejects } from "./test_util.ts";
+import {
+ assert,
+ assertEquals,
+ assertRejects,
+ assertThrows,
+} from "./test_util.ts";
Deno.test(function globalThisExists() {
assert(globalThis != null);
@@ -224,3 +229,10 @@ Deno.test(function mapGroupBy() {
quantity: 5,
}]);
});
+
+Deno.test(function nodeGlobalsRaise() {
+ assertThrows(() => {
+ // @ts-ignore yes that's the point
+ Buffer;
+ }, ReferenceError);
+});