diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-01-30 17:15:20 +0100 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-04-26 10:17:46 +0200 |
commit | be06f1e9b346d16538ddac5dea468f346cb1f18c (patch) | |
tree | 865d3bd1a9566f094c8ca7136a313392f02ba2d4 /components/script/dom | |
parent | 2e5c0584637079889f4ed490b98afe07445f26d5 (diff) | |
download | servo-be06f1e9b346d16538ddac5dea468f346cb1f18c.tar.gz servo-be06f1e9b346d16538ddac5dea468f346cb1f18c.zip |
Always get browsing context from document
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/document.rs | 25 | ||||
-rw-r--r-- | components/script/dom/documentorshadowroot.rs | 21 | ||||
-rw-r--r-- | components/script/dom/shadowroot.rs | 24 |
3 files changed, 39 insertions, 31 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 3ed7082e4b5..31778542466 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -488,9 +488,14 @@ impl Document { self.has_browsing_context } + /// <https://html.spec.whatwg.org/multipage/#concept-document-bc> #[inline] pub fn browsing_context(&self) -> Option<DomRoot<WindowProxy>> { - self.document_or_shadow_root.browsing_context() + if self.has_browsing_context { + self.window.undiscarded_window_proxy() + } else { + None + } } #[inline] @@ -2622,7 +2627,7 @@ impl Document { let has_browsing_context = has_browsing_context == HasBrowsingContext::Yes; Document { node: Node::new_document_node(), - document_or_shadow_root: DocumentOrShadowRootImpl::new(window, has_browsing_context), + document_or_shadow_root: DocumentOrShadowRootImpl::new(window), window: Dom::from_ref(window), has_browsing_context, implementation: Default::default(), @@ -4263,14 +4268,22 @@ impl DocumentMethods for Document { // https://drafts.csswg.org/cssom-view/#dom-document-elementfrompoint fn ElementFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Option<DomRoot<Element>> { - self.document_or_shadow_root - .element_from_point(x, y, self.GetDocumentElement()) + self.document_or_shadow_root.element_from_point( + x, + y, + self.GetDocumentElement(), + self.has_browsing_context, + ) } // https://drafts.csswg.org/cssom-view/#dom-document-elementsfrompoint fn ElementsFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Vec<DomRoot<Element>> { - self.document_or_shadow_root - .elements_from_point(x, y, self.GetDocumentElement()) + self.document_or_shadow_root.elements_from_point( + x, + y, + self.GetDocumentElement(), + self.has_browsing_context, + ) } // https://html.spec.whatwg.org/multipage/#dom-document-open diff --git a/components/script/dom/documentorshadowroot.rs b/components/script/dom/documentorshadowroot.rs index 91ce83af659..5e413c5cc89 100644 --- a/components/script/dom/documentorshadowroot.rs +++ b/components/script/dom/documentorshadowroot.rs @@ -13,7 +13,6 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node; use crate::dom::shadowroot::ShadowRoot; use crate::dom::window::Window; -use crate::dom::windowproxy::WindowProxy; use euclid::Point2D; use js::jsapi::JS_GetRuntime; use script_layout_interface::message::{NodesFromPointQueryType, QueryMsg}; @@ -55,28 +54,16 @@ impl DocumentOrShadowRoot { #[must_root] #[derive(JSTraceable, MallocSizeOf)] pub struct DocumentOrShadowRootImpl { - has_browsing_context: bool, window: Dom<Window>, } impl DocumentOrShadowRootImpl { - pub fn new(window: &Window, has_browsing_context: bool) -> Self { + pub fn new(window: &Window) -> Self { Self { - has_browsing_context, window: Dom::from_ref(window), } } - /// <https://html.spec.whatwg.org/multipage/#concept-document-bc> - #[inline] - pub fn browsing_context(&self) -> Option<DomRoot<WindowProxy>> { - if self.has_browsing_context { - self.window.undiscarded_window_proxy() - } else { - None - } - } - pub fn nodes_from_point( &self, client_point: &Point2D<f32>, @@ -99,13 +86,14 @@ impl DocumentOrShadowRootImpl { x: Finite<f64>, y: Finite<f64>, document_element: Option<DomRoot<Element>>, + has_browsing_context: bool, ) -> Option<DomRoot<Element>> { let x = *x as f32; let y = *y as f32; let point = &Point2D::new(x, y); let viewport = self.window.window_size().initial_viewport; - if self.browsing_context().is_none() { + if has_browsing_context { return None; } @@ -138,13 +126,14 @@ impl DocumentOrShadowRootImpl { x: Finite<f64>, y: Finite<f64>, document_element: Option<DomRoot<Element>>, + has_browsing_context: bool, ) -> Vec<DomRoot<Element>> { let x = *x as f32; let y = *y as f32; let point = &Point2D::new(x, y); let viewport = self.window.window_size().initial_viewport; - if self.browsing_context().is_none() { + if has_browsing_context { return vec![]; } diff --git a/components/script/dom/shadowroot.rs b/components/script/dom/shadowroot.rs index a7a3bb693e5..e64401ab494 100644 --- a/components/script/dom/shadowroot.rs +++ b/components/script/dom/shadowroot.rs @@ -23,7 +23,7 @@ use dom_struct::dom_struct; pub struct ShadowRoot { document_fragment: DocumentFragment, document_or_shadow_root: DocumentOrShadowRootImpl, - has_browsing_context: bool, + document: Dom<Document>, host: Dom<Element>, stylesheet_list: MutNullableDom<StyleSheetList>, window: Dom<Window>, @@ -32,18 +32,14 @@ pub struct ShadowRoot { impl ShadowRoot { #[allow(unrooted_must_root)] fn new_inherited(host: &Element, document: &Document) -> ShadowRoot { - let has_browsing_context = true; let document_fragment = DocumentFragment::new_inherited(document); document_fragment .upcast::<Node>() .set_flag(NodeFlags::IS_IN_SHADOW_TREE, true); ShadowRoot { document_fragment, - document_or_shadow_root: DocumentOrShadowRootImpl::new( - document.window(), - has_browsing_context, - ), - has_browsing_context, + document_or_shadow_root: DocumentOrShadowRootImpl::new(document.window()), + document: Dom::from_ref(document), host: Dom::from_ref(host), stylesheet_list: MutNullableDom::new(None), window: Dom::from_ref(document.window()), @@ -85,14 +81,24 @@ impl ShadowRootMethods for ShadowRoot { fn ElementFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Option<DomRoot<Element>> { // XXX return the result of running the retargeting algorithm with context object // and the original result as input - self.document_or_shadow_root.element_from_point(x, y, None) + self.document_or_shadow_root.element_from_point( + x, + y, + None, + self.document.has_browsing_context(), + ) } // https://drafts.csswg.org/cssom-view/#dom-document-elementsfrompoint fn ElementsFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Vec<DomRoot<Element>> { // XXX return the result of running the retargeting algorithm with context object // and the original result as input - self.document_or_shadow_root.elements_from_point(x, y, None) + self.document_or_shadow_root.elements_from_point( + x, + y, + None, + self.document.has_browsing_context(), + ) } /// https://dom.spec.whatwg.org/#dom-shadowroot-mode |