diff options
author | Taym Haddadi <haddadi.taym@gmail.com> | 2024-08-12 09:58:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-12 07:58:00 +0000 |
commit | df8ccafa7c01c162bebd00aefe557a1bfc0f300b (patch) | |
tree | 74e4d06db6f4b49dc0580ed8be93d437dbf8e819 /components/script | |
parent | a797969efed10c46c7cf93e5eb7a03b52d6ca7bc (diff) | |
download | servo-df8ccafa7c01c162bebd00aefe557a1bfc0f300b.tar.gz servo-df8ccafa7c01c162bebd00aefe557a1bfc0f300b.zip |
Fix: Return error and avoid panicking in SetOpener function (#33002)
* Fix: Return error and avoid panicking in SetOpener function
Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com>
* eturn JSFailed onstead of InvalidState
Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com>
* Update wpt test result
Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com>
---------
Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com>
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/webidls/Window.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/window.rs | 28 | ||||
-rw-r--r-- | components/script/dom/windowproxy.rs | 9 |
3 files changed, 22 insertions, 17 deletions
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<JSVal> { // 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( |