diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/browsingcontext.rs | 6 | ||||
-rw-r--r-- | components/script/dom/document.rs | 8 | ||||
-rw-r--r-- | components/script/dom/element.rs | 25 | ||||
-rw-r--r-- | components/script/dom/webidls/Document.webidl | 2 | ||||
-rw-r--r-- | components/script/script_thread.rs | 6 |
5 files changed, 37 insertions, 10 deletions
diff --git a/components/script/dom/browsingcontext.rs b/components/script/dom/browsingcontext.rs index 99c72e1e4be..1b78fb7572d 100644 --- a/components/script/dom/browsingcontext.rs +++ b/components/script/dom/browsingcontext.rs @@ -108,6 +108,12 @@ impl BrowsingContext { Root::from_ref(&self.history.borrow()[self.active_index.get()].document) } + pub fn maybe_active_document(&self) -> Option<Root<Document>> { + self.history.borrow().get(self.active_index.get()).map(|entry| { + Root::from_ref(&*entry.document) + }) + } + pub fn active_window(&self) -> Root<Window> { Root::from_ref(self.active_document().window()) } diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 6e4b4b030e8..4dfb484a301 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -2551,8 +2551,12 @@ impl DocumentMethods for Document { } // https://html.spec.whatwg.org/multipage/#dom-document-defaultview - fn DefaultView(&self) -> Root<Window> { - Root::from_ref(&*self.window) + fn GetDefaultView(&self) -> Option<Root<Window>> { + if self.browsing_context.is_none() { + None + } else { + Some(Root::from_ref(&*self.window)) + } } // https://html.spec.whatwg.org/multipage/#dom-document-cookie diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 5b7c9ecf4aa..0b639539f5f 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -1315,7 +1315,10 @@ impl Element { } // Step 5 - let win = doc.DefaultView(); + let win = match doc.GetDefaultView() { + None => return, + Some(win) => win, + }; // Step 7 if *self.root_element() == *self { @@ -1653,7 +1656,10 @@ impl ElementMethods for Element { } // Step 3 - let win = doc.DefaultView(); + let win = match doc.GetDefaultView() { + None => return 0.0, + Some(win) => win, + }; // Step 5 if *self.root_element() == *self { @@ -1701,7 +1707,10 @@ impl ElementMethods for Element { } // Step 5 - let win = doc.DefaultView(); + let win = match doc.GetDefaultView() { + None => return, + Some(win) => win, + }; // Step 7 if *self.root_element() == *self { @@ -1739,7 +1748,10 @@ impl ElementMethods for Element { } // Step 3 - let win = doc.DefaultView(); + let win = match doc.GetDefaultView() { + None => return 0.0, + Some(win) => win, + }; // Step 5 if *self.root_element() == *self { @@ -1787,7 +1799,10 @@ impl ElementMethods for Element { } // Step 5 - let win = doc.DefaultView(); + let win = match doc.GetDefaultView() { + None => return, + Some(win) => win, + }; // Step 7 if *self.root_element() == *self { diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl index 0e5c7b661a6..6b365378c92 100644 --- a/components/script/dom/webidls/Document.webidl +++ b/components/script/dom/webidls/Document.webidl @@ -118,7 +118,7 @@ partial /*sealed*/ interface Document { // void writeln(DOMString... text); // user interaction - readonly attribute Window/*Proxy?*/ defaultView; + readonly attribute Window?/*Proxy?*/ defaultView; readonly attribute Element? activeElement; boolean hasFocus(); // attribute DOMString designMode; diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 63fed6cf115..eec1853239e 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -422,8 +422,10 @@ impl<'a> Drop for ScriptMemoryFailsafe<'a> { Some(owner) => { let context = owner.browsing_context.get(); for context in context.iter() { - let window = context.active_window(); - window.clear_js_runtime_for_script_deallocation(); + if let Some(document) = context.maybe_active_document() { + let window = document.window(); + window.clear_js_runtime_for_script_deallocation(); + } } } None => (), |