script: Expose node helpers as NodeTraits and give more descriptive names (#34832)

This puts a few commonly used `Node` helpers into a trait (`NodeTraits`)
and gives them more descriptive names and documentation. The renames:

- `document_from_node` -> `NodeTraits::owner_document`
- `window_from_node` -> `NodeTraits::owner_window`
- `stylesheets_owner_from_node<T:` -> `NodeTraits::stylesheet_list_owner`
- `containing_shadow_root` -> `NodeTraits::containing_shadow_root`

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
Martin Robinson 2025-01-03 19:55:01 +01:00 committed by GitHub
parent 621ddd749c
commit e8f75c9aea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
66 changed files with 415 additions and 426 deletions

View file

@ -30,7 +30,7 @@ use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::DOMString;
use crate::dom::bindings::trace::NoTrace;
use crate::dom::event::Event;
use crate::dom::node::{from_untrusted_node_address, window_from_node, Node, NodeDamage};
use crate::dom::node::{from_untrusted_node_address, Node, NodeDamage, NodeTraits};
use crate::dom::transitionevent::TransitionEvent;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
@ -516,7 +516,7 @@ impl Animations {
DOMString::from(pseudo_element.to_css_string())
});
let elapsed_time = Finite::new(event.elapsed_time as f32).unwrap();
let window = window_from_node(&*node);
let window = node.owner_window();
if event.event_type.is_transition_event() {
let event_init = TransitionEventInit {

View file

@ -53,7 +53,7 @@ use crate::dom::element::{cors_setting_for_element, Element};
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlcanvaselement::{CanvasContext, HTMLCanvasElement};
use crate::dom::imagedata::ImageData;
use crate::dom::node::{window_from_node, Node, NodeDamage};
use crate::dom::node::{Node, NodeDamage, NodeTraits};
use crate::dom::offscreencanvas::{OffscreenCanvas, OffscreenCanvasContext};
use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope;
use crate::dom::textmetrics::TextMetrics;
@ -1086,7 +1086,7 @@ impl CanvasState {
None => return, // offscreen canvas doesn't have a placeholder canvas
};
let node = canvas.upcast::<Node>();
let window = window_from_node(canvas);
let window = canvas.owner_window();
let resolved_font_style =
match window.resolved_font_style_query(node, value.to_string(), can_gc) {
Some(value) => value,

View file

@ -37,7 +37,7 @@ use crate::dom::document::AnimationFrameCallback;
use crate::dom::element::Element;
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlscriptelement::SourceCode;
use crate::dom::node::{stylesheets_owner_from_node, window_from_node, Node, ShadowIncluding};
use crate::dom::node::{Node, NodeTraits, ShadowIncluding};
use crate::dom::types::HTMLElement;
use crate::realms::enter_realm;
use crate::script_module::ScriptFetchOptions;
@ -152,7 +152,7 @@ pub fn handle_get_children(
let inline: Vec<_> = parent
.children()
.map(|child| {
let window = window_from_node(&*child);
let window = child.owner_window();
let Some(elem) = child.downcast::<Element>() else {
return false;
};
@ -231,7 +231,7 @@ pub fn handle_get_stylesheet_style(
let document = documents.find_document(pipeline)?;
let _realm = enter_realm(document.window());
let owner = stylesheets_owner_from_node(&*node);
let owner = node.stylesheet_list_owner();
let stylesheet = owner.stylesheet_at(stylesheet)?;
let list = stylesheet.GetCssRules().ok()?;
@ -275,7 +275,7 @@ pub fn handle_get_selectors(
let document = documents.find_document(pipeline)?;
let _realm = enter_realm(document.window());
let owner = stylesheets_owner_from_node(&*node);
let owner = node.stylesheet_list_owner();
let rules = (0..owner.stylesheet_count())
.filter_map(|i| {
@ -312,7 +312,7 @@ pub fn handle_get_computed_style(
Some(found_node) => found_node,
};
let window = window_from_node(&*node);
let window = node.owner_window();
let elem = node
.downcast::<Element>()
.expect("This should be an element");
@ -353,7 +353,7 @@ pub fn handle_get_layout(
let width = rect.Width() as f32;
let height = rect.Height() as f32;
let window = window_from_node(&*node);
let window = node.owner_window();
let elem = node
.downcast::<Element>()
.expect("should be getting layout of element");

View file

@ -28,7 +28,7 @@ use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::DOMString;
use crate::dom::cssrule::CSSRule;
use crate::dom::element::Element;
use crate::dom::node::{document_from_node, stylesheets_owner_from_node, window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
@ -67,7 +67,7 @@ impl CSSStyleOwner {
let mut changed = true;
match *self {
CSSStyleOwner::Element(ref el) => {
let document = document_from_node(&**el);
let document = el.owner_document();
let shared_lock = document.style_shared_lock();
let mut attr = el.style_attribute().borrow_mut().take();
let result = if attr.is_some() {
@ -122,8 +122,7 @@ impl CSSStyleOwner {
// If this is changed, see also
// CSSStyleRule::SetSelectorText, which does the same thing.
if let Some(owner) = rule.parent_stylesheet().get_owner() {
stylesheets_owner_from_node(owner.upcast::<Node>())
.invalidate_stylesheets();
owner.stylesheet_list_owner().invalidate_stylesheets();
}
}
result
@ -138,7 +137,7 @@ impl CSSStyleOwner {
match *self {
CSSStyleOwner::Element(ref el) => match *el.style_attribute().borrow() {
Some(ref pdb) => {
let document = document_from_node(&**el);
let document = el.owner_document();
let guard = document.style_shared_lock().read();
f(pdb.read_with(&guard))
},
@ -156,14 +155,14 @@ impl CSSStyleOwner {
fn window(&self) -> DomRoot<Window> {
match *self {
CSSStyleOwner::Element(ref el) => window_from_node(&**el),
CSSStyleOwner::Element(ref el) => el.owner_window(),
CSSStyleOwner::CSSRule(ref rule, _) => DomRoot::from_ref(rule.global().as_window()),
}
}
fn base_url(&self) -> ServoUrl {
match *self {
CSSStyleOwner::Element(ref el) => window_from_node(&**el).Document().base_url(),
CSSStyleOwner::Element(ref el) => el.owner_document().base_url(),
CSSStyleOwner::CSSRule(ref rule, _) => ServoUrl::from(
rule.parent_stylesheet()
.style_stylesheet()
@ -259,7 +258,8 @@ impl CSSStyleDeclaration {
return DOMString::new();
}
let addr = node.to_trusted_node_address();
window_from_node(node).resolved_style_query(addr, self.pseudo, property, can_gc)
node.owner_window()
.resolved_style_query(addr, self.pseudo, property, can_gc)
},
}
}

View file

@ -20,7 +20,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::cssrule::{CSSRule, SpecificCSSRule};
use crate::dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner};
use crate::dom::cssstylesheet::CSSStyleSheet;
use crate::dom::node::{stylesheets_owner_from_node, Node};
use crate::dom::node::NodeTraits;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
@ -120,7 +120,7 @@ impl CSSStyleRuleMethods<crate::DomTypeHolder> for CSSStyleRule {
let stylerule = self.stylerule.write_with(&mut guard);
mem::swap(&mut stylerule.selectors, &mut s);
if let Some(owner) = self.cssrule.parent_stylesheet().get_owner() {
stylesheets_owner_from_node(owner.upcast::<Node>()).invalidate_stylesheets();
owner.stylesheet_list_owner().invalidate_stylesheets();
}
}
}

View file

@ -11,14 +11,13 @@ use style::stylesheets::{CssRuleTypes, Stylesheet as StyleStyleSheet};
use crate::dom::bindings::codegen::Bindings::CSSStyleSheetBinding::CSSStyleSheetMethods;
use crate::dom::bindings::error::{Error, ErrorResult, Fallible};
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::bindings::str::DOMString;
use crate::dom::cssrulelist::{CSSRuleList, RulesSource};
use crate::dom::element::Element;
use crate::dom::medialist::MediaList;
use crate::dom::node::{stylesheets_owner_from_node, Node};
use crate::dom::node::NodeTraits;
use crate::dom::stylesheet::StyleSheet;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
@ -86,7 +85,9 @@ impl CSSStyleSheet {
pub fn set_disabled(&self, disabled: bool) {
if self.style_stylesheet.set_disabled(disabled) && self.get_owner().is_some() {
stylesheets_owner_from_node(self.get_owner().unwrap().upcast::<Node>())
self.get_owner()
.unwrap()
.stylesheet_list_owner()
.invalidate_stylesheets();
}
}

View file

@ -43,7 +43,7 @@ use crate::dom::element::Element;
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlformelement::{FormControl, HTMLFormElement};
use crate::dom::node::{document_from_node, window_from_node, Node, ShadowIncluding};
use crate::dom::node::{Node, NodeTraits, ShadowIncluding};
use crate::dom::promise::Promise;
use crate::dom::window::Window;
use crate::microtask::Microtask;
@ -895,7 +895,7 @@ fn run_upgrade_constructor(
element: &Element,
can_gc: CanGc,
) -> ErrorResult {
let window = window_from_node(element);
let window = element.owner_window();
let cx = GlobalScope::get_cx();
rooted!(in(*cx) let constructor_val = ObjectValue(constructor.callback()));
rooted!(in(*cx) let mut element_val = UndefinedValue());
@ -954,7 +954,7 @@ fn run_upgrade_constructor(
/// <https://html.spec.whatwg.org/multipage/#concept-try-upgrade>
pub fn try_upgrade_element(element: &Element) {
// Step 1
let document = document_from_node(element);
let document = element.owner_document();
let namespace = element.namespace();
let local_name = element.local_name();
let is = element.get_is();

View file

@ -152,8 +152,7 @@ use crate::dom::location::Location;
use crate::dom::messageevent::MessageEvent;
use crate::dom::mouseevent::MouseEvent;
use crate::dom::node::{
self, document_from_node, window_from_node, CloneChildrenFlag, Node, NodeDamage, NodeFlags,
ShadowIncluding,
self, CloneChildrenFlag, Node, NodeDamage, NodeFlags, NodeTraits, ShadowIncluding,
};
use crate::dom::nodeiterator::NodeIterator;
use crate::dom::nodelist::NodeList;
@ -2261,7 +2260,7 @@ impl Document {
let iframes: Vec<_> = self.iframes().iter().collect();
for iframe in &iframes {
// TODO: handle the case of cross origin iframes.
let document = document_from_node(&**iframe);
let document = iframe.owner_document();
can_unload = document.prompt_to_unload(true, can_gc);
if !document.salvageable() {
self.salvageable.set(false);
@ -2333,7 +2332,7 @@ impl Document {
let iframes: Vec<_> = self.iframes().iter().collect();
for iframe in &iframes {
// TODO: handle the case of cross origin iframes.
let document = document_from_node(&**iframe);
let document = iframe.owner_document();
document.unload(true, can_gc);
if !document.salvageable() {
self.salvageable.set(false);
@ -2501,7 +2500,7 @@ impl Document {
// https://html.spec.whatwg.org/multipage/#shared-declarative-refresh-steps
document.window.upcast::<GlobalScope>().schedule_callback(
OneshotTimerCallback::RefreshRedirectDue(RefreshRedirectDue {
window: window_from_node(&*document),
window: DomRoot::from_ref(document.window()),
url: url.clone(),
}),
Duration::from_secs(*time),
@ -5314,7 +5313,7 @@ impl DocumentMethods<crate::DomTypeHolder> for Document {
// TODO: prompt to unload.
// TODO: set unload_event_start and unload_event_end
window_from_node(self).set_navigation_start();
self.window().set_navigation_start();
// Step 8
// TODO: https://github.com/servo/servo/issues/21937

View file

@ -18,7 +18,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::document::Document;
use crate::dom::element::Element;
use crate::dom::htmlcollection::HTMLCollection;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::nodelist::NodeList;
use crate::dom::virtualmethods::VirtualMethods;
use crate::dom::window::Window;
@ -77,7 +77,7 @@ impl DocumentFragmentMethods<crate::DomTypeHolder> for DocumentFragment {
// https://dom.spec.whatwg.org/#dom-parentnode-children
fn Children(&self) -> DomRoot<HTMLCollection> {
let window = window_from_node(self);
let window = self.owner_window();
HTMLCollection::children(&window, self.upcast())
}

View file

@ -10,7 +10,7 @@ use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::DOMString;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::window_from_node;
use crate::dom::node::NodeTraits;
use crate::script_runtime::CanGc;
#[dom_struct]
@ -28,10 +28,9 @@ impl DOMStringMap {
}
pub fn new(element: &HTMLElement) -> DomRoot<DOMStringMap> {
let window = window_from_node(element);
reflect_dom_object(
Box::new(DOMStringMap::new_inherited(element)),
&*window,
&*element.owner_window(),
CanGc::note(),
)
}

View file

@ -14,7 +14,7 @@ use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::DOMString;
use crate::dom::element::Element;
use crate::dom::node::window_from_node;
use crate::dom::node::NodeTraits;
use crate::script_runtime::CanGc;
#[dom_struct]
@ -46,14 +46,13 @@ impl DOMTokenList {
local_name: &LocalName,
supported_tokens: Option<Vec<Atom>>,
) -> DomRoot<DOMTokenList> {
let window = window_from_node(element);
reflect_dom_object(
Box::new(DOMTokenList::new_inherited(
element,
local_name.clone(),
supported_tokens,
)),
&*window,
&*element.owner_window(),
CanGc::note(),
)
}

View file

@ -137,8 +137,8 @@ use crate::dom::htmlvideoelement::{HTMLVideoElement, LayoutHTMLVideoElementHelpe
use crate::dom::mutationobserver::{Mutation, MutationObserver};
use crate::dom::namednodemap::NamedNodeMap;
use crate::dom::node::{
document_from_node, window_from_node, BindContext, ChildrenMutation, LayoutNodeHelpers, Node,
NodeDamage, NodeFlags, ShadowIncluding, UnbindContext,
BindContext, ChildrenMutation, LayoutNodeHelpers, Node, NodeDamage, NodeFlags, NodeTraits,
ShadowIncluding, UnbindContext,
};
use crate::dom::nodelist::NodeList;
use crate::dom::promise::Promise;
@ -1748,7 +1748,7 @@ impl Element {
};
let value = &**attr.value();
// XXXManishearth this doesn't handle `javascript:` urls properly
document_from_node(self)
self.owner_document()
.base_url()
.join(value)
.map(|parsed| USVString(parsed.into_string()))
@ -1972,7 +1972,7 @@ impl Element {
if let Some(template) = self.downcast::<HTMLTemplateElement>() {
template.Content(can_gc).upcast::<Node>().owner_doc()
} else {
document_from_node(self)
self.owner_document()
}
};
let fragment = DocumentFragment::new(&context_document, can_gc);
@ -2011,8 +2011,7 @@ impl Element {
if !self.is_connected() {
return false;
}
let document = document_from_node(self);
document.get_allow_fullscreen()
self.owner_document().get_allow_fullscreen()
}
// https://html.spec.whatwg.org/multipage/#home-subtree
@ -2088,8 +2087,7 @@ impl Element {
// https://html.spec.whatwg.org/multipage/#focus-fixup-rule
if !is_sequentially_focusable {
let document = document_from_node(self);
document.perform_focus_fixup_rule(self, can_gc);
self.owner_document().perform_focus_fixup_rule(self, can_gc);
}
}
@ -2176,7 +2174,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://dom.spec.whatwg.org/#dom-element-attributes
fn Attributes(&self) -> DomRoot<NamedNodeMap> {
self.attr_list
.or_init(|| NamedNodeMap::new(&window_from_node(self), self))
.or_init(|| NamedNodeMap::new(&self.owner_window(), self))
}
// https://dom.spec.whatwg.org/#dom-element-hasattributes
@ -2413,7 +2411,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://dom.spec.whatwg.org/#dom-element-getelementsbytagname
fn GetElementsByTagName(&self, localname: DOMString) -> DomRoot<HTMLCollection> {
let window = window_from_node(self);
let window = self.owner_window();
HTMLCollection::by_qualified_name(&window, self.upcast(), LocalName::from(&*localname))
}
@ -2423,19 +2421,19 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
maybe_ns: Option<DOMString>,
localname: DOMString,
) -> DomRoot<HTMLCollection> {
let window = window_from_node(self);
let window = self.owner_window();
HTMLCollection::by_tag_name_ns(&window, self.upcast(), localname, maybe_ns)
}
// https://dom.spec.whatwg.org/#dom-element-getelementsbyclassname
fn GetElementsByClassName(&self, classes: DOMString) -> DomRoot<HTMLCollection> {
let window = window_from_node(self);
let window = self.owner_window();
HTMLCollection::by_class_name(&window, self.upcast(), classes)
}
// https://drafts.csswg.org/cssom-view/#dom-element-getclientrects
fn GetClientRects(&self, can_gc: CanGc) -> DomRoot<DOMRectList> {
let win = window_from_node(self);
let win = self.owner_window();
let raw_rects = self.upcast::<Node>().content_boxes(can_gc);
let rects: Vec<DomRoot<DOMRect>> = raw_rects
.iter()
@ -2455,7 +2453,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://drafts.csswg.org/cssom-view/#dom-element-getboundingclientrect
fn GetBoundingClientRect(&self, can_gc: CanGc) -> DomRoot<DOMRect> {
let win = window_from_node(self);
let win = self.owner_window();
let rect = self.upcast::<Node>().bounding_content_box_or_zero(can_gc);
DOMRect::new(
win.upcast(),
@ -2749,7 +2747,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
self.local_name().clone(),
);
let result = if document_from_node(self).is_html_document() {
let result = if self.owner_document().is_html_document() {
self.upcast::<Node>()
.html_serialize(ChildrenOnly(Some(qname)))
} else {
@ -2792,7 +2790,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
/// <https://html.spec.whatwg.org/multipage/#dom-element-outerhtml>
fn GetOuterHTML(&self) -> Fallible<DOMString> {
let result = if document_from_node(self).is_html_document() {
let result = if self.owner_document().is_html_document() {
self.upcast::<Node>().html_serialize(IncludeNode)
} else {
self.upcast::<Node>().xml_serialize(XmlIncludeNode)
@ -2803,7 +2801,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
/// <https://html.spec.whatwg.org/multipage/#dom-element-outerhtml>
fn SetOuterHTML(&self, value: DOMString, can_gc: CanGc) -> ErrorResult {
let context_document = document_from_node(self);
let context_document = self.owner_document();
let context_node = self.upcast::<Node>();
// Step 1.
let context_parent = match context_node.GetParentNode() {
@ -2859,7 +2857,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://dom.spec.whatwg.org/#dom-parentnode-children
fn Children(&self) -> DomRoot<HTMLCollection> {
let window = window_from_node(self);
let window = self.owner_window();
HTMLCollection::children(&window, self.upcast())
}
@ -2930,7 +2928,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://dom.spec.whatwg.org/#dom-element-matches
fn Matches(&self, selectors: DOMString) -> Fallible<bool> {
let doc = document_from_node(self);
let doc = self.owner_document();
let url = doc.url();
let selectors = match SelectorParser::parse_author_origin_no_namespace(
&selectors,
@ -2953,7 +2951,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://dom.spec.whatwg.org/#dom-element-closest
fn Closest(&self, selectors: DOMString) -> Fallible<Option<DomRoot<Element>>> {
let doc = document_from_node(self);
let doc = self.owner_document();
let url = doc.url();
let selectors = match SelectorParser::parse_author_origin_no_namespace(
&selectors,
@ -2985,7 +2983,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://dom.spec.whatwg.org/#dom-element-insertadjacenttext
fn InsertAdjacentText(&self, where_: DOMString, data: DOMString, can_gc: CanGc) -> ErrorResult {
// Step 1.
let text = Text::new(data, &document_from_node(self), can_gc);
let text = Text::new(data, &self.owner_document(), can_gc);
// Step 2.
let where_ = where_.parse::<AdjacentPosition>()?;
@ -3055,7 +3053,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://fullscreen.spec.whatwg.org/#dom-element-requestfullscreen
fn RequestFullscreen(&self, can_gc: CanGc) -> Rc<Promise> {
let doc = document_from_node(self);
let doc = self.owner_document();
doc.enter_fullscreen(self, can_gc)
}
@ -3488,7 +3486,7 @@ impl VirtualMethods for Element {
attr.swap_value(&mut value);
block
} else {
let win = window_from_node(self);
let win = self.owner_window();
Arc::new(doc.style_shared_lock().wrap(parse_style_attribute(
&attr.value(),
&UrlExtraData(doc.base_url().get_arc()),
@ -3512,7 +3510,7 @@ impl VirtualMethods for Element {
None
}
});
let containing_shadow_root = self.upcast::<Node>().containing_shadow_root();
let containing_shadow_root = self.containing_shadow_root();
if node.is_connected() {
let value = attr.value().as_atom().clone();
match mutation {
@ -3614,7 +3612,7 @@ impl VirtualMethods for Element {
f.bind_form_control_to_tree();
}
let doc = document_from_node(self);
let doc = self.owner_document();
if let Some(ref shadow_root) = self.shadow_root() {
shadow_root.bind_to_tree(context);
@ -3627,14 +3625,14 @@ impl VirtualMethods for Element {
self.update_sequentially_focusable_status(CanGc::note());
if let Some(ref id) = *self.id_attribute.borrow() {
if let Some(shadow_root) = self.upcast::<Node>().containing_shadow_root() {
if let Some(shadow_root) = self.containing_shadow_root() {
shadow_root.register_element_id(self, id.clone());
} else {
doc.register_element_id(self, id.clone());
}
}
if let Some(ref name) = self.name_attribute() {
if self.upcast::<Node>().containing_shadow_root().is_none() {
if self.containing_shadow_root().is_none() {
doc.register_element_name(self, name.clone());
}
}
@ -3659,21 +3657,21 @@ impl VirtualMethods for Element {
self.update_sequentially_focusable_status(CanGc::note());
let doc = document_from_node(self);
let doc = self.owner_document();
let fullscreen = doc.GetFullscreenElement();
if fullscreen.as_deref() == Some(self) {
doc.exit_fullscreen(CanGc::note());
}
if let Some(ref value) = *self.id_attribute.borrow() {
if let Some(ref shadow_root) = self.upcast::<Node>().containing_shadow_root() {
if let Some(ref shadow_root) = self.containing_shadow_root() {
shadow_root.unregister_element_id(self, value.clone());
} else {
doc.unregister_element_id(self, value.clone());
}
}
if let Some(ref value) = self.name_attribute() {
if self.upcast::<Node>().containing_shadow_root().is_none() {
if self.containing_shadow_root().is_none() {
doc.unregister_element_name(self, value.clone());
}
}
@ -3711,7 +3709,7 @@ impl VirtualMethods for Element {
fn adopting_steps(&self, old_doc: &Document) {
self.super_type().unwrap().adopting_steps(old_doc);
if document_from_node(self).is_html_document() != old_doc.is_html_document() {
if self.owner_document().is_html_document() != old_doc.is_html_document() {
self.tag_name.clear();
}
}
@ -3737,8 +3735,7 @@ impl SelectorsElement for DomRoot<Element> {
}
fn containing_shadow_host(&self) -> Option<Self> {
self.upcast::<Node>()
.containing_shadow_root()
self.containing_shadow_root()
.map(|shadow_root| shadow_root.Host())
}
@ -4004,7 +4001,7 @@ impl Element {
rect.size = Size2D::<i32>::new(viewport_dimensions.width, viewport_dimensions.height);
}
self.ensure_rare_data().client_rect = Some(window_from_node(self).cache_layout_value(rect));
self.ensure_rare_data().client_rect = Some(self.owner_window().cache_layout_value(rect));
rect
}
@ -4282,7 +4279,7 @@ impl Element {
// https://html.spec.whatwg.org/multipage/#cannot-navigate
pub fn cannot_navigate(&self) -> bool {
let document = document_from_node(self);
let document = self.owner_document();
// Step 1.
!document.is_fully_active() ||
@ -4441,7 +4438,7 @@ impl TaskOnce for ElementPerformFullscreenEnter {
fn run_once(self) {
let element = self.element.root();
let promise = self.promise.root();
let document = document_from_node(&*element);
let document = element.owner_document();
// Step 7.1
if self.error || !element.fullscreen_element_ready_check() {
@ -4485,7 +4482,7 @@ impl TaskOnce for ElementPerformFullscreenExit {
#[allow(crown::unrooted_must_root)]
fn run_once(self) {
let element = self.element.root();
let document = document_from_node(&*element);
let document = element.owner_document();
// TODO Step 9.1-5
// Step 9.6
element.set_fullscreen_state(false);
@ -4548,7 +4545,7 @@ pub(crate) fn referrer_policy_for_element(element: &Element) -> ReferrerPolicy {
element
.get_attribute_by_name(DOMString::from_string(String::from("referrerpolicy")))
.map(|attribute: DomRoot<Attr>| determine_policy_for_token(&attribute.Value()))
.unwrap_or(document_from_node(element).get_referrer_policy())
.unwrap_or(element.owner_document().get_referrer_policy())
}
pub(crate) fn cors_setting_for_element(element: &Element) -> Option<CorsSettings> {

View file

@ -21,7 +21,7 @@ use crate::dom::element::Element;
use crate::dom::file::File;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlformelement::{FormDatum, FormDatumValue, HTMLFormElement};
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::nodelist::NodeList;
use crate::dom::validation::{is_barred_by_datalist_ancestor, Validatable};
use crate::dom::validitystate::{ValidationFlags, ValidityState};
@ -88,7 +88,7 @@ impl ElementInternals {
}
pub fn new(element: &HTMLElement) -> DomRoot<ElementInternals> {
let global = window_from_node(element);
let global = element.owner_window();
reflect_dom_object(
Box::new(ElementInternals::new_inherited(element)),
&*global,
@ -348,7 +348,7 @@ impl Validatable for ElementInternals {
debug_assert!(self.is_target_form_associated());
self.validity_state.or_init(|| {
ValidityState::new(
&window_from_node(self.target_element.upcast::<Node>()),
&self.target_element.owner_window(),
self.target_element.upcast(),
)
})

View file

@ -52,7 +52,7 @@ use crate::dom::errorevent::ErrorEvent;
use crate::dom::event::{Event, EventBubbles, EventCancelable, EventStatus};
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlformelement::FormControlElementHelpers;
use crate::dom::node::document_from_node;
use crate::dom::node::NodeTraits;
use crate::dom::virtualmethods::VirtualMethods;
use crate::dom::window::Window;
use crate::dom::workerglobalscope::WorkerGlobalScope;
@ -501,7 +501,7 @@ impl EventTarget {
// Step 3.1
let element = self.downcast::<Element>();
let document = match element {
Some(element) => document_from_node(element),
Some(element) => element.owner_document(),
None => self.downcast::<Window>().unwrap().Document(),
};

View file

@ -30,7 +30,7 @@ use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlimageelement::HTMLImageElement;
use crate::dom::mouseevent::MouseEvent;
use crate::dom::node::{document_from_node, BindContext, Node};
use crate::dom::node::{BindContext, Node, NodeTraits};
use crate::dom::urlhelper::UrlHelper;
use crate::dom::virtualmethods::VirtualMethods;
use crate::links::{follow_hyperlink, LinkRelations};
@ -95,7 +95,7 @@ impl HTMLAnchorElement {
// Step 3. Let url be the result of encoding-parsing a URL given this element's
// href content attribute's value, relative to this element's node document.
let document = document_from_node(self);
let document = self.owner_document();
let url = document.encoding_parse_a_url(&attribute.value());
// Step 4. If url is not failure, then set this element's url to url.

View file

@ -15,7 +15,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::document::Document;
use crate::dom::element::{AttributeMutation, Element};
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{document_from_node, BindContext, Node, UnbindContext};
use crate::dom::node::{BindContext, Node, NodeTraits, UnbindContext};
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -60,7 +60,7 @@ impl HTMLBaseElement {
"The frozen base url is only defined for base elements \
that have a base url.",
);
let document = document_from_node(self);
let document = self.owner_document();
let base = document.fallback_base_url();
let parsed = base.join(&href.value());
parsed.unwrap_or(base)
@ -74,7 +74,7 @@ impl HTMLBaseElement {
}
if self.upcast::<Element>().has_attribute(&local_name!("href")) {
let document = document_from_node(self);
let document = self.owner_document();
document.refresh_base_element();
}
}
@ -84,7 +84,7 @@ impl HTMLBaseElementMethods<crate::DomTypeHolder> for HTMLBaseElement {
// https://html.spec.whatwg.org/multipage/#dom-base-href
fn Href(&self) -> DOMString {
// Step 1.
let document = document_from_node(self);
let document = self.owner_document();
// Step 2.
let attr = self
@ -120,7 +120,7 @@ impl VirtualMethods for HTMLBaseElement {
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
self.super_type().unwrap().attribute_mutated(attr, mutation);
if *attr.local_name() == local_name!("href") {
document_from_node(self).refresh_base_element();
self.owner_document().refresh_base_element();
}
}

View file

@ -20,7 +20,7 @@ use crate::dom::document::Document;
use crate::dom::element::{AttributeMutation, Element, LayoutElementHelpers};
use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{document_from_node, window_from_node, BindContext, Node};
use crate::dom::node::{BindContext, Node, NodeTraits};
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -86,10 +86,8 @@ impl HTMLBodyElementMethods<crate::DomTypeHolder> for HTMLBodyElement {
// https://html.spec.whatwg.org/multipage/#dom-body-background
fn SetBackground(&self, input: DOMString, can_gc: CanGc) {
let value = AttrValue::from_resolved_url(
&document_from_node(self).base_url().get_arc(),
input.into(),
);
let value =
AttrValue::from_resolved_url(&self.owner_document().base_url().get_arc(), input.into());
self.upcast::<Element>()
.set_attribute(&local_name!("background"), value, can_gc);
}
@ -152,7 +150,7 @@ impl VirtualMethods for HTMLBodyElement {
return;
}
let window = window_from_node(self);
let window = self.owner_window();
window.prevent_layout_until_load_event();
if window.is_top_level() {
window.send_to_embedder(EmbedderMsg::HeadParsed);
@ -165,7 +163,7 @@ impl VirtualMethods for HTMLBodyElement {
AttrValue::from_legacy_color(value.into())
},
local_name!("background") => AttrValue::from_resolved_url(
&document_from_node(self).base_url().get_arc(),
&self.owner_document().base_url().get_arc(),
value.into(),
),
_ => self
@ -178,7 +176,7 @@ impl VirtualMethods for HTMLBodyElement {
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
let do_super_mutate = match (attr.local_name(), mutation) {
(name, AttributeMutation::Set(_)) if name.starts_with("on") => {
let window = window_from_node(self);
let window = self.owner_window();
// https://html.spec.whatwg.org/multipage/
// #event-handlers-on-elements,-document-objects,-and-window-objects:event-handlers-3
match name {

View file

@ -26,7 +26,7 @@ use crate::dom::htmlformelement::{
FormControl, FormDatum, FormDatumValue, FormSubmitterElement, HTMLFormElement, ResetFrom,
SubmittedFrom,
};
use crate::dom::node::{window_from_node, BindContext, Node, UnbindContext};
use crate::dom::node::{BindContext, Node, NodeTraits, UnbindContext};
use crate::dom::nodelist::NodeList;
use crate::dom::validation::{is_barred_by_datalist_ancestor, Validatable};
use crate::dom::validitystate::{ValidationFlags, ValidityState};
@ -333,7 +333,7 @@ impl Validatable for HTMLButtonElement {
fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state
.or_init(|| ValidityState::new(&window_from_node(self), self.upcast()))
.or_init(|| ValidityState::new(&self.owner_window(), self.upcast()))
}
fn is_instance_validatable(&self) -> bool {

View file

@ -48,7 +48,7 @@ use crate::dom::gpucanvascontext::GPUCanvasContext;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::mediastream::MediaStream;
use crate::dom::mediastreamtrack::MediaStreamTrack;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::virtualmethods::VirtualMethods;
use crate::dom::webgl2renderingcontext::WebGL2RenderingContext;
use crate::dom::webglrenderingcontext::WebGLRenderingContext;
@ -197,7 +197,7 @@ impl HTMLCanvasElement {
_ => None,
};
}
let window = window_from_node(self);
let window = self.owner_window();
let size = self.get_size();
let context = CanvasRenderingContext2D::new(window.upcast::<GlobalScope>(), self, size);
*self.context.borrow_mut() = Some(CanvasContext::Context2d(Dom::from_ref(&*context)));
@ -216,7 +216,7 @@ impl HTMLCanvasElement {
_ => None,
};
}
let window = window_from_node(self);
let window = self.owner_window();
let size = self.get_size();
let attrs = Self::get_gl_attributes(cx, options)?;
let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self));
@ -248,7 +248,7 @@ impl HTMLCanvasElement {
_ => None,
};
}
let window = window_from_node(self);
let window = self.owner_window();
let size = self.get_size();
let attrs = Self::get_gl_attributes(cx, options)?;
let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self));
@ -279,7 +279,7 @@ impl HTMLCanvasElement {
.recv()
.expect("Failed to get WebGPU channel")
.map(|channel| {
let window = window_from_node(self);
let window = self.owner_window();
let context = GPUCanvasContext::new(window.upcast::<GlobalScope>(), self, channel);
*self.context.borrow_mut() = Some(CanvasContext::WebGPU(Dom::from_ref(&*context)));
context

View file

@ -18,7 +18,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::bindings::trace::JSTraceable;
use crate::dom::bindings::xmlname::namespace_from_domstring;
use crate::dom::element::Element;
use crate::dom::node::{document_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
@ -282,7 +282,8 @@ impl HTMLCollection {
}
impl CollectionFilter for ClassNameFilter {
fn filter(&self, elem: &Element, _root: &Node) -> bool {
let case_sensitivity = document_from_node(elem)
let case_sensitivity = elem
.owner_document()
.quirks_mode()
.classes_and_ids_case_sensitivity();

View file

@ -13,7 +13,7 @@ use crate::dom::document::Document;
use crate::dom::htmlcollection::HTMLCollection;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmloptionelement::HTMLOptionElement;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::script_runtime::CanGc;
#[dom_struct]
@ -54,7 +54,7 @@ impl HTMLDataListElement {
impl HTMLDataListElementMethods<crate::DomTypeHolder> for HTMLDataListElement {
// https://html.spec.whatwg.org/multipage/#dom-datalist-options
fn Options(&self) -> DomRoot<HTMLCollection> {
HTMLCollection::new_with_filter_fn(&window_from_node(self), self.upcast(), |element, _| {
HTMLCollection::new_with_filter_fn(&self.owner_window(), self.upcast(), |element, _| {
element.is::<HTMLOptionElement>()
})
}

View file

@ -17,7 +17,7 @@ use crate::dom::document::Document;
use crate::dom::element::AttributeMutation;
use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{window_from_node, Node, NodeDamage};
use crate::dom::node::{Node, NodeDamage, NodeTraits};
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -82,7 +82,7 @@ impl VirtualMethods for HTMLDetailsElement {
let counter = self.toggle_counter.get() + 1;
self.toggle_counter.set(counter);
let window = window_from_node(self);
let window = self.owner_window();
let this = Trusted::new(self);
// FIXME(nox): Why are errors silenced here?
let _ = window.task_manager().dom_manipulation_task_source().queue(

View file

@ -15,7 +15,7 @@ use crate::dom::document::Document;
use crate::dom::element::Element;
use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::script_runtime::CanGc;
#[dom_struct]
@ -102,7 +102,7 @@ impl HTMLDialogElementMethods<crate::DomTypeHolder> for HTMLDialogElement {
fn Close(&self, return_value: Option<DOMString>) {
let element = self.upcast::<Element>();
let target = self.upcast::<EventTarget>();
let win = window_from_node(self);
let win = self.owner_window();
// Step 1 & 2
if element

View file

@ -46,9 +46,7 @@ use crate::dom::htmlhtmlelement::HTMLHtmlElement;
use crate::dom::htmlinputelement::{HTMLInputElement, InputType};
use crate::dom::htmllabelelement::HTMLLabelElement;
use crate::dom::htmltextareaelement::HTMLTextAreaElement;
use crate::dom::node::{
document_from_node, window_from_node, BindContext, Node, ShadowIncluding, UnbindContext,
};
use crate::dom::node::{BindContext, Node, NodeTraits, ShadowIncluding, UnbindContext};
use crate::dom::text::Text;
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -117,7 +115,7 @@ impl HTMLElement {
/// <https://html.spec.whatwg.org/multipage/#get-the-text-steps>
fn get_inner_outer_text(&self, can_gc: CanGc) -> DOMString {
let node = self.upcast::<Node>();
let window = window_from_node(node);
let window = node.owner_window();
let element = self.as_element();
// Step 1.
@ -139,7 +137,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#the-style-attribute
fn Style(&self) -> DomRoot<CSSStyleDeclaration> {
self.style_decl.or_init(|| {
let global = window_from_node(self);
let global = self.owner_window();
CSSStyleDeclaration::new(
&global,
CSSStyleOwner::Element(Dom::from_ref(self.upcast())),
@ -190,7 +188,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onerror
fn GetOnerror(&self, can_gc: CanGc) -> Option<Rc<OnErrorEventHandlerNonNull>> {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().GetOnerror()
} else {
@ -205,7 +203,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onerror
fn SetOnerror(&self, listener: Option<Rc<OnErrorEventHandlerNonNull>>) {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().SetOnerror(listener)
}
@ -219,7 +217,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onload
fn GetOnload(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().GetOnload()
} else {
@ -234,7 +232,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onload
fn SetOnload(&self, listener: Option<Rc<EventHandlerNonNull>>) {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().SetOnload(listener)
}
@ -247,7 +245,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onblur
fn GetOnblur(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().GetOnblur()
} else {
@ -262,7 +260,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onblur
fn SetOnblur(&self, listener: Option<Rc<EventHandlerNonNull>>) {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().SetOnblur(listener)
}
@ -275,7 +273,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onfocus
fn GetOnfocus(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().GetOnfocus()
} else {
@ -290,7 +288,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onfocus
fn SetOnfocus(&self, listener: Option<Rc<EventHandlerNonNull>>) {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().SetOnfocus(listener)
}
@ -303,7 +301,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onresize
fn GetOnresize(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().GetOnresize()
} else {
@ -318,7 +316,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onresize
fn SetOnresize(&self, listener: Option<Rc<EventHandlerNonNull>>) {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().SetOnresize(listener)
}
@ -331,7 +329,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onscroll
fn GetOnscroll(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().GetOnscroll()
} else {
@ -346,7 +344,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onscroll
fn SetOnscroll(&self, listener: Option<Rc<EventHandlerNonNull>>) {
if self.is_body_or_frameset() {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().SetOnscroll(listener)
}
@ -412,7 +410,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
fn Focus(&self, can_gc: CanGc) {
// TODO: Mark the element as locked for focus and run the focusing steps.
// https://html.spec.whatwg.org/multipage/#focusing-steps
let document = document_from_node(self);
let document = self.owner_document();
document.request_focus(Some(self.upcast()), FocusType::Element, can_gc);
}
@ -423,7 +421,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
return;
}
// https://html.spec.whatwg.org/multipage/#unfocusing-steps
let document = document_from_node(self);
let document = self.owner_document();
document.request_focus(None, FocusType::Element, can_gc);
}
@ -434,7 +432,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
}
let node = self.upcast::<Node>();
let window = window_from_node(self);
let window = self.owner_window();
let (element, _) = window.offset_parent_query(node, can_gc);
element
@ -447,7 +445,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
}
let node = self.upcast::<Node>();
let window = window_from_node(self);
let window = self.owner_window();
let (_, rect) = window.offset_parent_query(node, can_gc);
rect.origin.y.to_nearest_px()
@ -460,7 +458,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
}
let node = self.upcast::<Node>();
let window = window_from_node(self);
let window = self.owner_window();
let (_, rect) = window.offset_parent_query(node, can_gc);
rect.origin.x.to_nearest_px()
@ -469,7 +467,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetwidth
fn OffsetWidth(&self, can_gc: CanGc) -> i32 {
let node = self.upcast::<Node>();
let window = window_from_node(self);
let window = self.owner_window();
let (_, rect) = window.offset_parent_query(node, can_gc);
rect.size.width.to_nearest_px()
@ -478,7 +476,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetheight
fn OffsetHeight(&self, can_gc: CanGc) -> i32 {
let node = self.upcast::<Node>();
let window = window_from_node(self);
let window = self.owner_window();
let (_, rect) = window.offset_parent_query(node, can_gc);
rect.size.height.to_nearest_px()
@ -512,7 +510,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
};
let node = self.upcast::<Node>();
let document = document_from_node(self);
let document = self.owner_document();
// Step 2: Let next be this's next sibling.
let next = node.GetNextSibling();
@ -600,7 +598,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// Note: the element can pass this check without yet being a custom
// element, as long as there is a registered definition
// that could upgrade it to one later.
let registry = document_from_node(self).window().CustomElements();
let registry = self.owner_document().window().CustomElements();
let definition = registry.lookup_definition(self.as_element().local_name(), None);
// Step 3: If definition is null, then throw an "NotSupportedError" DOMException
@ -943,7 +941,7 @@ impl HTMLElement {
/// <https://html.spec.whatwg.org/multipage/#rendered-text-fragment>
fn rendered_text_fragment(&self, input: DOMString, can_gc: CanGc) -> DomRoot<DocumentFragment> {
// Step 1: Let fragment be a new DocumentFragment whose node document is document.
let document = document_from_node(self);
let document = self.owner_document();
let fragment = DocumentFragment::new(&document, can_gc);
// Step 2: Let position be a position variable for input, initially pointing at the start
@ -1036,7 +1034,7 @@ impl VirtualMethods for HTMLElement {
let evtarget = self.upcast::<EventTarget>();
let source_line = 1; //TODO(#9604) get current JS execution line
evtarget.set_event_handler_uncompiled(
window_from_node(self).get_url(),
self.owner_window().get_url(),
source_line,
&name[2..],
// FIXME(ajeffrey): Convert directly from AttrValue to DOMString

View file

@ -21,7 +21,7 @@ use crate::dom::htmlcollection::HTMLCollection;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlformelement::{FormControl, HTMLFormElement};
use crate::dom::htmllegendelement::HTMLLegendElement;
use crate::dom::node::{window_from_node, Node, ShadowIncluding};
use crate::dom::node::{Node, NodeTraits, ShadowIncluding};
use crate::dom::validation::Validatable;
use crate::dom::validitystate::ValidityState;
use crate::dom::virtualmethods::VirtualMethods;
@ -88,7 +88,7 @@ impl HTMLFieldSetElement {
impl HTMLFieldSetElementMethods<crate::DomTypeHolder> for HTMLFieldSetElement {
// https://html.spec.whatwg.org/multipage/#dom-fieldset-elements
fn Elements(&self) -> DomRoot<HTMLCollection> {
HTMLCollection::new_with_filter_fn(&window_from_node(self), self.upcast(), |element, _| {
HTMLCollection::new_with_filter_fn(&self.owner_window(), self.upcast(), |element, _| {
element
.downcast::<HTMLElement>()
.is_some_and(HTMLElement::is_listed_element)
@ -271,7 +271,7 @@ impl Validatable for HTMLFieldSetElement {
fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state
.or_init(|| ValidityState::new(&window_from_node(self), self.upcast()))
.or_init(|| ValidityState::new(&self.owner_window(), self.upcast()))
}
fn is_instance_validatable(&self) -> bool {

View file

@ -73,8 +73,7 @@ use crate::dom::htmloutputelement::HTMLOutputElement;
use crate::dom::htmlselectelement::HTMLSelectElement;
use crate::dom::htmltextareaelement::HTMLTextAreaElement;
use crate::dom::node::{
document_from_node, window_from_node, BindContext, Node, NodeFlags, UnbindContext,
VecPreOrderInsertionHelper,
BindContext, Node, NodeFlags, NodeTraits, UnbindContext, VecPreOrderInsertionHelper,
};
use crate::dom::nodelist::{NodeList, RadioListMode};
use crate::dom::radionodelist::RadioNodeList;
@ -421,7 +420,7 @@ impl HTMLFormElementMethods<crate::DomTypeHolder> for HTMLFormElement {
let filter = Box::new(ElementsFilter {
form: DomRoot::from_ref(self),
});
let window = window_from_node(self);
let window = self.owner_window();
HTMLFormControlsCollection::new(&window, self, filter)
}))
}
@ -439,7 +438,7 @@ impl HTMLFormElementMethods<crate::DomTypeHolder> for HTMLFormElement {
// https://html.spec.whatwg.org/multipage/#the-form-element%3Adetermine-the-value-of-a-named-property
fn NamedGetter(&self, name: DOMString) -> Option<RadioNodeListOrElement> {
let window = window_from_node(self);
let window = self.owner_window();
let name = Atom::from(name);
@ -687,7 +686,7 @@ impl HTMLFormElement {
}
// Step 1, 3
document_from_node(self).encoding()
self.owner_document().encoding()
}
// https://html.spec.whatwg.org/multipage/#text/plain-encoding-algorithm
@ -735,7 +734,7 @@ impl HTMLFormElement {
return;
}
// Step 3
let doc = document_from_node(self);
let doc = self.owner_document();
let base = doc.base_url();
// TODO: Handle browsing contexts (Step 4, 5)
// Step 6
@ -1220,7 +1219,7 @@ impl HTMLFormElement {
// Step 3-6
let ret = self.get_unclean_dataset(submitter, encoding);
let window = window_from_node(self);
let window = self.owner_window();
// Step 6
let form_data = FormData::new(Some(ret), &window.global(), can_gc);
@ -1543,7 +1542,7 @@ pub trait FormControl: DomObject {
let new_owner = if self.is_listed() && has_form_id && elem.is_connected() {
// Step 3
let doc = document_from_node(node);
let doc = node.owner_document();
let form_id = elem.get_string_attribute(&local_name!("form"));
doc.GetElementById(form_id)
.and_then(DomRoot::downcast::<HTMLFormElement>)
@ -1596,8 +1595,8 @@ pub trait FormControl: DomObject {
let node = elem.upcast::<Node>();
if self.is_listed() && !form_id.is_empty() && node.is_connected() {
let doc = document_from_node(node);
doc.register_form_id_listener(form_id, self);
node.owner_document()
.register_form_id_listener(form_id, self);
}
}
@ -1606,8 +1605,8 @@ pub trait FormControl: DomObject {
let form_id = elem.get_string_attribute(&local_name!("form"));
if self.is_listed() && !form_id.is_empty() {
let doc = document_from_node(elem.upcast::<Node>());
doc.unregister_form_id_listener(form_id, self);
elem.owner_document()
.unregister_form_id_listener(form_id, self);
}
}

View file

@ -12,7 +12,7 @@ use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{document_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::script_runtime::CanGc;
#[dom_struct]

View file

@ -14,7 +14,7 @@ use crate::dom::document::{determine_policy_for_token, Document};
use crate::dom::element::Element;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlmetaelement::HTMLMetaElement;
use crate::dom::node::{document_from_node, BindContext, Node, ShadowIncluding};
use crate::dom::node::{BindContext, Node, NodeTraits, ShadowIncluding};
use crate::dom::userscripts::load_script;
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -56,7 +56,7 @@ impl HTMLHeadElement {
/// <https://html.spec.whatwg.org/multipage/#meta-referrer>
pub fn set_document_referrer(&self) {
let doc = document_from_node(self);
let doc = self.owner_document();
if doc.GetHead().as_deref() != Some(self) {
return;
@ -87,7 +87,7 @@ impl HTMLHeadElement {
/// <https://html.spec.whatwg.org/multipage/#attr-meta-http-equiv-content-security-policy>
pub fn set_content_security_policy(&self) {
let doc = document_from_node(self);
let doc = self.owner_document();
if doc.GetHead().as_deref() != Some(self) {
return;

View file

@ -37,7 +37,7 @@ use crate::dom::element::{
use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{document_from_node, window_from_node, Node, NodeDamage, UnbindContext};
use crate::dom::node::{Node, NodeDamage, NodeTraits, UnbindContext};
use crate::dom::virtualmethods::VirtualMethods;
use crate::dom::windowproxy::WindowProxy;
use crate::script_runtime::CanGc;
@ -105,7 +105,7 @@ impl HTMLIFrameElement {
if url.is_empty() {
None
} else {
document_from_node(self).base_url().join(&url).ok()
self.owner_document().base_url().join(&url).ok()
}
})
.unwrap_or_else(|| ServoUrl::parse("about:blank").unwrap())
@ -148,7 +148,7 @@ impl HTMLIFrameElement {
Some(id) => id,
};
let document = document_from_node(self);
let document = self.owner_document();
{
let load_blocker = &self.load_blocker;
@ -180,7 +180,7 @@ impl HTMLIFrameElement {
},
};
let window = window_from_node(self);
let window = self.owner_window();
let old_pipeline_id = self.pipeline_id();
let new_pipeline_id = PipelineId::new();
self.pending_pipeline_id.set(Some(new_pipeline_id));
@ -256,8 +256,8 @@ impl HTMLIFrameElement {
.has_attribute(&local_name!("srcdoc"))
{
let url = ServoUrl::parse("about:srcdoc").unwrap();
let document = document_from_node(self);
let window = window_from_node(self);
let document = self.owner_document();
let window = self.owner_window();
let pipeline_id = Some(window.upcast::<GlobalScope>().pipeline_id());
let mut load_data = LoadData::new(
LoadOrigin::Script(document.origin().immutable().clone()),
@ -277,7 +277,7 @@ impl HTMLIFrameElement {
return;
}
let window = window_from_node(self);
let window = self.owner_window();
// https://html.spec.whatwg.org/multipage/#attr-iframe-name
// Note: the spec says to set the name 'when the nested browsing context is created'.
@ -307,7 +307,7 @@ impl HTMLIFrameElement {
// Step 2.4: Let referrerPolicy be the current state of element's referrerpolicy content
// attribute.
let document = document_from_node(self);
let document = self.owner_document();
let referrer_policy_token = self.ReferrerPolicy();
// Note: despite not being explicitly stated in the spec steps, this falls back to
@ -390,8 +390,8 @@ impl HTMLIFrameElement {
// compatible #4965](https://github.com/whatwg/html/issues/4965)
//
let url = ServoUrl::parse("about:blank").unwrap();
let document = document_from_node(self);
let window = window_from_node(self);
let document = self.owner_document();
let window = self.owner_window();
let pipeline_id = Some(window.upcast::<GlobalScope>().pipeline_id());
let load_data = LoadData::new(
LoadOrigin::Script(document.origin().immutable().clone()),
@ -763,7 +763,7 @@ impl VirtualMethods for HTMLIFrameElement {
LoadBlocker::terminate(blocker, CanGc::note());
// https://html.spec.whatwg.org/multipage/#a-browsing-context-is-discarded
let window = window_from_node(self);
let window = self.owner_window();
let (sender, receiver) =
ProfiledIpc::channel(self.global().time_profiler_chan().clone()).unwrap();

View file

@ -82,10 +82,7 @@ use crate::dom::htmlmapelement::HTMLMapElement;
use crate::dom::htmlpictureelement::HTMLPictureElement;
use crate::dom::htmlsourceelement::HTMLSourceElement;
use crate::dom::mouseevent::MouseEvent;
use crate::dom::node::{
document_from_node, window_from_node, BindContext, Node, NodeDamage, ShadowIncluding,
UnbindContext,
};
use crate::dom::node::{BindContext, Node, NodeDamage, NodeTraits, ShadowIncluding, UnbindContext};
use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::promise::Promise;
use crate::dom::values::UNSIGNED_LONG_MAX;
@ -357,7 +354,7 @@ pub(crate) fn image_fetch_request(
impl HTMLImageElement {
/// Update the current image with a valid URL.
fn fetch_image(&self, img_url: &ServoUrl, can_gc: CanGc) {
let window = window_from_node(self);
let window = self.owner_window();
let image_cache = window.image_cache();
let sender = generate_cache_listener_for_element(self);
let cache_result = image_cache.track_image(
@ -393,8 +390,8 @@ impl HTMLImageElement {
}
fn fetch_request(&self, img_url: &ServoUrl, id: PendingImageId) {
let document = document_from_node(self);
let window = window_from_node(self);
let document = self.owner_document();
let window = self.owner_window();
let context = ImageContext {
image_cache: window.image_cache(),
@ -691,7 +688,7 @@ impl HTMLImageElement {
source_size_list: &mut SourceSizeList,
_width: Option<Length>,
) -> Au {
let document = document_from_node(self);
let document = self.owner_document();
let quirks_mode = document.quirks_mode();
let result = source_size_list.evaluate(document.window().layout().device(), quirks_mode);
result
@ -699,7 +696,7 @@ impl HTMLImageElement {
/// <https://html.spec.whatwg.org/multipage/#matches-the-environment>
fn matches_environment(&self, media_query: String) -> bool {
let document = document_from_node(self);
let document = self.owner_document();
let quirks_mode = document.quirks_mode();
let document_url_data = UrlExtraData(document.url().get_arc());
// FIXME(emilio): This should do the same that we do for other media
@ -792,7 +789,8 @@ impl HTMLImageElement {
// Step 5
let mut best_candidate = max;
let device_pixel_ratio = document_from_node(self)
let device_pixel_ratio = self
.owner_document()
.window()
.window_size()
.device_pixel_ratio
@ -821,7 +819,7 @@ impl HTMLImageElement {
request.source_url = Some(src.clone());
request.image = None;
request.metadata = None;
let document = document_from_node(self);
let document = self.owner_document();
LoadBlocker::terminate(&request.blocker, can_gc);
*request.blocker.borrow_mut() =
Some(LoadBlocker::new(&document, LoadType::Image(url.clone())));
@ -882,7 +880,7 @@ impl HTMLImageElement {
/// Step 8-12 of html.spec.whatwg.org/multipage/#update-the-image-data
fn update_the_image_data_sync_steps(&self, can_gc: CanGc) {
let document = document_from_node(self);
let document = self.owner_document();
let window = document.window();
let task_source = window.task_manager().dom_manipulation_task_source();
let this = Trusted::new(self);
@ -949,7 +947,7 @@ impl HTMLImageElement {
/// <https://html.spec.whatwg.org/multipage/#update-the-image-data>
pub fn update_the_image_data(&self, can_gc: CanGc) {
let document = document_from_node(self);
let document = self.owner_document();
let window = document.window();
let elem = self.upcast::<Element>();
let src = elem.get_url_attribute(&local_name!("src"));
@ -1072,7 +1070,7 @@ impl HTMLImageElement {
let trusted_node = Trusted::new(elem);
let (responder_sender, responder_receiver) = ipc::channel().unwrap();
let window = window_from_node(elem);
let window = elem.owner_window();
let (task_source, canceller) = window
.task_manager()
.networking_task_source_with_canceller();
@ -1106,7 +1104,7 @@ impl HTMLImageElement {
}
let elem = self.upcast::<Element>();
let document = document_from_node(elem);
let document = elem.owner_document();
let has_pending_request = matches!(self.image_request.get(), ImageRequestPhase::Pending);
// Step 2
@ -1152,7 +1150,7 @@ impl HTMLImageElement {
can_gc,
);
let window = window_from_node(self);
let window = self.owner_window();
let image_cache = window.image_cache();
// Step 14
@ -1203,7 +1201,7 @@ impl HTMLImageElement {
// Step 2 for <https://html.spec.whatwg.org/multipage/#dom-img-decode>
fn react_to_decode_image_sync_steps(&self, promise: Rc<Promise>) {
let document = document_from_node(self);
let document = self.owner_document();
// Step 2.1 of <https://html.spec.whatwg.org/multipage/#dom-img-decode>
if !document.is_fully_active() ||
matches!(self.current_request.borrow().state, State::Broken)
@ -1233,7 +1231,7 @@ impl HTMLImageElement {
}
fn reject_image_decode_promises(&self) {
let document = document_from_node(self);
let document = self.owner_document();
for promise in self.image_decode_promises.borrow().iter() {
promise.reject_native(&DOMException::new(
&document.global(),
@ -1251,7 +1249,7 @@ impl HTMLImageElement {
selected_pixel_density: f64,
) {
let this = Trusted::new(self);
let window = window_from_node(self);
let window = self.owner_window();
let src = src.0;
let _ = window.task_manager().dom_manipulation_task_source().queue(
task!(image_load_event: move || {
@ -1369,7 +1367,8 @@ impl HTMLImageElement {
return None;
}
let useMapElements = document_from_node(self)
let useMapElements = self
.owner_document()
.upcast::<Node>()
.traverse_preorder(ShadowIncluding::No)
.filter_map(DomRoot::downcast::<HTMLMapElement>)
@ -1847,7 +1846,7 @@ impl VirtualMethods for HTMLImageElement {
if let Some(s) = self.super_type() {
s.bind_to_tree(context);
}
let document = document_from_node(self);
let document = self.owner_document();
if context.tree_connected {
document.register_responsive_image(self);
}
@ -1863,7 +1862,7 @@ impl VirtualMethods for HTMLImageElement {
fn unbind_from_tree(&self, context: &UnbindContext) {
self.super_type().unwrap().unbind_from_tree(context);
let document = document_from_node(self);
let document = self.owner_document();
document.unregister_responsive_image(self);
// The element is removed from a picture parent element

View file

@ -66,8 +66,7 @@ use crate::dom::htmlformelement::{
use crate::dom::keyboardevent::KeyboardEvent;
use crate::dom::mouseevent::MouseEvent;
use crate::dom::node::{
document_from_node, window_from_node, BindContext, CloneChildrenFlag, Node, NodeDamage,
ShadowIncluding, UnbindContext,
BindContext, CloneChildrenFlag, Node, NodeDamage, NodeTraits, ShadowIncluding, UnbindContext,
};
use crate::dom::nodelist::NodeList;
use crate::dom::textcontrol::{TextControlElement, TextControlSelection};
@ -1271,7 +1270,7 @@ impl HTMLInputElementMethods<crate::DomTypeHolder> for HTMLInputElement {
},
ValueMode::Filename => {
if value.is_empty() {
let window = window_from_node(self);
let window = self.owner_window();
let fl = FileList::new(&window, vec![]);
self.filelist.set(Some(&fl));
} else {
@ -1842,7 +1841,7 @@ impl HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#file-upload-state-(type=file)
// Select files by invoking UI or by passed in argument
fn select_files(&self, opt_test_paths: Option<Vec<DOMString>>, can_gc: CanGc) {
let window = window_from_node(self);
let window = self.owner_window();
let origin = get_blob_origin(&window.get_url());
let resource_threads = window.upcast::<GlobalScope>().resource_threads();
@ -2064,7 +2063,7 @@ impl HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#implicit-submission
#[allow(unsafe_code)]
fn implicit_submission(&self, can_gc: CanGc) {
let doc = document_from_node(self);
let doc = self.owner_document();
let node = doc.upcast::<Node>();
let owner = self.form_owner();
let form = match owner {
@ -2319,7 +2318,7 @@ impl VirtualMethods for HTMLInputElement {
}
if new_type == InputType::File {
let window = window_from_node(self);
let window = self.owner_window();
let filelist = FileList::new(&window, vec![]);
self.filelist.set(Some(&filelist));
}
@ -2532,7 +2531,7 @@ impl VirtualMethods for HTMLInputElement {
// the space key. There's no nice way to catch this so let's use this for
// now.
if let Some(point_in_target) = mouse_event.point_in_target() {
let window = window_from_node(self);
let window = self.owner_window();
let index = window.text_index_query(
self.upcast::<Node>(),
point_in_target,
@ -2577,7 +2576,7 @@ impl VirtualMethods for HTMLInputElement {
self.input_type().is_textual_or_password()
{
if event.IsTrusted() {
let window = window_from_node(self);
let window = self.owner_window();
window
.task_manager()
.user_interaction_task_source()
@ -2656,7 +2655,7 @@ impl Validatable for HTMLInputElement {
fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state
.or_init(|| ValidityState::new(&window_from_node(self), self.upcast()))
.or_init(|| ValidityState::new(&self.owner_window(), self.upcast()))
}
fn is_instance_validatable(&self) -> bool {
@ -2833,7 +2832,7 @@ impl Activatable for HTMLInputElement {
// Step 1: If the element does not have a form owner, then return.
if let Some(form_owner) = self.form_owner() {
// Step 2: If the element's node document is not fully active, then return.
let document = document_from_node(self);
let document = self.owner_document();
if !document.is_fully_active() {
return;
@ -2852,7 +2851,7 @@ impl Activatable for HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#reset-button-state-(type=reset):activation-behavior
// Step 1: If the element does not have a form owner, then return.
if let Some(form_owner) = self.form_owner() {
let document = document_from_node(self);
let document = self.owner_document();
// Step 2: If the element's node document is not fully active, then return.
if !document.is_fully_active() {

View file

@ -47,10 +47,7 @@ use crate::dom::element::{
ElementCreator,
};
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{
document_from_node, stylesheets_owner_from_node, window_from_node, BindContext, Node,
UnbindContext,
};
use crate::dom::node::{BindContext, Node, NodeTraits, UnbindContext};
use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::stylesheet::StyleSheet as DOMStyleSheet;
use crate::dom::virtualmethods::VirtualMethods;
@ -160,7 +157,7 @@ impl HTMLLinkElement {
// HTMLStyleElement::set_stylesheet.
#[allow(crown::unrooted_must_root)]
pub fn set_stylesheet(&self, s: Arc<Stylesheet>) {
let stylesheets_owner = stylesheets_owner_from_node(self);
let stylesheets_owner = self.stylesheet_list_owner();
if let Some(ref s) = *self.stylesheet.borrow() {
stylesheets_owner.remove_stylesheet(self.upcast(), s)
}
@ -177,7 +174,7 @@ impl HTMLLinkElement {
self.get_stylesheet().map(|sheet| {
self.cssom_stylesheet.or_init(|| {
CSSStyleSheet::new(
&window_from_node(self),
&self.owner_window(),
self.upcast::<Element>(),
"text/css".into(),
None, // todo handle location
@ -298,7 +295,8 @@ impl VirtualMethods for HTMLLinkElement {
if let Some(s) = self.stylesheet.borrow_mut().take() {
self.clean_stylesheet_ownership();
stylesheets_owner_from_node(self).remove_stylesheet(self.upcast(), &s);
self.stylesheet_list_owner()
.remove_stylesheet(self.upcast(), &s);
}
}
}
@ -391,7 +389,7 @@ impl HTMLLinkElement {
/// <https://html.spec.whatwg.org/multipage/#concept-link-obtain>
fn handle_stylesheet_url(&self, href: &str) {
let document = document_from_node(self);
let document = self.owner_document();
if document.browsing_context().is_none() {
return;
}
@ -463,7 +461,7 @@ impl HTMLLinkElement {
}
fn handle_favicon_url(&self, href: &str, _sizes: &Option<String>) {
let document = document_from_node(self);
let document = self.owner_document();
match document.base_url().join(href) {
Ok(url) => {
let window = document.window();

View file

@ -88,7 +88,7 @@ use crate::dom::htmlvideoelement::HTMLVideoElement;
use crate::dom::mediaerror::MediaError;
use crate::dom::mediafragmentparser::MediaFragmentParser;
use crate::dom::mediastream::MediaStream;
use crate::dom::node::{document_from_node, window_from_node, Node, NodeDamage, UnbindContext};
use crate::dom::node::{Node, NodeDamage, NodeTraits, UnbindContext};
use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::promise::Promise;
use crate::dom::shadowroot::IsUserAgentWidget;
@ -513,8 +513,7 @@ impl HTMLMediaElement {
pub fn delay_load_event(&self, delay: bool, can_gc: CanGc) {
let blocker = &self.delaying_the_load_event_flag;
if delay && blocker.borrow().is_none() {
*blocker.borrow_mut() =
Some(LoadBlocker::new(&document_from_node(self), LoadType::Media));
*blocker.borrow_mut() = Some(LoadBlocker::new(&self.owner_document(), LoadType::Media));
} else if !delay && blocker.borrow().is_some() {
LoadBlocker::terminate(blocker, can_gc);
}
@ -524,7 +523,7 @@ impl HTMLMediaElement {
fn time_marches_on(&self) {
// Step 6.
if Instant::now() > self.next_timeupdate_event.get() {
let window = window_from_node(self);
let window = self.owner_window();
window
.task_manager()
.media_element_task_source()
@ -548,7 +547,7 @@ impl HTMLMediaElement {
self.take_pending_play_promises(Err(Error::Abort));
// Step 2.3.
let window = window_from_node(self);
let window = self.owner_window();
let this = Trusted::new(self);
let generation_id = self.generation_id.get();
let _ = window.task_manager().media_element_task_source().queue(
@ -595,7 +594,7 @@ impl HTMLMediaElement {
self.take_pending_play_promises(Ok(()));
// Step 2.
let window = window_from_node(self);
let window = self.owner_window();
let this = Trusted::new(self);
let generation_id = self.generation_id.get();
// FIXME(nox): Why are errors silenced here?
@ -634,7 +633,7 @@ impl HTMLMediaElement {
return;
}
let window = window_from_node(self);
let window = self.owner_window();
let task_source = window.task_manager().media_element_task_source();
// Step 1.
@ -728,7 +727,7 @@ impl HTMLMediaElement {
// media element's node document when the src attribute was last
// changed, which is why we need to pass the base URL in the task
// right here.
let doc = document_from_node(self);
let doc = self.owner_document();
let task = MediaElementMicrotask::ResourceSelection {
elem: DomRoot::from_ref(self),
generation_id: self.generation_id.get(),
@ -788,7 +787,7 @@ impl HTMLMediaElement {
self.network_state.set(NetworkState::Loading);
// Step 8.
let window = window_from_node(self);
let window = self.owner_window();
window
.task_manager()
.media_element_task_source()
@ -870,7 +869,7 @@ impl HTMLMediaElement {
return;
}
let document = document_from_node(self);
let document = self.owner_document();
let destination = match self.media_type_id() {
HTMLMediaElementTypeId::HTMLAudioElement => Destination::Audio,
HTMLMediaElementTypeId::HTMLVideoElement => Destination::Video,
@ -910,7 +909,8 @@ impl HTMLMediaElement {
// TODO: If this is supposed to to be a "fetch" as defined in the specification
// this should probably be integrated into the Document's list of cancellable fetches.
document_from_node(self).fetch_background(request, listener, Some(cancel_receiver));
self.owner_document()
.fetch_background(request, listener, Some(cancel_receiver));
}
// https://html.spec.whatwg.org/multipage/#concept-media-load-resource
@ -937,7 +937,7 @@ impl HTMLMediaElement {
self.network_state.set(NetworkState::Idle);
// Step 4.remote.1.2.
let window = window_from_node(self);
let window = self.owner_window();
window
.task_manager()
.media_element_task_source()
@ -1007,7 +1007,7 @@ impl HTMLMediaElement {
///
/// [steps]: https://html.spec.whatwg.org/multipage/#dedicated-media-source-failure-steps
fn queue_dedicated_media_source_failure_steps(&self) {
let window = window_from_node(self);
let window = self.owner_window();
let this = Trusted::new(self);
let generation_id = self.generation_id.get();
self.take_pending_play_promises(Err(Error::NotSupported));
@ -1022,7 +1022,7 @@ impl HTMLMediaElement {
this.fulfill_in_flight_play_promises(|| {
// Step 1.
this.error.set(Some(&*MediaError::new(
&window_from_node(&*this),
&this.owner_window(),
MEDIA_ERR_SRC_NOT_SUPPORTED,
)));
@ -1058,7 +1058,7 @@ impl HTMLMediaElement {
}
fn queue_ratechange_event(&self) {
let window = window_from_node(self);
let window = self.owner_window();
let task_source = window.task_manager().media_element_task_source();
task_source.queue_simple_event(self.upcast(), atom!("ratechange"), &window);
}
@ -1110,7 +1110,7 @@ impl HTMLMediaElement {
self.fulfill_in_flight_play_promises(|| ());
}
let window = window_from_node(self);
let window = self.owner_window();
let task_source = window.task_manager().media_element_task_source();
// Step 5.
@ -1291,7 +1291,7 @@ impl HTMLMediaElement {
// servo-media with gstreamer does not support inaccurate seeking for now.
// Step 10.
let window = window_from_node(self);
let window = self.owner_window();
let task_source = window.task_manager().media_element_task_source();
task_source.queue_simple_event(self.upcast(), atom!("seeking"), &window);
@ -1316,7 +1316,7 @@ impl HTMLMediaElement {
self.time_marches_on();
// Step 16.
let window = window_from_node(self);
let window = self.owner_window();
let task_source = window.task_manager().media_element_task_source();
task_source.queue_simple_event(self.upcast(), atom!("timeupdate"), &window);
@ -1339,7 +1339,7 @@ impl HTMLMediaElement {
self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
if pref!(media.testing.enabled) {
let window = window_from_node(self);
let window = self.owner_window();
let task_source = window.task_manager().media_element_task_source();
task_source.queue_simple_event(self.upcast(), atom!("postershown"), &window);
}
@ -1360,7 +1360,7 @@ impl HTMLMediaElement {
_ => StreamType::Seekable,
};
let window = window_from_node(self);
let window = self.owner_window();
let (action_sender, action_receiver) = ipc::channel::<PlayerEvent>().unwrap();
let video_renderer: Option<Arc<Mutex<dyn VideoFrameRenderer>>> = match self.media_type_id()
{
@ -1513,7 +1513,7 @@ impl HTMLMediaElement {
// the HTMLMediaElementMethods::Ended method
// Step 3.
let window = window_from_node(self);
let window = self.owner_window();
let this = Trusted::new(self);
let _ = window.task_manager().media_element_task_source().queue(
@ -1548,7 +1548,7 @@ impl HTMLMediaElement {
PlaybackDirection::Backwards => {
if self.playback_position.get() <= self.earliest_possible_position() {
let window = window_from_node(self);
let window = self.owner_window();
window
.task_manager()
@ -1578,7 +1578,7 @@ impl HTMLMediaElement {
}
// 2. Set the error attribute to the result of creating a MediaError with MEDIA_ERR_DECODE.
self.error.set(Some(&*MediaError::new(
&window_from_node(self),
&self.owner_window(),
MEDIA_ERR_DECODE,
)));
@ -1611,7 +1611,7 @@ impl HTMLMediaElement {
0 => DOMString::from("main"),
_ => DOMString::new(),
};
let window = window_from_node(self);
let window = self.owner_window();
let audio_track = AudioTrack::new(
&window,
DOMString::new(),
@ -1670,7 +1670,7 @@ impl HTMLMediaElement {
0 => DOMString::from("main"),
_ => DOMString::new(),
};
let window = window_from_node(self);
let window = self.owner_window();
let video_track = VideoTrack::new(
&window,
DOMString::new(),
@ -1737,7 +1737,7 @@ impl HTMLMediaElement {
self.duration.set(f64::INFINITY);
}
if previous_duration != self.duration.get() {
let window = window_from_node(self);
let window = self.owner_window();
let task_source = window.task_manager().media_element_task_source();
task_source.queue_simple_event(self.upcast(), atom!("durationchange"), &window);
}
@ -1911,7 +1911,7 @@ impl HTMLMediaElement {
let shadow_root = element
.attach_shadow(IsUserAgentWidget::Yes, ShadowRootMode::Closed, false)
.unwrap();
let document = document_from_node(self);
let document = self.owner_document();
let script = HTMLScriptElement::new(
local_name!("script"),
None,
@ -1965,7 +1965,7 @@ impl HTMLMediaElement {
fn remove_controls(&self) {
if let Some(id) = self.media_controls_id.borrow_mut().take() {
document_from_node(self).unregister_media_controls(&id);
self.owner_document().unregister_media_controls(&id);
}
}
@ -2130,7 +2130,7 @@ impl HTMLMediaElementMethods<crate::DomTypeHolder> for HTMLMediaElement {
}
self.muted.set(value);
let window = window_from_node(self);
let window = self.owner_window();
window
.task_manager()
.media_element_task_source()
@ -2229,7 +2229,7 @@ impl HTMLMediaElementMethods<crate::DomTypeHolder> for HTMLMediaElement {
let state = self.ready_state.get();
let window = window_from_node(self);
let window = self.owner_window();
// FIXME(nox): Why are errors silenced here?
let task_source = window.task_manager().media_element_task_source();
if self.Paused() {
@ -2418,21 +2418,21 @@ impl HTMLMediaElementMethods<crate::DomTypeHolder> for HTMLMediaElement {
// https://html.spec.whatwg.org/multipage/#dom-media-audiotracks
fn AudioTracks(&self) -> DomRoot<AudioTrackList> {
let window = window_from_node(self);
let window = self.owner_window();
self.audio_tracks_list
.or_init(|| AudioTrackList::new(&window, &[], Some(self)))
}
// https://html.spec.whatwg.org/multipage/#dom-media-videotracks
fn VideoTracks(&self) -> DomRoot<VideoTrackList> {
let window = window_from_node(self);
let window = self.owner_window();
self.video_tracks_list
.or_init(|| VideoTrackList::new(&window, &[], Some(self)))
}
// https://html.spec.whatwg.org/multipage/#dom-media-texttracks
fn TextTracks(&self) -> DomRoot<TextTrackList> {
let window = window_from_node(self);
let window = self.owner_window();
self.text_tracks_list
.or_init(|| TextTrackList::new(&window, &[]))
}
@ -2444,7 +2444,7 @@ impl HTMLMediaElementMethods<crate::DomTypeHolder> for HTMLMediaElement {
label: DOMString,
language: DOMString,
) -> DomRoot<TextTrack> {
let window = window_from_node(self);
let window = self.owner_window();
// Step 1 & 2
// FIXME(#22314, dlrobertson) set the ready state to Loaded
let track = TextTrack::new(
@ -2478,7 +2478,7 @@ impl HTMLMediaElementMethods<crate::DomTypeHolder> for HTMLMediaElement {
if *value != self.volume.get() {
self.volume.set(*value);
let window = window_from_node(self);
let window = self.owner_window();
window
.task_manager()
.media_element_task_source()
@ -2809,7 +2809,7 @@ impl FetchResponseListener for HTMLMediaElementFetchListener {
// https://html.spec.whatwg.org/multipage/#concept-media-load-resource step 4,
// => "If mode is remote" step 2
if Instant::now() > self.next_progress_event {
let window = window_from_node(&*elem);
let window = elem.owner_window();
window
.task_manager()
.media_element_task_source()
@ -2880,7 +2880,7 @@ impl FetchResponseListener for HTMLMediaElementFetchListener {
// Step 2
elem.error.set(Some(&*MediaError::new(
&window_from_node(&*elem),
&elem.owner_window(),
MEDIA_ERR_NETWORK,
)));
@ -2925,7 +2925,7 @@ impl ResourceTimingListener for HTMLMediaElementFetchListener {
}
fn resource_timing_global(&self) -> DomRoot<GlobalScope> {
document_from_node(&*self.elem.root()).global()
self.elem.root().owner_document().global()
}
}

View file

@ -27,7 +27,7 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlheadelement::HTMLHeadElement;
use crate::dom::location::NavigationType;
use crate::dom::node::{document_from_node, window_from_node, BindContext, Node, UnbindContext};
use crate::dom::node::{BindContext, Node, NodeTraits, UnbindContext};
use crate::dom::virtualmethods::VirtualMethods;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
@ -146,7 +146,7 @@ impl HTMLMetaElement {
/// <https://html.spec.whatwg.org/multipage/#shared-declarative-refresh-steps>
fn shared_declarative_refresh_steps(&self, content: DOMString) {
// 1
let document = document_from_node(self);
let document = self.owner_document();
if document.will_declaratively_refresh() {
return;
}
@ -206,7 +206,7 @@ impl HTMLMetaElement {
// 12-13
if document.completely_loaded() {
// TODO: handle active sandboxing flag
let window = window_from_node(self);
let window = self.owner_window();
window.upcast::<GlobalScope>().schedule_callback(
OneshotTimerCallback::RefreshRedirectDue(RefreshRedirectDue {
window: window.clone(),

View file

@ -20,7 +20,7 @@ use crate::dom::document::Document;
use crate::dom::element::{AttributeMutation, Element};
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlformelement::{FormControl, HTMLFormElement};
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::validation::Validatable;
use crate::dom::validitystate::ValidityState;
use crate::dom::virtualmethods::VirtualMethods;
@ -139,7 +139,7 @@ impl Validatable for HTMLObjectElement {
fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state
.or_init(|| ValidityState::new(&window_from_node(self), self.upcast()))
.or_init(|| ValidityState::new(&self.owner_window(), self.upcast()))
}
fn is_instance_validatable(&self) -> bool {

View file

@ -24,7 +24,7 @@ use crate::dom::element::Element;
use crate::dom::htmlcollection::{CollectionFilter, HTMLCollection};
use crate::dom::htmloptionelement::HTMLOptionElement;
use crate::dom::htmlselectelement::HTMLSelectElement;
use crate::dom::node::{document_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
@ -57,7 +57,7 @@ impl HTMLOptionsCollection {
fn add_new_elements(&self, count: u32, can_gc: CanGc) -> ErrorResult {
let root = self.upcast().root_node();
let document = document_from_node(&*root);
let document = root.owner_document();
for _ in 0..count {
let element =

View file

@ -16,7 +16,7 @@ use crate::dom::document::Document;
use crate::dom::element::{AttributeMutation, Element};
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlformelement::{FormControl, HTMLFormElement};
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::nodelist::NodeList;
use crate::dom::validation::Validatable;
use crate::dom::validitystate::ValidityState;
@ -188,7 +188,7 @@ impl Validatable for HTMLOutputElement {
fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state
.or_init(|| ValidityState::new(&window_from_node(self), self.upcast()))
.or_init(|| ValidityState::new(&self.owner_window(), self.upcast()))
}
fn is_instance_validatable(&self) -> bool {

View file

@ -54,9 +54,7 @@ use crate::dom::element::{
use crate::dom::event::{Event, EventBubbles, EventCancelable, EventStatus};
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{
document_from_node, window_from_node, ChildrenMutation, CloneChildrenFlag, Node,
};
use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node, NodeTraits};
use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::virtualmethods::VirtualMethods;
use crate::fetch::create_a_potential_cors_request;
@ -343,7 +341,7 @@ fn finish_fetching_a_classic_script(
// Step 11, Asynchronously complete this algorithm with script,
// which refers to step 26.6 "When the chosen algorithm asynchronously completes",
// of https://html.spec.whatwg.org/multipage/#prepare-a-script
let document = document_from_node(elem);
let document = elem.owner_document();
match script_kind {
ExternalScriptKind::Asap => document.asap_script_loaded(elem, load),
@ -537,7 +535,7 @@ impl ResourceTimingListener for ClassicContext {
}
fn resource_timing_global(&self) -> DomRoot<GlobalScope> {
document_from_node(&*self.elem.root()).global()
self.elem.root().owner_document().global()
}
}
@ -578,7 +576,7 @@ fn fetch_a_classic_script(
character_encoding: &'static Encoding,
) {
// Step 1, 2.
let doc = document_from_node(script);
let doc = script.owner_document();
let request = script_fetch_request(
url.clone(),
cors_setting,
@ -652,7 +650,7 @@ impl HTMLScriptElement {
self.already_started.set(true);
// Step 12.
let doc = document_from_node(self);
let doc = self.owner_document();
if self.parser_inserted.get() && *self.parser_document != *doc {
return;
}
@ -916,7 +914,7 @@ impl HTMLScriptElement {
/// <https://html.spec.whatwg.org/multipage/#execute-the-script-block>
pub fn execute(&self, result: ScriptResult) {
// Step 1.
let doc = document_from_node(self);
let doc = self.owner_document();
if self.parser_inserted.get() && *doc != *self.parser_document {
return;
}
@ -940,7 +938,7 @@ impl HTMLScriptElement {
// Step 3.
let neutralized_doc = if script.external || script.type_ == ScriptType::Module {
debug!("loading external script, url = {}", script.url);
let doc = document_from_node(self);
let doc = self.owner_document();
doc.incr_ignore_destructive_writes_counter();
Some(doc)
} else {
@ -948,7 +946,7 @@ impl HTMLScriptElement {
};
// Step 4.
let document = document_from_node(self);
let document = self.owner_document();
let old_script = document.GetCurrentScript();
match script.type_ {
@ -982,13 +980,13 @@ impl HTMLScriptElement {
pub fn run_a_classic_script(&self, script: &ScriptOrigin, can_gc: CanGc) {
// TODO use a settings object rather than this element's document/window
// Step 2
let document = document_from_node(self);
let document = self.owner_document();
if !document.is_fully_active() || !document.is_scripting_enabled() {
return;
}
// Steps 4-10
let window = window_from_node(self);
let window = self.owner_window();
let line_number = if script.external {
1
} else {
@ -1012,13 +1010,13 @@ impl HTMLScriptElement {
pub fn run_a_module_script(&self, script: &ScriptOrigin, _rethrow_errors: bool, can_gc: CanGc) {
// TODO use a settings object rather than this element's document/window
// Step 2
let document = document_from_node(self);
let document = self.owner_document();
if !document.is_fully_active() || !document.is_scripting_enabled() {
return;
}
// Step 4
let window = window_from_node(self);
let window = self.owner_window();
let global = window.upcast::<GlobalScope>();
let _aes = AutoEntryScript::new(global);
@ -1063,7 +1061,7 @@ impl HTMLScriptElement {
}
pub fn queue_error_event(&self) {
let window = window_from_node(self);
let window = self.owner_window();
window
.task_manager()
.dom_manipulation_task_source()
@ -1165,7 +1163,7 @@ impl HTMLScriptElement {
cancelable: EventCancelable,
can_gc: CanGc,
) -> EventStatus {
let window = window_from_node(self);
let window = self.owner_window();
let event = Event::new(window.upcast(), type_, bubbles, cancelable, can_gc);
event.fire(self.upcast(), can_gc)
}
@ -1198,10 +1196,11 @@ impl VirtualMethods for HTMLScriptElement {
// This method can be invoked while there are script/layout blockers present
// as DOM mutations have not yet settled. We use a delayed task to avoid
// running any scripts until the DOM tree is safe for interactions.
document_from_node(self).add_delayed_task(task!(ScriptPrepare: move || {
let this = script.root();
this.prepare(CanGc::note());
}));
self.owner_document()
.add_delayed_task(task!(ScriptPrepare: move || {
let this = script.root();
this.prepare(CanGc::note());
}));
}
}

View file

@ -34,7 +34,7 @@ use crate::dom::htmlformelement::{FormControl, FormDatum, FormDatumValue, HTMLFo
use crate::dom::htmloptgroupelement::HTMLOptGroupElement;
use crate::dom::htmloptionelement::HTMLOptionElement;
use crate::dom::htmloptionscollection::HTMLOptionsCollection;
use crate::dom::node::{window_from_node, BindContext, Node, UnbindContext};
use crate::dom::node::{BindContext, Node, NodeTraits, UnbindContext};
use crate::dom::nodelist::NodeList;
use crate::dom::validation::{is_barred_by_datalist_ancestor, Validatable};
use crate::dom::validitystate::{ValidationFlags, ValidityState};
@ -279,7 +279,7 @@ impl HTMLSelectElementMethods<crate::DomTypeHolder> for HTMLSelectElement {
// https://html.spec.whatwg.org/multipage/#dom-select-options
fn Options(&self) -> DomRoot<HTMLOptionsCollection> {
self.options.or_init(|| {
let window = window_from_node(self);
let window = self.owner_window();
HTMLOptionsCollection::new(&window, self, Box::new(OptionsFilter))
})
}
@ -510,7 +510,7 @@ impl Validatable for HTMLSelectElement {
fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state
.or_init(|| ValidityState::new(&window_from_node(self), self.upcast()))
.or_init(|| ValidityState::new(&self.owner_window(), self.upcast()))
}
fn is_instance_validatable(&self) -> bool {

View file

@ -24,10 +24,7 @@ use crate::dom::cssstylesheet::CSSStyleSheet;
use crate::dom::document::Document;
use crate::dom::element::{Element, ElementCreator};
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{
document_from_node, stylesheets_owner_from_node, window_from_node, BindContext,
ChildrenMutation, Node, UnbindContext,
};
use crate::dom::node::{BindContext, ChildrenMutation, Node, NodeTraits, UnbindContext};
use crate::dom::stylesheet::StyleSheet as DOMStyleSheet;
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -91,8 +88,8 @@ impl HTMLStyleElement {
let element = self.upcast::<Element>();
assert!(node.is_connected());
let window = window_from_node(node);
let doc = document_from_node(self);
let window = node.owner_window();
let doc = self.owner_document();
let mq_attribute = element.get_attribute(&ns!(), &local_name!("media"));
let mq_str = match mq_attribute {
@ -136,7 +133,7 @@ impl HTMLStyleElement {
// No subresource loads were triggered, queue load event
if self.pending_loads.get() == 0 {
let window = window_from_node(self);
let window = self.owner_window();
window
.task_manager()
.dom_manipulation_task_source()
@ -149,7 +146,7 @@ impl HTMLStyleElement {
// FIXME(emilio): This is duplicated with HTMLLinkElement::set_stylesheet.
#[allow(crown::unrooted_must_root)]
pub fn set_stylesheet(&self, s: Arc<Stylesheet>) {
let stylesheets_owner = stylesheets_owner_from_node(self);
let stylesheets_owner = self.stylesheet_list_owner();
if let Some(ref s) = *self.stylesheet.borrow() {
stylesheets_owner.remove_stylesheet(self.upcast(), s)
}
@ -166,7 +163,7 @@ impl HTMLStyleElement {
self.get_stylesheet().map(|sheet| {
self.cssom_stylesheet.or_init(|| {
CSSStyleSheet::new(
&window_from_node(self),
&self.owner_window(),
self.upcast::<Element>(),
"text/css".into(),
None, // todo handle location
@ -235,7 +232,8 @@ impl VirtualMethods for HTMLStyleElement {
if context.tree_connected {
if let Some(s) = self.stylesheet.borrow_mut().take() {
self.clean_stylesheet_ownership();
stylesheets_owner_from_node(self).remove_stylesheet(self.upcast(), &s)
self.stylesheet_list_owner()
.remove_stylesheet(self.upcast(), &s)
}
}
}

View file

@ -26,7 +26,7 @@ use crate::dom::htmltablecaptionelement::HTMLTableCaptionElement;
use crate::dom::htmltablecolelement::HTMLTableColElement;
use crate::dom::htmltablerowelement::HTMLTableRowElement;
use crate::dom::htmltablesectionelement::HTMLTableSectionElement;
use crate::dom::node::{document_from_node, window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -149,13 +149,8 @@ impl HTMLTableElement {
return section;
}
let section = HTMLTableSectionElement::new(
atom.clone(),
None,
&document_from_node(self),
None,
can_gc,
);
let section =
HTMLTableSectionElement::new(atom.clone(), None, &self.owner_document(), None, can_gc);
match *atom {
local_name!("thead") => self.SetTHead(Some(&section)),
local_name!("tfoot") => self.SetTFoot(Some(&section)),
@ -192,7 +187,7 @@ impl HTMLTableElementMethods<crate::DomTypeHolder> for HTMLTableElement {
// https://html.spec.whatwg.org/multipage/#dom-table-rows
fn Rows(&self) -> DomRoot<HTMLCollection> {
let filter = self.get_rows();
HTMLCollection::new(&window_from_node(self), self.upcast(), Box::new(filter))
HTMLCollection::new(&self.owner_window(), self.upcast(), Box::new(filter))
}
// https://html.spec.whatwg.org/multipage/#dom-table-caption
@ -225,7 +220,7 @@ impl HTMLTableElementMethods<crate::DomTypeHolder> for HTMLTableElement {
let caption = HTMLTableCaptionElement::new(
local_name!("caption"),
None,
&document_from_node(self),
&self.owner_document(),
None,
can_gc,
);
@ -302,7 +297,7 @@ impl HTMLTableElementMethods<crate::DomTypeHolder> for HTMLTableElement {
fn TBodies(&self) -> DomRoot<HTMLCollection> {
self.tbodies.or_init(|| {
HTMLCollection::new_with_filter_fn(
&window_from_node(self),
&self.owner_window(),
self.upcast(),
|element, root| {
element.is::<HTMLTableSectionElement>() &&
@ -318,7 +313,7 @@ impl HTMLTableElementMethods<crate::DomTypeHolder> for HTMLTableElement {
let tbody = HTMLTableSectionElement::new(
local_name!("tbody"),
None,
&document_from_node(self),
&self.owner_document(),
None,
can_gc,
);
@ -346,7 +341,7 @@ impl HTMLTableElementMethods<crate::DomTypeHolder> for HTMLTableElement {
let new_row = HTMLTableRowElement::new(
local_name!("tr"),
None,
&document_from_node(self),
&self.owner_document(),
None,
can_gc,
);

View file

@ -23,7 +23,7 @@ use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmltablecellelement::HTMLTableCellElement;
use crate::dom::htmltableelement::HTMLTableElement;
use crate::dom::htmltablesectionelement::HTMLTableSectionElement;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -87,7 +87,7 @@ impl HTMLTableRowElementMethods<crate::DomTypeHolder> for HTMLTableRowElement {
fn Cells(&self) -> DomRoot<HTMLCollection> {
self.cells.or_init(|| {
HTMLCollection::new_with_filter_fn(
&window_from_node(self),
&self.owner_window(),
self.upcast(),
|element, root| {
(element.is::<HTMLTableCellElement>()) &&

View file

@ -19,7 +19,7 @@ use crate::dom::element::{Element, LayoutElementHelpers};
use crate::dom::htmlcollection::HTMLCollection;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmltablerowelement::HTMLTableRowElement;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -64,14 +64,10 @@ impl HTMLTableSectionElement {
impl HTMLTableSectionElementMethods<crate::DomTypeHolder> for HTMLTableSectionElement {
// https://html.spec.whatwg.org/multipage/#dom-tbody-rows
fn Rows(&self) -> DomRoot<HTMLCollection> {
HTMLCollection::new_with_filter_fn(
&window_from_node(self),
self.upcast(),
|element, root| {
element.is::<HTMLTableRowElement>() &&
element.upcast::<Node>().GetParentNode().as_deref() == Some(root)
},
)
HTMLCollection::new_with_filter_fn(&self.owner_window(), self.upcast(), |element, root| {
element.is::<HTMLTableRowElement>() &&
element.upcast::<Node>().GetParentNode().as_deref() == Some(root)
})
}
// https://html.spec.whatwg.org/multipage/#dom-tbody-insertrow

View file

@ -14,7 +14,7 @@ use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::document::Document;
use crate::dom::documentfragment::DocumentFragment;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{document_from_node, CloneChildrenFlag, Node};
use crate::dom::node::{CloneChildrenFlag, Node, NodeTraits};
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -64,7 +64,7 @@ impl HTMLTemplateElementMethods<crate::DomTypeHolder> for HTMLTemplateElement {
/// <https://html.spec.whatwg.org/multipage/#dom-template-content>
fn Content(&self, can_gc: CanGc) -> DomRoot<DocumentFragment> {
self.contents.or_init(|| {
let doc = document_from_node(self);
let doc = self.owner_document();
doc.appropriate_template_contents_owner_document(can_gc)
.CreateDocumentFragment(can_gc)
})
@ -80,8 +80,9 @@ impl VirtualMethods for HTMLTemplateElement {
fn adopting_steps(&self, old_doc: &Document) {
self.super_type().unwrap().adopting_steps(old_doc);
// Step 1.
let doc =
document_from_node(self).appropriate_template_contents_owner_document(CanGc::note());
let doc = self
.owner_document()
.appropriate_template_contents_owner_document(CanGc::note());
// Step 2.
Node::adopt(self.Content(CanGc::note()).upcast(), &doc);
}

View file

@ -34,8 +34,7 @@ use crate::dom::htmlformelement::{FormControl, HTMLFormElement};
use crate::dom::htmlinputelement::HTMLInputElement;
use crate::dom::keyboardevent::KeyboardEvent;
use crate::dom::node::{
window_from_node, BindContext, ChildrenMutation, CloneChildrenFlag, Node, NodeDamage,
UnbindContext,
BindContext, ChildrenMutation, CloneChildrenFlag, Node, NodeDamage, NodeTraits, UnbindContext,
};
use crate::dom::nodelist::NodeList;
use crate::dom::textcontrol::{TextControlElement, TextControlSelection};
@ -651,7 +650,7 @@ impl VirtualMethods for HTMLTextAreaElement {
}
} else if event.type_() == atom!("keypress") && !event.DefaultPrevented() {
if event.IsTrusted() {
let window = window_from_node(self);
let window = self.owner_window();
window
.task_manager()
.user_interaction_task_source()
@ -714,7 +713,7 @@ impl Validatable for HTMLTextAreaElement {
fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state
.or_init(|| ValidityState::new(&window_from_node(self), self.upcast()))
.or_init(|| ValidityState::new(&self.owner_window(), self.upcast()))
}
fn is_instance_validatable(&self) -> bool {

View file

@ -37,7 +37,7 @@ use crate::dom::document::Document;
use crate::dom::element::{AttributeMutation, Element, LayoutElementHelpers};
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlmediaelement::{HTMLMediaElement, ReadyState};
use crate::dom::node::{document_from_node, window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::virtualmethods::VirtualMethods;
use crate::fetch::FetchCanceller;
@ -125,7 +125,7 @@ impl HTMLVideoElement {
let sent_resize = if self.htmlmediaelement.get_ready_state() == ReadyState::HaveNothing {
None
} else {
let window = window_from_node(self);
let window = self.owner_window();
let task_source = window.task_manager().media_element_task_source();
task_source.queue_simple_event(self.upcast(), atom!("resize"), &window);
Some((width, height))
@ -168,7 +168,7 @@ impl HTMLVideoElement {
}
// Step 3.
let poster_url = match document_from_node(self).url().join(poster_url) {
let poster_url = match self.owner_document().url().join(poster_url) {
Ok(url) => url,
Err(_) => return,
};
@ -176,7 +176,7 @@ impl HTMLVideoElement {
// Step 4.
// We use the image cache for poster frames so we save as much
// network activity as possible.
let window = window_from_node(self);
let window = self.owner_window();
let image_cache = window.image_cache();
let sender = generate_cache_listener_for_element(self);
let cache_result = image_cache.track_image(
@ -211,7 +211,7 @@ impl HTMLVideoElement {
can_gc: CanGc,
) {
// Continuation of step 4.
let document = document_from_node(self);
let document = self.owner_document();
let request = RequestBuilder::new(poster_url.clone(), document.global().get_referrer())
.destination(Destination::Image)
.credentials_mode(CredentialsMode::Include)
@ -228,7 +228,7 @@ impl HTMLVideoElement {
let blocker = &self.load_blocker;
LoadBlocker::terminate(blocker, can_gc);
*blocker.borrow_mut() = Some(LoadBlocker::new(
&document_from_node(self),
&self.owner_document(),
LoadType::Image(poster_url.clone()),
));
@ -236,7 +236,8 @@ impl HTMLVideoElement {
// TODO: If this is supposed to to be a "fetch" as defined in the specification
// this should probably be integrated into the Document's list of cancellable fetches.
document_from_node(self).fetch_background(request, context, Some(cancel_receiver));
self.owner_document()
.fetch_background(request, context, Some(cancel_receiver));
}
}
@ -418,7 +419,7 @@ impl ResourceTimingListener for PosterFrameFetchContext {
}
fn resource_timing_global(&self) -> DomRoot<GlobalScope> {
document_from_node(&*self.elem.root()).global()
self.elem.root().owner_document().global()
}
}
@ -430,7 +431,7 @@ impl PreInvoke for PosterFrameFetchContext {
impl PosterFrameFetchContext {
fn new(elem: &HTMLVideoElement, url: ServoUrl, id: PendingImageId) -> PosterFrameFetchContext {
let window = window_from_node(elem);
let window = elem.owner_window();
PosterFrameFetchContext {
image_cache: window.image_cache(),
elem: Trusted::new(elem),

View file

@ -128,7 +128,7 @@ macro_rules! make_form_action_getter(
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
let element = self.upcast::<Element>();
let doc = $crate::dom::node::document_from_node(self);
let doc = $crate::dom::node::NodeTraits::owner_document(self);
let attr = element.get_attribute(&html5ever::ns!(), &html5ever::local_name!($htmlname));
let value = attr.as_ref().map(|attr| attr.value());
let value = match value {
@ -410,7 +410,7 @@ macro_rules! define_event_handler(
macro_rules! define_window_owned_event_handler(
($handler: ty, $event_type: ident, $getter: ident, $setter: ident) => (
fn $getter(&self) -> Option<::std::rc::Rc<$handler>> {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().$getter()
} else {
@ -419,7 +419,7 @@ macro_rules! define_window_owned_event_handler(
}
fn $setter(&self, listener: Option<::std::rc::Rc<$handler>>) {
let document = document_from_node(self);
let document = self.owner_document();
if document.has_browsing_context() {
document.window().$setter(listener)
}

View file

@ -9,7 +9,7 @@ use crate::dom::bindings::codegen::Bindings::MutationRecordBinding::MutationReco
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
use crate::dom::bindings::str::DOMString;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::nodelist::NodeList;
use crate::script_runtime::CanGc;
@ -46,7 +46,7 @@ impl MutationRecord {
None,
None,
));
reflect_dom_object(record, &*window_from_node(target), CanGc::note())
reflect_dom_object(record, &*target.owner_window(), CanGc::note())
}
pub fn character_data_mutated(
@ -65,7 +65,7 @@ impl MutationRecord {
None,
None,
)),
&*window_from_node(target),
&*target.owner_window(),
CanGc::note(),
)
}
@ -77,7 +77,7 @@ impl MutationRecord {
next_sibling: Option<&Node>,
prev_sibling: Option<&Node>,
) -> DomRoot<MutationRecord> {
let window = window_from_node(target);
let window = target.owner_window();
let added_nodes = added_nodes.map(|list| NodeList::new_simple_list_slice(&window, list));
let removed_nodes =
removed_nodes.map(|list| NodeList::new_simple_list_slice(&window, list));
@ -154,18 +154,14 @@ impl MutationRecordMethods<crate::DomTypeHolder> for MutationRecord {
// https://dom.spec.whatwg.org/#dom-mutationrecord-addednodes
fn AddedNodes(&self) -> DomRoot<NodeList> {
self.added_nodes.or_init(|| {
let window = window_from_node(&*self.target);
NodeList::empty(&window)
})
self.added_nodes
.or_init(|| NodeList::empty(&self.target.owner_window()))
}
// https://dom.spec.whatwg.org/#dom-mutationrecord-removednodes
fn RemovedNodes(&self) -> DomRoot<NodeList> {
self.removed_nodes.or_init(|| {
let window = window_from_node(&*self.target);
NodeList::empty(&window)
})
self.removed_nodes
.or_init(|| NodeList::empty(&self.target.owner_window()))
}
// https://dom.spec.whatwg.org/#dom-mutationrecord-previoussibling

View file

@ -413,7 +413,7 @@ impl Node {
// Spec says the choice of which global to create
// the mouse event on is not well-defined,
// and refers to heycam/webidl#135
let win = window_from_node(self);
let win = self.owner_window();
let mouse_event = MouseEvent::new(
&win, // ambiguous in spec
@ -813,7 +813,7 @@ impl Node {
/// Returns the rendered bounding content box if the element is rendered,
/// and none otherwise.
pub fn bounding_content_box(&self, can_gc: CanGc) -> Option<Rect<Au>> {
window_from_node(self).content_box_query(self, can_gc)
self.owner_window().content_box_query(self, can_gc)
}
pub fn bounding_content_box_or_zero(&self, can_gc: CanGc) -> Rect<Au> {
@ -821,11 +821,11 @@ impl Node {
}
pub fn content_boxes(&self, can_gc: CanGc) -> Vec<Rect<Au>> {
window_from_node(self).content_boxes_query(self, can_gc)
self.owner_window().content_boxes_query(self, can_gc)
}
pub fn client_rect(&self, can_gc: CanGc) -> Rect<i32> {
window_from_node(self).client_rect_query(self, can_gc)
self.owner_window().client_rect_query(self, can_gc)
}
/// <https://drafts.csswg.org/cssom-view/#dom-element-scrollwidth>
@ -1044,7 +1044,7 @@ impl Node {
/// <https://dom.spec.whatwg.org/#dom-parentnode-queryselectorall>
#[allow(unsafe_code)]
pub fn query_selector_all(&self, selectors: DOMString) -> Fallible<DomRoot<NodeList>> {
let window = window_from_node(self);
let window = self.owner_window();
let iter = self.query_selector_iter(selectors)?;
Ok(NodeList::new_simple_list(&window, iter))
}
@ -1296,7 +1296,10 @@ impl Node {
}
pub fn style(&self, can_gc: CanGc) -> Option<Arc<ComputedValues>> {
if !window_from_node(self).layout_reflow(QueryMsg::StyleQuery, can_gc) {
if !self
.owner_window()
.layout_reflow(QueryMsg::StyleQuery, can_gc)
{
return None;
}
self.style_data
@ -2018,8 +2021,7 @@ impl Node {
};
// Step 4.
let document = document_from_node(parent);
Node::adopt(node, &document);
Node::adopt(node, &parent.owner_document());
// Step 5.
Node::insert(
@ -2216,7 +2218,7 @@ impl Node {
if string.len() == 0 {
Node::replace_all(None, parent);
} else {
let text = Text::new(string, &document_from_node(parent), can_gc);
let text = Text::new(string, &parent.owner_document(), can_gc);
Node::replace_all(Some(text.upcast::<Node>()), parent);
};
}
@ -2574,7 +2576,7 @@ impl Node {
/// <https://html.spec.whatwg.org/multipage/#fragment-serializing-algorithm-steps>
pub fn fragment_serialization_algorithm(&self, require_well_formed: bool) -> DOMString {
// Step 1. Let context document be node's node document.
let context_document = document_from_node(self);
let context_document = self.owner_document();
// Step 2. If context document is an HTML document, return the result of HTML fragment serialization algorithm
// with node, false, and « ».
@ -2894,7 +2896,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
let previous_sibling = child.GetPreviousSibling();
// Step 10.
let document = document_from_node(self);
let document = self.owner_document();
Node::adopt(node, &document);
let removed_child = if node != child {
@ -3310,30 +3312,44 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
}
}
pub fn document_from_node<T: DerivedFrom<Node> + DomObject>(derived: &T) -> DomRoot<Document> {
derived.upcast().owner_doc()
pub(crate) trait NodeTraits {
/// Get the [`Document`] that owns this node. Note that this may differ from the
/// [`Document`] that the node was created in if it was adopted by a different
/// [`Document`] (the owner).
fn owner_document(&self) -> DomRoot<Document>;
/// Get the [`Window`] of the [`Document`] that owns this node. Note that this may
/// differ from the [`Document`] that the node was created in if it was adopted by a
/// different [`Document`] (the owner).
fn owner_window(&self) -> DomRoot<Window>;
/// If this [`Node`] is contained in a [`ShadowRoot`] return it, otherwise `None`.
fn containing_shadow_root(&self) -> Option<DomRoot<ShadowRoot>>;
/// Get the stylesheet owner for this node: either the [`Document`] or the [`ShadowRoot`]
/// of the node.
#[allow(crown::unrooted_must_root)]
fn stylesheet_list_owner(&self) -> StyleSheetListOwner;
}
pub fn containing_shadow_root<T: DerivedFrom<Node> + DomObject>(
derived: &T,
) -> Option<DomRoot<ShadowRoot>> {
derived.upcast().containing_shadow_root()
}
#[allow(crown::unrooted_must_root)]
pub fn stylesheets_owner_from_node<T: DerivedFrom<Node> + DomObject>(
derived: &T,
) -> StyleSheetListOwner {
if let Some(shadow_root) = containing_shadow_root(derived) {
StyleSheetListOwner::ShadowRoot(Dom::from_ref(&*shadow_root))
} else {
StyleSheetListOwner::Document(Dom::from_ref(&*document_from_node(derived)))
impl<T: DerivedFrom<Node> + DomObject> NodeTraits for T {
fn owner_document(&self) -> DomRoot<Document> {
self.upcast().owner_doc()
}
}
pub fn window_from_node<T: DerivedFrom<Node> + DomObject>(derived: &T) -> DomRoot<Window> {
let document = document_from_node(derived);
DomRoot::from_ref(document.window())
fn owner_window(&self) -> DomRoot<Window> {
DomRoot::from_ref(self.owner_document().window())
}
fn containing_shadow_root(&self) -> Option<DomRoot<ShadowRoot>> {
Node::containing_shadow_root(self.upcast())
}
#[allow(crown::unrooted_must_root)]
fn stylesheet_list_owner(&self) -> StyleSheetListOwner {
self.containing_shadow_root()
.map(|shadow_root| StyleSheetListOwner::ShadowRoot(Dom::from_ref(&*shadow_root)))
.unwrap_or_else(|| {
StyleSheetListOwner::Document(Dom::from_ref(&*self.owner_document()))
})
}
}
impl VirtualMethods for Node {

View file

@ -21,7 +21,7 @@ use crate::dom::bindings::reflector::{reflect_dom_object_with_proto, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::domrectreadonly::DOMRectReadOnly;
use crate::dom::element::Element;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::resizeobserverentry::ResizeObserverEntry;
use crate::dom::resizeobserversize::{ResizeObserverSize, ResizeObserverSizeImpl};
use crate::dom::window::Window;
@ -111,7 +111,7 @@ impl ResizeObserver {
let width = box_size.width().to_f64_px();
let height = box_size.height().to_f64_px();
let size_impl = ResizeObserverSizeImpl::new(width, height);
let window = window_from_node(&**target);
let window = target.owner_window();
let observer_size = ResizeObserverSize::new(&window, size_impl, can_gc);
// Note: content rect is built from content box size.

View file

@ -17,7 +17,7 @@ use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
use crate::dom::bindings::str::DOMString;
use crate::dom::document::Document;
use crate::dom::eventtarget::EventTarget;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::Node;
use crate::dom::range::Range;
use crate::script_runtime::CanGc;
@ -88,7 +88,7 @@ impl Selection {
return;
}
let this = Trusted::new(self);
let window = window_from_node(&*self.document);
let window = self.document.window();
window
.task_manager()
.user_interaction_task_source() // w3c/selection-api#117

View file

@ -25,7 +25,7 @@ use crate::dom::documentfragment::DocumentFragment;
use crate::dom::documentorshadowroot::{DocumentOrShadowRoot, StyleSheetInDocument};
use crate::dom::element::Element;
use crate::dom::node::{
document_from_node, BindContext, Node, NodeDamage, NodeFlags, ShadowIncluding, UnbindContext,
BindContext, Node, NodeDamage, NodeFlags, NodeTraits, ShadowIncluding, UnbindContext,
};
use crate::dom::stylesheetlist::{StyleSheetList, StyleSheetListOwner};
use crate::dom::virtualmethods::VirtualMethods;
@ -314,7 +314,7 @@ impl VirtualMethods for ShadowRoot {
}
if context.tree_connected {
let document = document_from_node(self);
let document = self.owner_document();
document.register_shadow_root(self);
}
@ -332,7 +332,7 @@ impl VirtualMethods for ShadowRoot {
}
if context.tree_connected {
let document = document_from_node(self);
let document = self.owner_document();
document.unregister_shadow_root(self);
}
}

View file

@ -13,7 +13,7 @@ use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
use crate::dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner};
use crate::dom::document::Document;
use crate::dom::element::Element;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
@ -70,7 +70,7 @@ impl SVGElementMethods<crate::DomTypeHolder> for SVGElement {
// https://html.spec.whatwg.org/multipage/#the-style-attribute
fn Style(&self) -> DomRoot<CSSStyleDeclaration> {
self.style_decl.or_init(|| {
let global = window_from_node(self);
let global = self.owner_window();
CSSStyleDeclaration::new(
&global,
CSSStyleOwner::Element(Dom::from_ref(self.upcast())),

View file

@ -16,7 +16,7 @@ use crate::dom::bindings::error::{Error, ErrorResult};
use crate::dom::bindings::str::DOMString;
use crate::dom::event::{EventBubbles, EventCancelable};
use crate::dom::eventtarget::EventTarget;
use crate::dom::node::{window_from_node, Node, NodeDamage};
use crate::dom::node::{Node, NodeDamage, NodeTraits};
use crate::textinput::{SelectionDirection, SelectionState, TextInput, UTF8Bytes};
pub trait TextControlElement: DerivedFrom<EventTarget> + DerivedFrom<Node> {
@ -300,7 +300,7 @@ impl<'a, E: TextControlElement> TextControlSelection<'a, E> {
// Step 6
if textinput.selection_state() != original_selection_state {
let window = window_from_node(self.element);
let window = self.element.owner_window();
window
.task_manager()
.user_interaction_task_source()

View file

@ -9,7 +9,7 @@ use dom_struct::dom_struct;
use js::rust::HandleObject;
use servo_atoms::Atom;
use super::node::document_from_node;
use super::node::NodeTraits;
use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods;
use crate::dom::bindings::codegen::Bindings::UIEventBinding;
use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods;
@ -106,7 +106,7 @@ impl UIEvent {
if let Some(target_) = target_ {
let element = target_.downcast::<Element>();
let document = match element {
Some(element) => document_from_node(element),
Some(element) => element.owner_document(),
None => target_.downcast::<Window>().unwrap().Document(),
};
self.view.set(Some(document.window()));

View file

@ -15,12 +15,12 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlheadelement::HTMLHeadElement;
use crate::dom::htmlscriptelement::SourceCode;
use crate::dom::node::document_from_node;
use crate::dom::node::NodeTraits;
use crate::script_module::ScriptFetchOptions;
use crate::script_runtime::CanGc;
pub fn load_script(head: &HTMLHeadElement) {
let doc = document_from_node(head);
let doc = head.owner_document();
let path_str = match doc.window().get_userscripts_path() {
Some(p) => p,
None => return,

View file

@ -57,7 +57,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::element::cors_setting_for_element;
use crate::dom::event::{Event, EventBubbles, EventCancelable};
use crate::dom::htmlcanvaselement::{utils as canvas_utils, LayoutCanvasRenderingContextHelpers};
use crate::dom::node::{document_from_node, window_from_node, Node, NodeDamage};
use crate::dom::node::{Node, NodeDamage, NodeTraits};
use crate::dom::promise::Promise;
use crate::dom::vertexarrayobject::VertexAttribData;
use crate::dom::webgl_extensions::WebGLExtensions;
@ -551,8 +551,7 @@ impl WebGLRenderingContext {
match self.canvas {
HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => {
canvas.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
let document = document_from_node(&**canvas);
document.add_dirty_webgl_canvas(self);
canvas.owner_document().add_dirty_webgl_canvas(self);
},
HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(_) => {},
}
@ -665,7 +664,7 @@ impl WebGLRenderingContext {
TexImageSource::HTMLImageElement(image) => {
let document = match self.canvas {
HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => {
document_from_node(&**canvas)
canvas.owner_document()
},
HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(ref _canvas) => {
// TODO: Support retrieving image pixels here for OffscreenCanvas
@ -683,7 +682,7 @@ impl WebGLRenderingContext {
let window = match self.canvas {
HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => {
window_from_node(&**canvas)
canvas.owner_window()
},
// This is marked as unreachable as we should have returned already
HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(_) => unreachable!(),

View file

@ -38,7 +38,7 @@ use crate::dom::bindings::weakref::WeakRef;
use crate::dom::document::WebGPUContextsMap;
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlcanvaselement::{HTMLCanvasElement, LayoutCanvasRenderingContextHelpers};
use crate::dom::node::{document_from_node, Node, NodeDamage};
use crate::dom::node::{Node, NodeDamage, NodeTraits};
use crate::script_runtime::CanGc;
impl HTMLCanvasElementOrOffscreenCanvas {
@ -141,7 +141,7 @@ impl GPUCanvasContext {
}
pub fn new(global: &GlobalScope, canvas: &HTMLCanvasElement, channel: WebGPU) -> DomRoot<Self> {
let document = document_from_node(canvas);
let document = canvas.owner_document();
let this = reflect_dom_object(
Box::new(GPUCanvasContext::new_inherited(
global,

View file

@ -133,7 +133,7 @@ use crate::dom::mediaquerylist::{MediaQueryList, MediaQueryListMatchState};
use crate::dom::mediaquerylistevent::MediaQueryListEvent;
use crate::dom::messageevent::MessageEvent;
use crate::dom::navigator::Navigator;
use crate::dom::node::{document_from_node, from_untrusted_node_address, Node, NodeDamage};
use crate::dom::node::{from_untrusted_node_address, Node, NodeDamage, NodeTraits};
use crate::dom::performance::Performance;
use crate::dom::promise::Promise;
use crate::dom::screen::Screen;
@ -882,7 +882,7 @@ impl WindowMethods<crate::DomTypeHolder> for Window {
let container = window_proxy.frame_element()?;
// Step 6.
let container_doc = document_from_node(container);
let container_doc = container.owner_document();
let current_doc = GlobalScope::current()
.expect("No current global object")
.as_window()

View file

@ -10,7 +10,7 @@ use net_traits::image_cache::{ImageResponse, PendingImageResponse};
use crate::dom::bindings::conversions::DerivedFrom;
use crate::dom::bindings::refcounted::Trusted;
use crate::dom::bindings::reflector::DomObject;
use crate::dom::node::{window_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::script_runtime::CanGc;
pub trait ImageCacheListener {
@ -26,7 +26,7 @@ pub fn generate_cache_listener_for_element<
let trusted_node = Trusted::new(elem);
let (responder_sender, responder_receiver) = ipc::channel().unwrap();
let window = window_from_node(elem);
let window = elem.owner_window();
let (task_source, canceller) = window
.task_manager()
.networking_task_source_with_canceller();

View file

@ -21,7 +21,7 @@ use crate::dom::bindings::reflector::DomObject;
use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::globalscope::GlobalScope;
use crate::dom::node::{document_from_node, Node};
use crate::dom::node::{Node, NodeTraits};
use crate::dom::performanceresourcetiming::InitiatorType;
use crate::network_listener::{self, PreInvoke, ResourceTimingListener};
use crate::script_runtime::CanGc;
@ -97,7 +97,7 @@ pub fn fetch_image_for_layout(
id: PendingImageId,
cache: Arc<dyn ImageCache>,
) {
let document = document_from_node(node);
let document = node.owner_document();
let context = LayoutImageContext {
id,
cache,

View file

@ -19,7 +19,7 @@ use crate::dom::htmlanchorelement::HTMLAnchorElement;
use crate::dom::htmlareaelement::HTMLAreaElement;
use crate::dom::htmlformelement::HTMLFormElement;
use crate::dom::htmllinkelement::HTMLLinkElement;
use crate::dom::node::document_from_node;
use crate::dom::node::NodeTraits;
use crate::dom::types::{Element, GlobalScope};
use crate::script_runtime::CanGc;
@ -322,7 +322,7 @@ pub fn get_element_target(subject: &Element) -> Option<DOMString> {
return Some(subject.get_string_attribute(&local_name!("target")));
}
let doc = document_from_node(subject).base_element();
let doc = subject.owner_document().base_element();
match doc {
Some(doc) => {
let element = doc.upcast::<Element>();
@ -348,7 +348,7 @@ pub fn follow_hyperlink(
}
// Step 2, done in Step 7.
let document = document_from_node(subject);
let document = subject.owner_document();
let window = document.window();
// Step 3: source browsing context.

View file

@ -65,7 +65,7 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlscriptelement::{
HTMLScriptElement, ScriptId, ScriptOrigin, ScriptType, SCRIPT_JS_MIMES,
};
use crate::dom::node::document_from_node;
use crate::dom::node::NodeTraits;
use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::promise::Promise;
use crate::dom::promisenativehandler::{Callback, PromiseNativeHandler};
@ -962,8 +962,7 @@ impl ModuleOwner {
ModuleOwner::Window(script) => {
let global = self.global();
let document = document_from_node(&*script.root());
let document = script.root().owner_document();
let load = {
let module_tree = module_identity.get_module_tree(&global);
@ -1745,7 +1744,7 @@ fn fetch_single_module_script(
let document: Option<DomRoot<Document>> = match &owner {
ModuleOwner::Worker(_) | ModuleOwner::DynamicModule(_) => None,
ModuleOwner::Window(script) => Some(document_from_node(&*script.root())),
ModuleOwner::Window(script) => Some(script.root().owner_document()),
};
// Step 7-8.

View file

@ -130,7 +130,7 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlanchorelement::HTMLAnchorElement;
use crate::dom::htmliframeelement::HTMLIFrameElement;
use crate::dom::mutationobserver::MutationObserver;
use crate::dom::node::{window_from_node, Node, ShadowIncluding};
use crate::dom::node::{Node, NodeTraits, ShadowIncluding};
use crate::dom::performanceentry::PerformanceEntry;
use crate::dom::performancepainttiming::PerformancePaintTiming;
use crate::dom::servoparser::{ParserContext, ServoParser};
@ -3062,7 +3062,7 @@ impl ScriptThread {
.find_iframe(parent_id, browsing_context_id)
});
let parent_browsing_context = match (parent_info, iframe.as_ref()) {
(_, Some(iframe)) => Some(window_from_node(&**iframe).window_proxy()),
(_, Some(iframe)) => Some(iframe.owner_window().window_proxy()),
(Some(parent_id), _) => self.remote_window_proxy(
window.upcast(),
top_level_browsing_context_id,

View file

@ -37,7 +37,7 @@ use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmllinkelement::{HTMLLinkElement, RequestGenerationId};
use crate::dom::node::{containing_shadow_root, document_from_node, window_from_node};
use crate::dom::node::NodeTraits;
use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::shadowroot::ShadowRoot;
use crate::fetch::create_a_potential_cors_request;
@ -179,7 +179,7 @@ impl FetchResponseListener for StylesheetContext {
let protocol_encoding_label = metadata.charset.as_deref();
let final_url = metadata.final_url;
let win = window_from_node(&*elem);
let win = elem.owner_window();
let loader = StylesheetLoader::for_element(&elem);
match self.source {
@ -288,7 +288,7 @@ impl ResourceTimingListener for StylesheetContext {
}
fn resource_timing_global(&self) -> DomRoot<GlobalScope> {
document_from_node(&*self.elem.root()).global()
self.elem.root().owner_document().global()
}
}
@ -310,8 +310,11 @@ impl StylesheetLoader<'_> {
cors_setting: Option<CorsSettings>,
integrity_metadata: String,
) {
let document = document_from_node(self.elem);
let shadow_root = containing_shadow_root(self.elem).map(|sr| Trusted::new(&*sr));
let document = self.elem.owner_document();
let shadow_root = self
.elem
.containing_shadow_root()
.map(|sr| Trusted::new(&*sr));
let gen = self
.elem
.downcast::<HTMLLinkElement>()

View file

@ -58,7 +58,7 @@ use crate::dom::htmliframeelement::HTMLIFrameElement;
use crate::dom::htmlinputelement::{HTMLInputElement, InputType};
use crate::dom::htmloptionelement::HTMLOptionElement;
use crate::dom::htmlselectelement::HTMLSelectElement;
use crate::dom::node::{window_from_node, Node, ShadowIncluding};
use crate::dom::node::{Node, NodeTraits, ShadowIncluding};
use crate::dom::nodelist::NodeList;
use crate::dom::window::Window;
use crate::dom::xmlserializer::XMLSerializer;
@ -414,8 +414,8 @@ pub fn handle_get_browsing_context_id(
// https://w3c.github.io/webdriver/#dfn-center-point
fn get_element_in_view_center_point(element: &Element, can_gc: CanGc) -> Option<Point2D<i64>> {
window_from_node(element.upcast::<Node>())
.Document()
element
.owner_document()
.GetBody()
.map(DomRoot::upcast::<Element>)
.and_then(|body| {
@ -1088,7 +1088,7 @@ pub fn handle_get_css(
reply
.send(
find_node_by_unique_id(documents, pipeline, node_id).map(|node| {
let window = window_from_node(&*node);
let window = node.owner_window();
let element = node.downcast::<Element>().unwrap();
String::from(
window