From df8ccafa7c01c162bebd00aefe557a1bfc0f300b Mon Sep 17 00:00:00 2001 From: Taym Haddadi Date: Mon, 12 Aug 2024 09:58:00 +0200 Subject: [PATCH] Fix: Return error and avoid panicking in SetOpener function (#33002) * Fix: Return error and avoid panicking in SetOpener function Signed-off-by: Bentaimia Haddadi * eturn JSFailed onstead of InvalidState Signed-off-by: Bentaimia Haddadi * Update wpt test result Signed-off-by: Bentaimia Haddadi --------- Signed-off-by: Bentaimia Haddadi --- components/script/dom/webidls/Window.webidl | 2 +- components/script/dom/window.rs | 28 ++++++++++--------- components/script/dom/windowproxy.rs | 9 ++++-- ...window-opener-unconfigurable.window.js.ini | 2 -- ...window-opener-unconfigurable.window.js.ini | 2 -- 5 files changed, 22 insertions(+), 21 deletions(-) delete mode 100644 tests/wpt/meta-legacy-layout/html/browsers/the-window-object/window-opener-unconfigurable.window.js.ini delete mode 100644 tests/wpt/meta/html/browsers/the-window-object/window-opener-unconfigurable.window.js.ini diff --git a/components/script/dom/webidls/Window.webidl b/components/script/dom/webidls/Window.webidl index 44db6f08887..84871494d2b 100644 --- a/components/script/dom/webidls/Window.webidl +++ b/components/script/dom/webidls/Window.webidl @@ -36,7 +36,7 @@ // Note that this can return null in the case that the browsing context has been discarded. // https://github.com/whatwg/html/issues/2115 [LegacyUnforgeable, CrossOriginReadable] readonly attribute WindowProxy? top; - [CrossOriginReadable] attribute any opener; + [Throws, CrossOriginReadable] attribute any opener; // Note that this can return null in the case that the browsing context has been discarded. // https://github.com/whatwg/html/issues/2115 [Replaceable, CrossOriginReadable] readonly attribute WindowProxy? parent; diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 90ba17a9cbf..a9d3dd3c16b 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -702,41 +702,43 @@ impl WindowMethods for Window { } // https://html.spec.whatwg.org/multipage/#dom-opener - fn Opener(&self, cx: JSContext, in_realm_proof: InRealm) -> JSVal { + fn GetOpener(&self, cx: JSContext) -> Fallible { // Step 1, Let current be this Window object's browsing context. let current = match self.window_proxy.get() { Some(proxy) => proxy, // Step 2, If current is null, then return null. - None => return NullValue(), + None => return Ok(NullValue()), }; // Still step 2, since the window's BC is the associated doc's BC, // see https://html.spec.whatwg.org/multipage/#window-bc // and a doc's BC is null if it has been discarded. // see https://html.spec.whatwg.org/multipage/#concept-document-bc if current.is_browsing_context_discarded() { - return NullValue(); + return Ok(NullValue()); } // Step 3 to 5. - current.opener(*cx, in_realm_proof) + Ok(current.opener(*cx)) } #[allow(unsafe_code)] // https://html.spec.whatwg.org/multipage/#dom-opener - fn SetOpener(&self, cx: JSContext, value: HandleValue) { + fn SetOpener(&self, cx: JSContext, value: HandleValue) -> ErrorResult { // Step 1. if value.is_null() { - return self.window_proxy().disown(); + self.window_proxy().disown(); + return Ok(()); } // Step 2. let obj = self.reflector().get_jsobject(); unsafe { - assert!(JS_DefineProperty( - *cx, - obj, - c"opener".as_ptr(), - value, - JSPROP_ENUMERATE as u32 - )); + let result = + JS_DefineProperty(*cx, obj, c"opener".as_ptr(), value, JSPROP_ENUMERATE as u32); + + if result { + Ok(()) + } else { + Err(Error::JSFailed) + } } } diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index 0715108d757..7ea90088509 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -418,7 +418,7 @@ impl WindowProxy { #[allow(unsafe_code)] // https://html.spec.whatwg.org/multipage/#dom-opener - pub fn opener(&self, cx: *mut JSContext, in_realm_proof: InRealm) -> JSVal { + pub fn opener(&self, cx: *mut JSContext) -> JSVal { if self.disowned.get() { return NullValue(); } @@ -436,8 +436,11 @@ impl WindowProxy { opener_id, ) { Some(opener_top_id) => { - let global_to_clone_from = - unsafe { GlobalScope::from_context(cx, in_realm_proof) }; + let in_realm_proof = + AlreadyInRealm::assert_for_cx(unsafe { SafeJSContext::from_ptr(cx) }); + let global_to_clone_from = unsafe { + GlobalScope::from_context(cx, InRealm::Already(&in_realm_proof)) + }; let creator = CreatorBrowsingContextInfo::from(parent_browsing_context, None); WindowProxy::new_dissimilar_origin( diff --git a/tests/wpt/meta-legacy-layout/html/browsers/the-window-object/window-opener-unconfigurable.window.js.ini b/tests/wpt/meta-legacy-layout/html/browsers/the-window-object/window-opener-unconfigurable.window.js.ini deleted file mode 100644 index 83baa0fdf4e..00000000000 --- a/tests/wpt/meta-legacy-layout/html/browsers/the-window-object/window-opener-unconfigurable.window.js.ini +++ /dev/null @@ -1,2 +0,0 @@ -[window-opener-unconfigurable.window.html] - expected: CRASH diff --git a/tests/wpt/meta/html/browsers/the-window-object/window-opener-unconfigurable.window.js.ini b/tests/wpt/meta/html/browsers/the-window-object/window-opener-unconfigurable.window.js.ini deleted file mode 100644 index 83baa0fdf4e..00000000000 --- a/tests/wpt/meta/html/browsers/the-window-object/window-opener-unconfigurable.window.js.ini +++ /dev/null @@ -1,2 +0,0 @@ -[window-opener-unconfigurable.window.html] - expected: CRASH