mirror of
https://github.com/servo/servo.git
synced 2025-06-17 12:54:28 +00:00
Always get browsing context from document
This commit is contained in:
parent
2e5c058463
commit
be06f1e9b3
3 changed files with 39 additions and 31 deletions
|
@ -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
|
||||
|
|
|
@ -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![];
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue