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::str::DOMString;
use crate::dom::bindings::trace::NoTrace; use crate::dom::bindings::trace::NoTrace;
use crate::dom::event::Event; 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::transitionevent::TransitionEvent;
use crate::dom::window::Window; use crate::dom::window::Window;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -516,7 +516,7 @@ impl Animations {
DOMString::from(pseudo_element.to_css_string()) DOMString::from(pseudo_element.to_css_string())
}); });
let elapsed_time = Finite::new(event.elapsed_time as f32).unwrap(); 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() { if event.event_type.is_transition_event() {
let event_init = TransitionEventInit { 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::globalscope::GlobalScope;
use crate::dom::htmlcanvaselement::{CanvasContext, HTMLCanvasElement}; use crate::dom::htmlcanvaselement::{CanvasContext, HTMLCanvasElement};
use crate::dom::imagedata::ImageData; 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::offscreencanvas::{OffscreenCanvas, OffscreenCanvasContext};
use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope; use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope;
use crate::dom::textmetrics::TextMetrics; use crate::dom::textmetrics::TextMetrics;
@ -1086,7 +1086,7 @@ impl CanvasState {
None => return, // offscreen canvas doesn't have a placeholder canvas None => return, // offscreen canvas doesn't have a placeholder canvas
}; };
let node = canvas.upcast::<Node>(); let node = canvas.upcast::<Node>();
let window = window_from_node(canvas); let window = canvas.owner_window();
let resolved_font_style = let resolved_font_style =
match window.resolved_font_style_query(node, value.to_string(), can_gc) { match window.resolved_font_style_query(node, value.to_string(), can_gc) {
Some(value) => value, Some(value) => value,

View file

@ -37,7 +37,7 @@ use crate::dom::document::AnimationFrameCallback;
use crate::dom::element::Element; use crate::dom::element::Element;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlscriptelement::SourceCode; 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::dom::types::HTMLElement;
use crate::realms::enter_realm; use crate::realms::enter_realm;
use crate::script_module::ScriptFetchOptions; use crate::script_module::ScriptFetchOptions;
@ -152,7 +152,7 @@ pub fn handle_get_children(
let inline: Vec<_> = parent let inline: Vec<_> = parent
.children() .children()
.map(|child| { .map(|child| {
let window = window_from_node(&*child); let window = child.owner_window();
let Some(elem) = child.downcast::<Element>() else { let Some(elem) = child.downcast::<Element>() else {
return false; return false;
}; };
@ -231,7 +231,7 @@ pub fn handle_get_stylesheet_style(
let document = documents.find_document(pipeline)?; let document = documents.find_document(pipeline)?;
let _realm = enter_realm(document.window()); 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 stylesheet = owner.stylesheet_at(stylesheet)?;
let list = stylesheet.GetCssRules().ok()?; let list = stylesheet.GetCssRules().ok()?;
@ -275,7 +275,7 @@ pub fn handle_get_selectors(
let document = documents.find_document(pipeline)?; let document = documents.find_document(pipeline)?;
let _realm = enter_realm(document.window()); 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()) let rules = (0..owner.stylesheet_count())
.filter_map(|i| { .filter_map(|i| {
@ -312,7 +312,7 @@ pub fn handle_get_computed_style(
Some(found_node) => found_node, Some(found_node) => found_node,
}; };
let window = window_from_node(&*node); let window = node.owner_window();
let elem = node let elem = node
.downcast::<Element>() .downcast::<Element>()
.expect("This should be an element"); .expect("This should be an element");
@ -353,7 +353,7 @@ pub fn handle_get_layout(
let width = rect.Width() as f32; let width = rect.Width() as f32;
let height = rect.Height() as f32; let height = rect.Height() as f32;
let window = window_from_node(&*node); let window = node.owner_window();
let elem = node let elem = node
.downcast::<Element>() .downcast::<Element>()
.expect("should be getting layout of 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::bindings::str::DOMString;
use crate::dom::cssrule::CSSRule; use crate::dom::cssrule::CSSRule;
use crate::dom::element::Element; 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::dom::window::Window;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -67,7 +67,7 @@ impl CSSStyleOwner {
let mut changed = true; let mut changed = true;
match *self { match *self {
CSSStyleOwner::Element(ref el) => { CSSStyleOwner::Element(ref el) => {
let document = document_from_node(&**el); let document = el.owner_document();
let shared_lock = document.style_shared_lock(); let shared_lock = document.style_shared_lock();
let mut attr = el.style_attribute().borrow_mut().take(); let mut attr = el.style_attribute().borrow_mut().take();
let result = if attr.is_some() { let result = if attr.is_some() {
@ -122,8 +122,7 @@ impl CSSStyleOwner {
// If this is changed, see also // If this is changed, see also
// CSSStyleRule::SetSelectorText, which does the same thing. // CSSStyleRule::SetSelectorText, which does the same thing.
if let Some(owner) = rule.parent_stylesheet().get_owner() { if let Some(owner) = rule.parent_stylesheet().get_owner() {
stylesheets_owner_from_node(owner.upcast::<Node>()) owner.stylesheet_list_owner().invalidate_stylesheets();
.invalidate_stylesheets();
} }
} }
result result
@ -138,7 +137,7 @@ impl CSSStyleOwner {
match *self { match *self {
CSSStyleOwner::Element(ref el) => match *el.style_attribute().borrow() { CSSStyleOwner::Element(ref el) => match *el.style_attribute().borrow() {
Some(ref pdb) => { Some(ref pdb) => {
let document = document_from_node(&**el); let document = el.owner_document();
let guard = document.style_shared_lock().read(); let guard = document.style_shared_lock().read();
f(pdb.read_with(&guard)) f(pdb.read_with(&guard))
}, },
@ -156,14 +155,14 @@ impl CSSStyleOwner {
fn window(&self) -> DomRoot<Window> { fn window(&self) -> DomRoot<Window> {
match *self { 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()), CSSStyleOwner::CSSRule(ref rule, _) => DomRoot::from_ref(rule.global().as_window()),
} }
} }
fn base_url(&self) -> ServoUrl { fn base_url(&self) -> ServoUrl {
match *self { 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( CSSStyleOwner::CSSRule(ref rule, _) => ServoUrl::from(
rule.parent_stylesheet() rule.parent_stylesheet()
.style_stylesheet() .style_stylesheet()
@ -259,7 +258,8 @@ impl CSSStyleDeclaration {
return DOMString::new(); return DOMString::new();
} }
let addr = node.to_trusted_node_address(); 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::cssrule::{CSSRule, SpecificCSSRule};
use crate::dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner}; use crate::dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner};
use crate::dom::cssstylesheet::CSSStyleSheet; 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::dom::window::Window;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -120,7 +120,7 @@ impl CSSStyleRuleMethods<crate::DomTypeHolder> for CSSStyleRule {
let stylerule = self.stylerule.write_with(&mut guard); let stylerule = self.stylerule.write_with(&mut guard);
mem::swap(&mut stylerule.selectors, &mut s); mem::swap(&mut stylerule.selectors, &mut s);
if let Some(owner) = self.cssrule.parent_stylesheet().get_owner() { 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::codegen::Bindings::CSSStyleSheetBinding::CSSStyleSheetMethods;
use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; 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::reflector::{reflect_dom_object, DomObject};
use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::bindings::str::DOMString; use crate::dom::bindings::str::DOMString;
use crate::dom::cssrulelist::{CSSRuleList, RulesSource}; use crate::dom::cssrulelist::{CSSRuleList, RulesSource};
use crate::dom::element::Element; use crate::dom::element::Element;
use crate::dom::medialist::MediaList; 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::stylesheet::StyleSheet;
use crate::dom::window::Window; use crate::dom::window::Window;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -86,7 +85,9 @@ impl CSSStyleSheet {
pub fn set_disabled(&self, disabled: bool) { pub fn set_disabled(&self, disabled: bool) {
if self.style_stylesheet.set_disabled(disabled) && self.get_owner().is_some() { 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(); .invalidate_stylesheets();
} }
} }

View file

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

View file

@ -152,8 +152,7 @@ use crate::dom::location::Location;
use crate::dom::messageevent::MessageEvent; use crate::dom::messageevent::MessageEvent;
use crate::dom::mouseevent::MouseEvent; use crate::dom::mouseevent::MouseEvent;
use crate::dom::node::{ use crate::dom::node::{
self, document_from_node, window_from_node, CloneChildrenFlag, Node, NodeDamage, NodeFlags, self, CloneChildrenFlag, Node, NodeDamage, NodeFlags, NodeTraits, ShadowIncluding,
ShadowIncluding,
}; };
use crate::dom::nodeiterator::NodeIterator; use crate::dom::nodeiterator::NodeIterator;
use crate::dom::nodelist::NodeList; use crate::dom::nodelist::NodeList;
@ -2261,7 +2260,7 @@ impl Document {
let iframes: Vec<_> = self.iframes().iter().collect(); let iframes: Vec<_> = self.iframes().iter().collect();
for iframe in &iframes { for iframe in &iframes {
// TODO: handle the case of cross origin 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); can_unload = document.prompt_to_unload(true, can_gc);
if !document.salvageable() { if !document.salvageable() {
self.salvageable.set(false); self.salvageable.set(false);
@ -2333,7 +2332,7 @@ impl Document {
let iframes: Vec<_> = self.iframes().iter().collect(); let iframes: Vec<_> = self.iframes().iter().collect();
for iframe in &iframes { for iframe in &iframes {
// TODO: handle the case of cross origin 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); document.unload(true, can_gc);
if !document.salvageable() { if !document.salvageable() {
self.salvageable.set(false); self.salvageable.set(false);
@ -2501,7 +2500,7 @@ impl Document {
// https://html.spec.whatwg.org/multipage/#shared-declarative-refresh-steps // https://html.spec.whatwg.org/multipage/#shared-declarative-refresh-steps
document.window.upcast::<GlobalScope>().schedule_callback( document.window.upcast::<GlobalScope>().schedule_callback(
OneshotTimerCallback::RefreshRedirectDue(RefreshRedirectDue { OneshotTimerCallback::RefreshRedirectDue(RefreshRedirectDue {
window: window_from_node(&*document), window: DomRoot::from_ref(document.window()),
url: url.clone(), url: url.clone(),
}), }),
Duration::from_secs(*time), Duration::from_secs(*time),
@ -5314,7 +5313,7 @@ impl DocumentMethods<crate::DomTypeHolder> for Document {
// TODO: prompt to unload. // TODO: prompt to unload.
// TODO: set unload_event_start and unload_event_end // TODO: set unload_event_start and unload_event_end
window_from_node(self).set_navigation_start(); self.window().set_navigation_start();
// Step 8 // Step 8
// TODO: https://github.com/servo/servo/issues/21937 // 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::document::Document;
use crate::dom::element::Element; use crate::dom::element::Element;
use crate::dom::htmlcollection::HTMLCollection; 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::nodelist::NodeList;
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
use crate::dom::window::Window; use crate::dom::window::Window;
@ -77,7 +77,7 @@ impl DocumentFragmentMethods<crate::DomTypeHolder> for DocumentFragment {
// https://dom.spec.whatwg.org/#dom-parentnode-children // https://dom.spec.whatwg.org/#dom-parentnode-children
fn Children(&self) -> DomRoot<HTMLCollection> { fn Children(&self) -> DomRoot<HTMLCollection> {
let window = window_from_node(self); let window = self.owner_window();
HTMLCollection::children(&window, self.upcast()) 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::root::{Dom, DomRoot};
use crate::dom::bindings::str::DOMString; use crate::dom::bindings::str::DOMString;
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::window_from_node; use crate::dom::node::NodeTraits;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
#[dom_struct] #[dom_struct]
@ -28,10 +28,9 @@ impl DOMStringMap {
} }
pub fn new(element: &HTMLElement) -> DomRoot<DOMStringMap> { pub fn new(element: &HTMLElement) -> DomRoot<DOMStringMap> {
let window = window_from_node(element);
reflect_dom_object( reflect_dom_object(
Box::new(DOMStringMap::new_inherited(element)), Box::new(DOMStringMap::new_inherited(element)),
&*window, &*element.owner_window(),
CanGc::note(), 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::root::{Dom, DomRoot};
use crate::dom::bindings::str::DOMString; use crate::dom::bindings::str::DOMString;
use crate::dom::element::Element; use crate::dom::element::Element;
use crate::dom::node::window_from_node; use crate::dom::node::NodeTraits;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
#[dom_struct] #[dom_struct]
@ -46,14 +46,13 @@ impl DOMTokenList {
local_name: &LocalName, local_name: &LocalName,
supported_tokens: Option<Vec<Atom>>, supported_tokens: Option<Vec<Atom>>,
) -> DomRoot<DOMTokenList> { ) -> DomRoot<DOMTokenList> {
let window = window_from_node(element);
reflect_dom_object( reflect_dom_object(
Box::new(DOMTokenList::new_inherited( Box::new(DOMTokenList::new_inherited(
element, element,
local_name.clone(), local_name.clone(),
supported_tokens, supported_tokens,
)), )),
&*window, &*element.owner_window(),
CanGc::note(), CanGc::note(),
) )
} }

View file

@ -137,8 +137,8 @@ use crate::dom::htmlvideoelement::{HTMLVideoElement, LayoutHTMLVideoElementHelpe
use crate::dom::mutationobserver::{Mutation, MutationObserver}; use crate::dom::mutationobserver::{Mutation, MutationObserver};
use crate::dom::namednodemap::NamedNodeMap; use crate::dom::namednodemap::NamedNodeMap;
use crate::dom::node::{ use crate::dom::node::{
document_from_node, window_from_node, BindContext, ChildrenMutation, LayoutNodeHelpers, Node, BindContext, ChildrenMutation, LayoutNodeHelpers, Node, NodeDamage, NodeFlags, NodeTraits,
NodeDamage, NodeFlags, ShadowIncluding, UnbindContext, ShadowIncluding, UnbindContext,
}; };
use crate::dom::nodelist::NodeList; use crate::dom::nodelist::NodeList;
use crate::dom::promise::Promise; use crate::dom::promise::Promise;
@ -1748,7 +1748,7 @@ impl Element {
}; };
let value = &**attr.value(); let value = &**attr.value();
// XXXManishearth this doesn't handle `javascript:` urls properly // XXXManishearth this doesn't handle `javascript:` urls properly
document_from_node(self) self.owner_document()
.base_url() .base_url()
.join(value) .join(value)
.map(|parsed| USVString(parsed.into_string())) .map(|parsed| USVString(parsed.into_string()))
@ -1972,7 +1972,7 @@ impl Element {
if let Some(template) = self.downcast::<HTMLTemplateElement>() { if let Some(template) = self.downcast::<HTMLTemplateElement>() {
template.Content(can_gc).upcast::<Node>().owner_doc() template.Content(can_gc).upcast::<Node>().owner_doc()
} else { } else {
document_from_node(self) self.owner_document()
} }
}; };
let fragment = DocumentFragment::new(&context_document, can_gc); let fragment = DocumentFragment::new(&context_document, can_gc);
@ -2011,8 +2011,7 @@ impl Element {
if !self.is_connected() { if !self.is_connected() {
return false; return false;
} }
let document = document_from_node(self); self.owner_document().get_allow_fullscreen()
document.get_allow_fullscreen()
} }
// https://html.spec.whatwg.org/multipage/#home-subtree // https://html.spec.whatwg.org/multipage/#home-subtree
@ -2088,8 +2087,7 @@ impl Element {
// https://html.spec.whatwg.org/multipage/#focus-fixup-rule // https://html.spec.whatwg.org/multipage/#focus-fixup-rule
if !is_sequentially_focusable { if !is_sequentially_focusable {
let document = document_from_node(self); self.owner_document().perform_focus_fixup_rule(self, can_gc);
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 // https://dom.spec.whatwg.org/#dom-element-attributes
fn Attributes(&self) -> DomRoot<NamedNodeMap> { fn Attributes(&self) -> DomRoot<NamedNodeMap> {
self.attr_list 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 // 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 // https://dom.spec.whatwg.org/#dom-element-getelementsbytagname
fn GetElementsByTagName(&self, localname: DOMString) -> DomRoot<HTMLCollection> { 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)) HTMLCollection::by_qualified_name(&window, self.upcast(), LocalName::from(&*localname))
} }
@ -2423,19 +2421,19 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
maybe_ns: Option<DOMString>, maybe_ns: Option<DOMString>,
localname: DOMString, localname: DOMString,
) -> DomRoot<HTMLCollection> { ) -> DomRoot<HTMLCollection> {
let window = window_from_node(self); let window = self.owner_window();
HTMLCollection::by_tag_name_ns(&window, self.upcast(), localname, maybe_ns) HTMLCollection::by_tag_name_ns(&window, self.upcast(), localname, maybe_ns)
} }
// https://dom.spec.whatwg.org/#dom-element-getelementsbyclassname // https://dom.spec.whatwg.org/#dom-element-getelementsbyclassname
fn GetElementsByClassName(&self, classes: DOMString) -> DomRoot<HTMLCollection> { 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) HTMLCollection::by_class_name(&window, self.upcast(), classes)
} }
// https://drafts.csswg.org/cssom-view/#dom-element-getclientrects // https://drafts.csswg.org/cssom-view/#dom-element-getclientrects
fn GetClientRects(&self, can_gc: CanGc) -> DomRoot<DOMRectList> { 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 raw_rects = self.upcast::<Node>().content_boxes(can_gc);
let rects: Vec<DomRoot<DOMRect>> = raw_rects let rects: Vec<DomRoot<DOMRect>> = raw_rects
.iter() .iter()
@ -2455,7 +2453,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://drafts.csswg.org/cssom-view/#dom-element-getboundingclientrect // https://drafts.csswg.org/cssom-view/#dom-element-getboundingclientrect
fn GetBoundingClientRect(&self, can_gc: CanGc) -> DomRoot<DOMRect> { 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); let rect = self.upcast::<Node>().bounding_content_box_or_zero(can_gc);
DOMRect::new( DOMRect::new(
win.upcast(), win.upcast(),
@ -2749,7 +2747,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
self.local_name().clone(), 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>() self.upcast::<Node>()
.html_serialize(ChildrenOnly(Some(qname))) .html_serialize(ChildrenOnly(Some(qname)))
} else { } else {
@ -2792,7 +2790,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
/// <https://html.spec.whatwg.org/multipage/#dom-element-outerhtml> /// <https://html.spec.whatwg.org/multipage/#dom-element-outerhtml>
fn GetOuterHTML(&self) -> Fallible<DOMString> { 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) self.upcast::<Node>().html_serialize(IncludeNode)
} else { } else {
self.upcast::<Node>().xml_serialize(XmlIncludeNode) 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> /// <https://html.spec.whatwg.org/multipage/#dom-element-outerhtml>
fn SetOuterHTML(&self, value: DOMString, can_gc: CanGc) -> ErrorResult { 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>(); let context_node = self.upcast::<Node>();
// Step 1. // Step 1.
let context_parent = match context_node.GetParentNode() { 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 // https://dom.spec.whatwg.org/#dom-parentnode-children
fn Children(&self) -> DomRoot<HTMLCollection> { fn Children(&self) -> DomRoot<HTMLCollection> {
let window = window_from_node(self); let window = self.owner_window();
HTMLCollection::children(&window, self.upcast()) HTMLCollection::children(&window, self.upcast())
} }
@ -2930,7 +2928,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://dom.spec.whatwg.org/#dom-element-matches // https://dom.spec.whatwg.org/#dom-element-matches
fn Matches(&self, selectors: DOMString) -> Fallible<bool> { fn Matches(&self, selectors: DOMString) -> Fallible<bool> {
let doc = document_from_node(self); let doc = self.owner_document();
let url = doc.url(); let url = doc.url();
let selectors = match SelectorParser::parse_author_origin_no_namespace( let selectors = match SelectorParser::parse_author_origin_no_namespace(
&selectors, &selectors,
@ -2953,7 +2951,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://dom.spec.whatwg.org/#dom-element-closest // https://dom.spec.whatwg.org/#dom-element-closest
fn Closest(&self, selectors: DOMString) -> Fallible<Option<DomRoot<Element>>> { 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 url = doc.url();
let selectors = match SelectorParser::parse_author_origin_no_namespace( let selectors = match SelectorParser::parse_author_origin_no_namespace(
&selectors, &selectors,
@ -2985,7 +2983,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://dom.spec.whatwg.org/#dom-element-insertadjacenttext // https://dom.spec.whatwg.org/#dom-element-insertadjacenttext
fn InsertAdjacentText(&self, where_: DOMString, data: DOMString, can_gc: CanGc) -> ErrorResult { fn InsertAdjacentText(&self, where_: DOMString, data: DOMString, can_gc: CanGc) -> ErrorResult {
// Step 1. // 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. // Step 2.
let where_ = where_.parse::<AdjacentPosition>()?; let where_ = where_.parse::<AdjacentPosition>()?;
@ -3055,7 +3053,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
// https://fullscreen.spec.whatwg.org/#dom-element-requestfullscreen // https://fullscreen.spec.whatwg.org/#dom-element-requestfullscreen
fn RequestFullscreen(&self, can_gc: CanGc) -> Rc<Promise> { 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) doc.enter_fullscreen(self, can_gc)
} }
@ -3488,7 +3486,7 @@ impl VirtualMethods for Element {
attr.swap_value(&mut value); attr.swap_value(&mut value);
block block
} else { } else {
let win = window_from_node(self); let win = self.owner_window();
Arc::new(doc.style_shared_lock().wrap(parse_style_attribute( Arc::new(doc.style_shared_lock().wrap(parse_style_attribute(
&attr.value(), &attr.value(),
&UrlExtraData(doc.base_url().get_arc()), &UrlExtraData(doc.base_url().get_arc()),
@ -3512,7 +3510,7 @@ impl VirtualMethods for Element {
None None
} }
}); });
let containing_shadow_root = self.upcast::<Node>().containing_shadow_root(); let containing_shadow_root = self.containing_shadow_root();
if node.is_connected() { if node.is_connected() {
let value = attr.value().as_atom().clone(); let value = attr.value().as_atom().clone();
match mutation { match mutation {
@ -3614,7 +3612,7 @@ impl VirtualMethods for Element {
f.bind_form_control_to_tree(); 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() { if let Some(ref shadow_root) = self.shadow_root() {
shadow_root.bind_to_tree(context); shadow_root.bind_to_tree(context);
@ -3627,14 +3625,14 @@ impl VirtualMethods for Element {
self.update_sequentially_focusable_status(CanGc::note()); self.update_sequentially_focusable_status(CanGc::note());
if let Some(ref id) = *self.id_attribute.borrow() { 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()); shadow_root.register_element_id(self, id.clone());
} else { } else {
doc.register_element_id(self, id.clone()); doc.register_element_id(self, id.clone());
} }
} }
if let Some(ref name) = self.name_attribute() { 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()); doc.register_element_name(self, name.clone());
} }
} }
@ -3659,21 +3657,21 @@ impl VirtualMethods for Element {
self.update_sequentially_focusable_status(CanGc::note()); self.update_sequentially_focusable_status(CanGc::note());
let doc = document_from_node(self); let doc = self.owner_document();
let fullscreen = doc.GetFullscreenElement(); let fullscreen = doc.GetFullscreenElement();
if fullscreen.as_deref() == Some(self) { if fullscreen.as_deref() == Some(self) {
doc.exit_fullscreen(CanGc::note()); doc.exit_fullscreen(CanGc::note());
} }
if let Some(ref value) = *self.id_attribute.borrow() { 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()); shadow_root.unregister_element_id(self, value.clone());
} else { } else {
doc.unregister_element_id(self, value.clone()); doc.unregister_element_id(self, value.clone());
} }
} }
if let Some(ref value) = self.name_attribute() { 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()); doc.unregister_element_name(self, value.clone());
} }
} }
@ -3711,7 +3709,7 @@ impl VirtualMethods for Element {
fn adopting_steps(&self, old_doc: &Document) { fn adopting_steps(&self, old_doc: &Document) {
self.super_type().unwrap().adopting_steps(old_doc); 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(); self.tag_name.clear();
} }
} }
@ -3737,8 +3735,7 @@ impl SelectorsElement for DomRoot<Element> {
} }
fn containing_shadow_host(&self) -> Option<Self> { fn containing_shadow_host(&self) -> Option<Self> {
self.upcast::<Node>() self.containing_shadow_root()
.containing_shadow_root()
.map(|shadow_root| shadow_root.Host()) .map(|shadow_root| shadow_root.Host())
} }
@ -4004,7 +4001,7 @@ impl Element {
rect.size = Size2D::<i32>::new(viewport_dimensions.width, viewport_dimensions.height); 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 rect
} }
@ -4282,7 +4279,7 @@ impl Element {
// https://html.spec.whatwg.org/multipage/#cannot-navigate // https://html.spec.whatwg.org/multipage/#cannot-navigate
pub fn cannot_navigate(&self) -> bool { pub fn cannot_navigate(&self) -> bool {
let document = document_from_node(self); let document = self.owner_document();
// Step 1. // Step 1.
!document.is_fully_active() || !document.is_fully_active() ||
@ -4441,7 +4438,7 @@ impl TaskOnce for ElementPerformFullscreenEnter {
fn run_once(self) { fn run_once(self) {
let element = self.element.root(); let element = self.element.root();
let promise = self.promise.root(); let promise = self.promise.root();
let document = document_from_node(&*element); let document = element.owner_document();
// Step 7.1 // Step 7.1
if self.error || !element.fullscreen_element_ready_check() { if self.error || !element.fullscreen_element_ready_check() {
@ -4485,7 +4482,7 @@ impl TaskOnce for ElementPerformFullscreenExit {
#[allow(crown::unrooted_must_root)] #[allow(crown::unrooted_must_root)]
fn run_once(self) { fn run_once(self) {
let element = self.element.root(); let element = self.element.root();
let document = document_from_node(&*element); let document = element.owner_document();
// TODO Step 9.1-5 // TODO Step 9.1-5
// Step 9.6 // Step 9.6
element.set_fullscreen_state(false); element.set_fullscreen_state(false);
@ -4548,7 +4545,7 @@ pub(crate) fn referrer_policy_for_element(element: &Element) -> ReferrerPolicy {
element element
.get_attribute_by_name(DOMString::from_string(String::from("referrerpolicy"))) .get_attribute_by_name(DOMString::from_string(String::from("referrerpolicy")))
.map(|attribute: DomRoot<Attr>| determine_policy_for_token(&attribute.Value())) .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> { 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::file::File;
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlformelement::{FormDatum, FormDatumValue, HTMLFormElement}; 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::nodelist::NodeList;
use crate::dom::validation::{is_barred_by_datalist_ancestor, Validatable}; use crate::dom::validation::{is_barred_by_datalist_ancestor, Validatable};
use crate::dom::validitystate::{ValidationFlags, ValidityState}; use crate::dom::validitystate::{ValidationFlags, ValidityState};
@ -88,7 +88,7 @@ impl ElementInternals {
} }
pub fn new(element: &HTMLElement) -> DomRoot<ElementInternals> { pub fn new(element: &HTMLElement) -> DomRoot<ElementInternals> {
let global = window_from_node(element); let global = element.owner_window();
reflect_dom_object( reflect_dom_object(
Box::new(ElementInternals::new_inherited(element)), Box::new(ElementInternals::new_inherited(element)),
&*global, &*global,
@ -348,7 +348,7 @@ impl Validatable for ElementInternals {
debug_assert!(self.is_target_form_associated()); debug_assert!(self.is_target_form_associated());
self.validity_state.or_init(|| { self.validity_state.or_init(|| {
ValidityState::new( ValidityState::new(
&window_from_node(self.target_element.upcast::<Node>()), &self.target_element.owner_window(),
self.target_element.upcast(), 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::event::{Event, EventBubbles, EventCancelable, EventStatus};
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlformelement::FormControlElementHelpers; 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::virtualmethods::VirtualMethods;
use crate::dom::window::Window; use crate::dom::window::Window;
use crate::dom::workerglobalscope::WorkerGlobalScope; use crate::dom::workerglobalscope::WorkerGlobalScope;
@ -501,7 +501,7 @@ impl EventTarget {
// Step 3.1 // Step 3.1
let element = self.downcast::<Element>(); let element = self.downcast::<Element>();
let document = match element { let document = match element {
Some(element) => document_from_node(element), Some(element) => element.owner_document(),
None => self.downcast::<Window>().unwrap().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::htmlelement::HTMLElement;
use crate::dom::htmlimageelement::HTMLImageElement; use crate::dom::htmlimageelement::HTMLImageElement;
use crate::dom::mouseevent::MouseEvent; 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::urlhelper::UrlHelper;
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
use crate::links::{follow_hyperlink, LinkRelations}; 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 // 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. // 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()); let url = document.encoding_parse_a_url(&attribute.value());
// Step 4. If url is not failure, then set this element's url to url. // 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::document::Document;
use crate::dom::element::{AttributeMutation, Element}; use crate::dom::element::{AttributeMutation, Element};
use crate::dom::htmlelement::HTMLElement; 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::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -60,7 +60,7 @@ impl HTMLBaseElement {
"The frozen base url is only defined for base elements \ "The frozen base url is only defined for base elements \
that have a base url.", that have a base url.",
); );
let document = document_from_node(self); let document = self.owner_document();
let base = document.fallback_base_url(); let base = document.fallback_base_url();
let parsed = base.join(&href.value()); let parsed = base.join(&href.value());
parsed.unwrap_or(base) parsed.unwrap_or(base)
@ -74,7 +74,7 @@ impl HTMLBaseElement {
} }
if self.upcast::<Element>().has_attribute(&local_name!("href")) { if self.upcast::<Element>().has_attribute(&local_name!("href")) {
let document = document_from_node(self); let document = self.owner_document();
document.refresh_base_element(); document.refresh_base_element();
} }
} }
@ -84,7 +84,7 @@ impl HTMLBaseElementMethods<crate::DomTypeHolder> for HTMLBaseElement {
// https://html.spec.whatwg.org/multipage/#dom-base-href // https://html.spec.whatwg.org/multipage/#dom-base-href
fn Href(&self) -> DOMString { fn Href(&self) -> DOMString {
// Step 1. // Step 1.
let document = document_from_node(self); let document = self.owner_document();
// Step 2. // Step 2.
let attr = self let attr = self
@ -120,7 +120,7 @@ impl VirtualMethods for HTMLBaseElement {
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
self.super_type().unwrap().attribute_mutated(attr, mutation); self.super_type().unwrap().attribute_mutated(attr, mutation);
if *attr.local_name() == local_name!("href") { 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::element::{AttributeMutation, Element, LayoutElementHelpers};
use crate::dom::eventtarget::EventTarget; use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement; 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::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -86,10 +86,8 @@ impl HTMLBodyElementMethods<crate::DomTypeHolder> for HTMLBodyElement {
// https://html.spec.whatwg.org/multipage/#dom-body-background // https://html.spec.whatwg.org/multipage/#dom-body-background
fn SetBackground(&self, input: DOMString, can_gc: CanGc) { fn SetBackground(&self, input: DOMString, can_gc: CanGc) {
let value = AttrValue::from_resolved_url( let value =
&document_from_node(self).base_url().get_arc(), AttrValue::from_resolved_url(&self.owner_document().base_url().get_arc(), input.into());
input.into(),
);
self.upcast::<Element>() self.upcast::<Element>()
.set_attribute(&local_name!("background"), value, can_gc); .set_attribute(&local_name!("background"), value, can_gc);
} }
@ -152,7 +150,7 @@ impl VirtualMethods for HTMLBodyElement {
return; return;
} }
let window = window_from_node(self); let window = self.owner_window();
window.prevent_layout_until_load_event(); window.prevent_layout_until_load_event();
if window.is_top_level() { if window.is_top_level() {
window.send_to_embedder(EmbedderMsg::HeadParsed); window.send_to_embedder(EmbedderMsg::HeadParsed);
@ -165,7 +163,7 @@ impl VirtualMethods for HTMLBodyElement {
AttrValue::from_legacy_color(value.into()) AttrValue::from_legacy_color(value.into())
}, },
local_name!("background") => AttrValue::from_resolved_url( local_name!("background") => AttrValue::from_resolved_url(
&document_from_node(self).base_url().get_arc(), &self.owner_document().base_url().get_arc(),
value.into(), value.into(),
), ),
_ => self _ => self
@ -178,7 +176,7 @@ impl VirtualMethods for HTMLBodyElement {
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
let do_super_mutate = match (attr.local_name(), mutation) { let do_super_mutate = match (attr.local_name(), mutation) {
(name, AttributeMutation::Set(_)) if name.starts_with("on") => { (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/ // https://html.spec.whatwg.org/multipage/
// #event-handlers-on-elements,-document-objects,-and-window-objects:event-handlers-3 // #event-handlers-on-elements,-document-objects,-and-window-objects:event-handlers-3
match name { match name {

View file

@ -26,7 +26,7 @@ use crate::dom::htmlformelement::{
FormControl, FormDatum, FormDatumValue, FormSubmitterElement, HTMLFormElement, ResetFrom, FormControl, FormDatum, FormDatumValue, FormSubmitterElement, HTMLFormElement, ResetFrom,
SubmittedFrom, 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::nodelist::NodeList;
use crate::dom::validation::{is_barred_by_datalist_ancestor, Validatable}; use crate::dom::validation::{is_barred_by_datalist_ancestor, Validatable};
use crate::dom::validitystate::{ValidationFlags, ValidityState}; use crate::dom::validitystate::{ValidationFlags, ValidityState};
@ -333,7 +333,7 @@ impl Validatable for HTMLButtonElement {
fn validity_state(&self) -> DomRoot<ValidityState> { fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state 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 { 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::htmlelement::HTMLElement;
use crate::dom::mediastream::MediaStream; use crate::dom::mediastream::MediaStream;
use crate::dom::mediastreamtrack::MediaStreamTrack; 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::virtualmethods::VirtualMethods;
use crate::dom::webgl2renderingcontext::WebGL2RenderingContext; use crate::dom::webgl2renderingcontext::WebGL2RenderingContext;
use crate::dom::webglrenderingcontext::WebGLRenderingContext; use crate::dom::webglrenderingcontext::WebGLRenderingContext;
@ -197,7 +197,7 @@ impl HTMLCanvasElement {
_ => None, _ => None,
}; };
} }
let window = window_from_node(self); let window = self.owner_window();
let size = self.get_size(); let size = self.get_size();
let context = CanvasRenderingContext2D::new(window.upcast::<GlobalScope>(), self, size); let context = CanvasRenderingContext2D::new(window.upcast::<GlobalScope>(), self, size);
*self.context.borrow_mut() = Some(CanvasContext::Context2d(Dom::from_ref(&*context))); *self.context.borrow_mut() = Some(CanvasContext::Context2d(Dom::from_ref(&*context)));
@ -216,7 +216,7 @@ impl HTMLCanvasElement {
_ => None, _ => None,
}; };
} }
let window = window_from_node(self); let window = self.owner_window();
let size = self.get_size(); let size = self.get_size();
let attrs = Self::get_gl_attributes(cx, options)?; let attrs = Self::get_gl_attributes(cx, options)?;
let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self)); let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self));
@ -248,7 +248,7 @@ impl HTMLCanvasElement {
_ => None, _ => None,
}; };
} }
let window = window_from_node(self); let window = self.owner_window();
let size = self.get_size(); let size = self.get_size();
let attrs = Self::get_gl_attributes(cx, options)?; let attrs = Self::get_gl_attributes(cx, options)?;
let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self)); let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self));
@ -279,7 +279,7 @@ impl HTMLCanvasElement {
.recv() .recv()
.expect("Failed to get WebGPU channel") .expect("Failed to get WebGPU channel")
.map(|channel| { .map(|channel| {
let window = window_from_node(self); let window = self.owner_window();
let context = GPUCanvasContext::new(window.upcast::<GlobalScope>(), self, channel); let context = GPUCanvasContext::new(window.upcast::<GlobalScope>(), self, channel);
*self.context.borrow_mut() = Some(CanvasContext::WebGPU(Dom::from_ref(&*context))); *self.context.borrow_mut() = Some(CanvasContext::WebGPU(Dom::from_ref(&*context)));
context context

View file

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

View file

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

View file

@ -17,7 +17,7 @@ use crate::dom::document::Document;
use crate::dom::element::AttributeMutation; use crate::dom::element::AttributeMutation;
use crate::dom::eventtarget::EventTarget; use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement; 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::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -82,7 +82,7 @@ impl VirtualMethods for HTMLDetailsElement {
let counter = self.toggle_counter.get() + 1; let counter = self.toggle_counter.get() + 1;
self.toggle_counter.set(counter); self.toggle_counter.set(counter);
let window = window_from_node(self); let window = self.owner_window();
let this = Trusted::new(self); let this = Trusted::new(self);
// FIXME(nox): Why are errors silenced here? // FIXME(nox): Why are errors silenced here?
let _ = window.task_manager().dom_manipulation_task_source().queue( 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::element::Element;
use crate::dom::eventtarget::EventTarget; use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{window_from_node, Node}; use crate::dom::node::{Node, NodeTraits};
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
#[dom_struct] #[dom_struct]
@ -102,7 +102,7 @@ impl HTMLDialogElementMethods<crate::DomTypeHolder> for HTMLDialogElement {
fn Close(&self, return_value: Option<DOMString>) { fn Close(&self, return_value: Option<DOMString>) {
let element = self.upcast::<Element>(); let element = self.upcast::<Element>();
let target = self.upcast::<EventTarget>(); let target = self.upcast::<EventTarget>();
let win = window_from_node(self); let win = self.owner_window();
// Step 1 & 2 // Step 1 & 2
if element if element

View file

@ -46,9 +46,7 @@ use crate::dom::htmlhtmlelement::HTMLHtmlElement;
use crate::dom::htmlinputelement::{HTMLInputElement, InputType}; use crate::dom::htmlinputelement::{HTMLInputElement, InputType};
use crate::dom::htmllabelelement::HTMLLabelElement; use crate::dom::htmllabelelement::HTMLLabelElement;
use crate::dom::htmltextareaelement::HTMLTextAreaElement; use crate::dom::htmltextareaelement::HTMLTextAreaElement;
use crate::dom::node::{ use crate::dom::node::{BindContext, Node, NodeTraits, ShadowIncluding, UnbindContext};
document_from_node, window_from_node, BindContext, Node, ShadowIncluding, UnbindContext,
};
use crate::dom::text::Text; use crate::dom::text::Text;
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -117,7 +115,7 @@ impl HTMLElement {
/// <https://html.spec.whatwg.org/multipage/#get-the-text-steps> /// <https://html.spec.whatwg.org/multipage/#get-the-text-steps>
fn get_inner_outer_text(&self, can_gc: CanGc) -> DOMString { fn get_inner_outer_text(&self, can_gc: CanGc) -> DOMString {
let node = self.upcast::<Node>(); let node = self.upcast::<Node>();
let window = window_from_node(node); let window = node.owner_window();
let element = self.as_element(); let element = self.as_element();
// Step 1. // Step 1.
@ -139,7 +137,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#the-style-attribute // https://html.spec.whatwg.org/multipage/#the-style-attribute
fn Style(&self) -> DomRoot<CSSStyleDeclaration> { fn Style(&self) -> DomRoot<CSSStyleDeclaration> {
self.style_decl.or_init(|| { self.style_decl.or_init(|| {
let global = window_from_node(self); let global = self.owner_window();
CSSStyleDeclaration::new( CSSStyleDeclaration::new(
&global, &global,
CSSStyleOwner::Element(Dom::from_ref(self.upcast())), 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 // https://html.spec.whatwg.org/multipage/#handler-onerror
fn GetOnerror(&self, can_gc: CanGc) -> Option<Rc<OnErrorEventHandlerNonNull>> { fn GetOnerror(&self, can_gc: CanGc) -> Option<Rc<OnErrorEventHandlerNonNull>> {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().GetOnerror() document.window().GetOnerror()
} else { } else {
@ -205,7 +203,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onerror // https://html.spec.whatwg.org/multipage/#handler-onerror
fn SetOnerror(&self, listener: Option<Rc<OnErrorEventHandlerNonNull>>) { fn SetOnerror(&self, listener: Option<Rc<OnErrorEventHandlerNonNull>>) {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().SetOnerror(listener) document.window().SetOnerror(listener)
} }
@ -219,7 +217,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onload // https://html.spec.whatwg.org/multipage/#handler-onload
fn GetOnload(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> { fn GetOnload(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().GetOnload() document.window().GetOnload()
} else { } else {
@ -234,7 +232,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onload // https://html.spec.whatwg.org/multipage/#handler-onload
fn SetOnload(&self, listener: Option<Rc<EventHandlerNonNull>>) { fn SetOnload(&self, listener: Option<Rc<EventHandlerNonNull>>) {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().SetOnload(listener) document.window().SetOnload(listener)
} }
@ -247,7 +245,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onblur // https://html.spec.whatwg.org/multipage/#handler-onblur
fn GetOnblur(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> { fn GetOnblur(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().GetOnblur() document.window().GetOnblur()
} else { } else {
@ -262,7 +260,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onblur // https://html.spec.whatwg.org/multipage/#handler-onblur
fn SetOnblur(&self, listener: Option<Rc<EventHandlerNonNull>>) { fn SetOnblur(&self, listener: Option<Rc<EventHandlerNonNull>>) {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().SetOnblur(listener) document.window().SetOnblur(listener)
} }
@ -275,7 +273,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onfocus // https://html.spec.whatwg.org/multipage/#handler-onfocus
fn GetOnfocus(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> { fn GetOnfocus(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().GetOnfocus() document.window().GetOnfocus()
} else { } else {
@ -290,7 +288,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onfocus // https://html.spec.whatwg.org/multipage/#handler-onfocus
fn SetOnfocus(&self, listener: Option<Rc<EventHandlerNonNull>>) { fn SetOnfocus(&self, listener: Option<Rc<EventHandlerNonNull>>) {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().SetOnfocus(listener) document.window().SetOnfocus(listener)
} }
@ -303,7 +301,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onresize // https://html.spec.whatwg.org/multipage/#handler-onresize
fn GetOnresize(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> { fn GetOnresize(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().GetOnresize() document.window().GetOnresize()
} else { } else {
@ -318,7 +316,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onresize // https://html.spec.whatwg.org/multipage/#handler-onresize
fn SetOnresize(&self, listener: Option<Rc<EventHandlerNonNull>>) { fn SetOnresize(&self, listener: Option<Rc<EventHandlerNonNull>>) {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().SetOnresize(listener) document.window().SetOnresize(listener)
} }
@ -331,7 +329,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onscroll // https://html.spec.whatwg.org/multipage/#handler-onscroll
fn GetOnscroll(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> { fn GetOnscroll(&self, can_gc: CanGc) -> Option<Rc<EventHandlerNonNull>> {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().GetOnscroll() document.window().GetOnscroll()
} else { } else {
@ -346,7 +344,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// https://html.spec.whatwg.org/multipage/#handler-onscroll // https://html.spec.whatwg.org/multipage/#handler-onscroll
fn SetOnscroll(&self, listener: Option<Rc<EventHandlerNonNull>>) { fn SetOnscroll(&self, listener: Option<Rc<EventHandlerNonNull>>) {
if self.is_body_or_frameset() { if self.is_body_or_frameset() {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().SetOnscroll(listener) document.window().SetOnscroll(listener)
} }
@ -412,7 +410,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
fn Focus(&self, can_gc: CanGc) { fn Focus(&self, can_gc: CanGc) {
// TODO: Mark the element as locked for focus and run the focusing steps. // TODO: Mark the element as locked for focus and run the focusing steps.
// https://html.spec.whatwg.org/multipage/#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); document.request_focus(Some(self.upcast()), FocusType::Element, can_gc);
} }
@ -423,7 +421,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
return; return;
} }
// https://html.spec.whatwg.org/multipage/#unfocusing-steps // 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); document.request_focus(None, FocusType::Element, can_gc);
} }
@ -434,7 +432,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
} }
let node = self.upcast::<Node>(); 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); let (element, _) = window.offset_parent_query(node, can_gc);
element element
@ -447,7 +445,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
} }
let node = self.upcast::<Node>(); 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); let (_, rect) = window.offset_parent_query(node, can_gc);
rect.origin.y.to_nearest_px() rect.origin.y.to_nearest_px()
@ -460,7 +458,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
} }
let node = self.upcast::<Node>(); 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); let (_, rect) = window.offset_parent_query(node, can_gc);
rect.origin.x.to_nearest_px() 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 // https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetwidth
fn OffsetWidth(&self, can_gc: CanGc) -> i32 { fn OffsetWidth(&self, can_gc: CanGc) -> i32 {
let node = self.upcast::<Node>(); 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); let (_, rect) = window.offset_parent_query(node, can_gc);
rect.size.width.to_nearest_px() 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 // https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetheight
fn OffsetHeight(&self, can_gc: CanGc) -> i32 { fn OffsetHeight(&self, can_gc: CanGc) -> i32 {
let node = self.upcast::<Node>(); 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); let (_, rect) = window.offset_parent_query(node, can_gc);
rect.size.height.to_nearest_px() rect.size.height.to_nearest_px()
@ -512,7 +510,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
}; };
let node = self.upcast::<Node>(); 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. // Step 2: Let next be this's next sibling.
let next = node.GetNextSibling(); 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 // Note: the element can pass this check without yet being a custom
// element, as long as there is a registered definition // element, as long as there is a registered definition
// that could upgrade it to one later. // 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); let definition = registry.lookup_definition(self.as_element().local_name(), None);
// Step 3: If definition is null, then throw an "NotSupportedError" DOMException // 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> /// <https://html.spec.whatwg.org/multipage/#rendered-text-fragment>
fn rendered_text_fragment(&self, input: DOMString, can_gc: CanGc) -> DomRoot<DocumentFragment> { 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. // 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); let fragment = DocumentFragment::new(&document, can_gc);
// Step 2: Let position be a position variable for input, initially pointing at the start // 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 evtarget = self.upcast::<EventTarget>();
let source_line = 1; //TODO(#9604) get current JS execution line let source_line = 1; //TODO(#9604) get current JS execution line
evtarget.set_event_handler_uncompiled( evtarget.set_event_handler_uncompiled(
window_from_node(self).get_url(), self.owner_window().get_url(),
source_line, source_line,
&name[2..], &name[2..],
// FIXME(ajeffrey): Convert directly from AttrValue to DOMString // 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::htmlelement::HTMLElement;
use crate::dom::htmlformelement::{FormControl, HTMLFormElement}; use crate::dom::htmlformelement::{FormControl, HTMLFormElement};
use crate::dom::htmllegendelement::HTMLLegendElement; 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::validation::Validatable;
use crate::dom::validitystate::ValidityState; use crate::dom::validitystate::ValidityState;
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
@ -88,7 +88,7 @@ impl HTMLFieldSetElement {
impl HTMLFieldSetElementMethods<crate::DomTypeHolder> for HTMLFieldSetElement { impl HTMLFieldSetElementMethods<crate::DomTypeHolder> for HTMLFieldSetElement {
// https://html.spec.whatwg.org/multipage/#dom-fieldset-elements // https://html.spec.whatwg.org/multipage/#dom-fieldset-elements
fn Elements(&self) -> DomRoot<HTMLCollection> { 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 element
.downcast::<HTMLElement>() .downcast::<HTMLElement>()
.is_some_and(HTMLElement::is_listed_element) .is_some_and(HTMLElement::is_listed_element)
@ -271,7 +271,7 @@ impl Validatable for HTMLFieldSetElement {
fn validity_state(&self) -> DomRoot<ValidityState> { fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state 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 { 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::htmlselectelement::HTMLSelectElement;
use crate::dom::htmltextareaelement::HTMLTextAreaElement; use crate::dom::htmltextareaelement::HTMLTextAreaElement;
use crate::dom::node::{ use crate::dom::node::{
document_from_node, window_from_node, BindContext, Node, NodeFlags, UnbindContext, BindContext, Node, NodeFlags, NodeTraits, UnbindContext, VecPreOrderInsertionHelper,
VecPreOrderInsertionHelper,
}; };
use crate::dom::nodelist::{NodeList, RadioListMode}; use crate::dom::nodelist::{NodeList, RadioListMode};
use crate::dom::radionodelist::RadioNodeList; use crate::dom::radionodelist::RadioNodeList;
@ -421,7 +420,7 @@ impl HTMLFormElementMethods<crate::DomTypeHolder> for HTMLFormElement {
let filter = Box::new(ElementsFilter { let filter = Box::new(ElementsFilter {
form: DomRoot::from_ref(self), form: DomRoot::from_ref(self),
}); });
let window = window_from_node(self); let window = self.owner_window();
HTMLFormControlsCollection::new(&window, self, filter) 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 // https://html.spec.whatwg.org/multipage/#the-form-element%3Adetermine-the-value-of-a-named-property
fn NamedGetter(&self, name: DOMString) -> Option<RadioNodeListOrElement> { fn NamedGetter(&self, name: DOMString) -> Option<RadioNodeListOrElement> {
let window = window_from_node(self); let window = self.owner_window();
let name = Atom::from(name); let name = Atom::from(name);
@ -687,7 +686,7 @@ impl HTMLFormElement {
} }
// Step 1, 3 // Step 1, 3
document_from_node(self).encoding() self.owner_document().encoding()
} }
// https://html.spec.whatwg.org/multipage/#text/plain-encoding-algorithm // https://html.spec.whatwg.org/multipage/#text/plain-encoding-algorithm
@ -735,7 +734,7 @@ impl HTMLFormElement {
return; return;
} }
// Step 3 // Step 3
let doc = document_from_node(self); let doc = self.owner_document();
let base = doc.base_url(); let base = doc.base_url();
// TODO: Handle browsing contexts (Step 4, 5) // TODO: Handle browsing contexts (Step 4, 5)
// Step 6 // Step 6
@ -1220,7 +1219,7 @@ impl HTMLFormElement {
// Step 3-6 // Step 3-6
let ret = self.get_unclean_dataset(submitter, encoding); let ret = self.get_unclean_dataset(submitter, encoding);
let window = window_from_node(self); let window = self.owner_window();
// Step 6 // Step 6
let form_data = FormData::new(Some(ret), &window.global(), can_gc); 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() { let new_owner = if self.is_listed() && has_form_id && elem.is_connected() {
// Step 3 // Step 3
let doc = document_from_node(node); let doc = node.owner_document();
let form_id = elem.get_string_attribute(&local_name!("form")); let form_id = elem.get_string_attribute(&local_name!("form"));
doc.GetElementById(form_id) doc.GetElementById(form_id)
.and_then(DomRoot::downcast::<HTMLFormElement>) .and_then(DomRoot::downcast::<HTMLFormElement>)
@ -1596,8 +1595,8 @@ pub trait FormControl: DomObject {
let node = elem.upcast::<Node>(); let node = elem.upcast::<Node>();
if self.is_listed() && !form_id.is_empty() && node.is_connected() { if self.is_listed() && !form_id.is_empty() && node.is_connected() {
let doc = document_from_node(node); node.owner_document()
doc.register_form_id_listener(form_id, self); .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")); let form_id = elem.get_string_attribute(&local_name!("form"));
if self.is_listed() && !form_id.is_empty() { if self.is_listed() && !form_id.is_empty() {
let doc = document_from_node(elem.upcast::<Node>()); elem.owner_document()
doc.unregister_form_id_listener(form_id, self); .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::bindings::root::DomRoot;
use crate::dom::document::Document; use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{document_from_node, Node}; use crate::dom::node::{Node, NodeTraits};
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
#[dom_struct] #[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::element::Element;
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlmetaelement::HTMLMetaElement; 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::userscripts::load_script;
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -56,7 +56,7 @@ impl HTMLHeadElement {
/// <https://html.spec.whatwg.org/multipage/#meta-referrer> /// <https://html.spec.whatwg.org/multipage/#meta-referrer>
pub fn set_document_referrer(&self) { pub fn set_document_referrer(&self) {
let doc = document_from_node(self); let doc = self.owner_document();
if doc.GetHead().as_deref() != Some(self) { if doc.GetHead().as_deref() != Some(self) {
return; return;
@ -87,7 +87,7 @@ impl HTMLHeadElement {
/// <https://html.spec.whatwg.org/multipage/#attr-meta-http-equiv-content-security-policy> /// <https://html.spec.whatwg.org/multipage/#attr-meta-http-equiv-content-security-policy>
pub fn set_content_security_policy(&self) { 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) { if doc.GetHead().as_deref() != Some(self) {
return; return;

View file

@ -37,7 +37,7 @@ use crate::dom::element::{
use crate::dom::eventtarget::EventTarget; use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlelement::HTMLElement; 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::virtualmethods::VirtualMethods;
use crate::dom::windowproxy::WindowProxy; use crate::dom::windowproxy::WindowProxy;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -105,7 +105,7 @@ impl HTMLIFrameElement {
if url.is_empty() { if url.is_empty() {
None None
} else { } 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()) .unwrap_or_else(|| ServoUrl::parse("about:blank").unwrap())
@ -148,7 +148,7 @@ impl HTMLIFrameElement {
Some(id) => id, Some(id) => id,
}; };
let document = document_from_node(self); let document = self.owner_document();
{ {
let load_blocker = &self.load_blocker; 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 old_pipeline_id = self.pipeline_id();
let new_pipeline_id = PipelineId::new(); let new_pipeline_id = PipelineId::new();
self.pending_pipeline_id.set(Some(new_pipeline_id)); self.pending_pipeline_id.set(Some(new_pipeline_id));
@ -256,8 +256,8 @@ impl HTMLIFrameElement {
.has_attribute(&local_name!("srcdoc")) .has_attribute(&local_name!("srcdoc"))
{ {
let url = ServoUrl::parse("about:srcdoc").unwrap(); let url = ServoUrl::parse("about:srcdoc").unwrap();
let document = document_from_node(self); let document = self.owner_document();
let window = window_from_node(self); let window = self.owner_window();
let pipeline_id = Some(window.upcast::<GlobalScope>().pipeline_id()); let pipeline_id = Some(window.upcast::<GlobalScope>().pipeline_id());
let mut load_data = LoadData::new( let mut load_data = LoadData::new(
LoadOrigin::Script(document.origin().immutable().clone()), LoadOrigin::Script(document.origin().immutable().clone()),
@ -277,7 +277,7 @@ impl HTMLIFrameElement {
return; return;
} }
let window = window_from_node(self); let window = self.owner_window();
// https://html.spec.whatwg.org/multipage/#attr-iframe-name // https://html.spec.whatwg.org/multipage/#attr-iframe-name
// Note: the spec says to set the name 'when the nested browsing context is created'. // 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 // Step 2.4: Let referrerPolicy be the current state of element's referrerpolicy content
// attribute. // attribute.
let document = document_from_node(self); let document = self.owner_document();
let referrer_policy_token = self.ReferrerPolicy(); let referrer_policy_token = self.ReferrerPolicy();
// Note: despite not being explicitly stated in the spec steps, this falls back to // 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) // compatible #4965](https://github.com/whatwg/html/issues/4965)
// //
let url = ServoUrl::parse("about:blank").unwrap(); let url = ServoUrl::parse("about:blank").unwrap();
let document = document_from_node(self); let document = self.owner_document();
let window = window_from_node(self); let window = self.owner_window();
let pipeline_id = Some(window.upcast::<GlobalScope>().pipeline_id()); let pipeline_id = Some(window.upcast::<GlobalScope>().pipeline_id());
let load_data = LoadData::new( let load_data = LoadData::new(
LoadOrigin::Script(document.origin().immutable().clone()), LoadOrigin::Script(document.origin().immutable().clone()),
@ -763,7 +763,7 @@ impl VirtualMethods for HTMLIFrameElement {
LoadBlocker::terminate(blocker, CanGc::note()); LoadBlocker::terminate(blocker, CanGc::note());
// https://html.spec.whatwg.org/multipage/#a-browsing-context-is-discarded // 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) = let (sender, receiver) =
ProfiledIpc::channel(self.global().time_profiler_chan().clone()).unwrap(); 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::htmlpictureelement::HTMLPictureElement;
use crate::dom::htmlsourceelement::HTMLSourceElement; use crate::dom::htmlsourceelement::HTMLSourceElement;
use crate::dom::mouseevent::MouseEvent; use crate::dom::mouseevent::MouseEvent;
use crate::dom::node::{ use crate::dom::node::{BindContext, Node, NodeDamage, NodeTraits, ShadowIncluding, UnbindContext};
document_from_node, window_from_node, BindContext, Node, NodeDamage, ShadowIncluding,
UnbindContext,
};
use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::promise::Promise; use crate::dom::promise::Promise;
use crate::dom::values::UNSIGNED_LONG_MAX; use crate::dom::values::UNSIGNED_LONG_MAX;
@ -357,7 +354,7 @@ pub(crate) fn image_fetch_request(
impl HTMLImageElement { impl HTMLImageElement {
/// Update the current image with a valid URL. /// Update the current image with a valid URL.
fn fetch_image(&self, img_url: &ServoUrl, can_gc: CanGc) { 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 image_cache = window.image_cache();
let sender = generate_cache_listener_for_element(self); let sender = generate_cache_listener_for_element(self);
let cache_result = image_cache.track_image( let cache_result = image_cache.track_image(
@ -393,8 +390,8 @@ impl HTMLImageElement {
} }
fn fetch_request(&self, img_url: &ServoUrl, id: PendingImageId) { fn fetch_request(&self, img_url: &ServoUrl, id: PendingImageId) {
let document = document_from_node(self); let document = self.owner_document();
let window = window_from_node(self); let window = self.owner_window();
let context = ImageContext { let context = ImageContext {
image_cache: window.image_cache(), image_cache: window.image_cache(),
@ -691,7 +688,7 @@ impl HTMLImageElement {
source_size_list: &mut SourceSizeList, source_size_list: &mut SourceSizeList,
_width: Option<Length>, _width: Option<Length>,
) -> Au { ) -> Au {
let document = document_from_node(self); let document = self.owner_document();
let quirks_mode = document.quirks_mode(); let quirks_mode = document.quirks_mode();
let result = source_size_list.evaluate(document.window().layout().device(), quirks_mode); let result = source_size_list.evaluate(document.window().layout().device(), quirks_mode);
result result
@ -699,7 +696,7 @@ impl HTMLImageElement {
/// <https://html.spec.whatwg.org/multipage/#matches-the-environment> /// <https://html.spec.whatwg.org/multipage/#matches-the-environment>
fn matches_environment(&self, media_query: String) -> bool { 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 quirks_mode = document.quirks_mode();
let document_url_data = UrlExtraData(document.url().get_arc()); let document_url_data = UrlExtraData(document.url().get_arc());
// FIXME(emilio): This should do the same that we do for other media // FIXME(emilio): This should do the same that we do for other media
@ -792,7 +789,8 @@ impl HTMLImageElement {
// Step 5 // Step 5
let mut best_candidate = max; let mut best_candidate = max;
let device_pixel_ratio = document_from_node(self) let device_pixel_ratio = self
.owner_document()
.window() .window()
.window_size() .window_size()
.device_pixel_ratio .device_pixel_ratio
@ -821,7 +819,7 @@ impl HTMLImageElement {
request.source_url = Some(src.clone()); request.source_url = Some(src.clone());
request.image = None; request.image = None;
request.metadata = None; request.metadata = None;
let document = document_from_node(self); let document = self.owner_document();
LoadBlocker::terminate(&request.blocker, can_gc); LoadBlocker::terminate(&request.blocker, can_gc);
*request.blocker.borrow_mut() = *request.blocker.borrow_mut() =
Some(LoadBlocker::new(&document, LoadType::Image(url.clone()))); 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 /// Step 8-12 of html.spec.whatwg.org/multipage/#update-the-image-data
fn update_the_image_data_sync_steps(&self, can_gc: CanGc) { 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 window = document.window();
let task_source = window.task_manager().dom_manipulation_task_source(); let task_source = window.task_manager().dom_manipulation_task_source();
let this = Trusted::new(self); let this = Trusted::new(self);
@ -949,7 +947,7 @@ impl HTMLImageElement {
/// <https://html.spec.whatwg.org/multipage/#update-the-image-data> /// <https://html.spec.whatwg.org/multipage/#update-the-image-data>
pub fn update_the_image_data(&self, can_gc: CanGc) { 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 window = document.window();
let elem = self.upcast::<Element>(); let elem = self.upcast::<Element>();
let src = elem.get_url_attribute(&local_name!("src")); let src = elem.get_url_attribute(&local_name!("src"));
@ -1072,7 +1070,7 @@ impl HTMLImageElement {
let trusted_node = Trusted::new(elem); let trusted_node = Trusted::new(elem);
let (responder_sender, responder_receiver) = ipc::channel().unwrap(); let (responder_sender, responder_receiver) = ipc::channel().unwrap();
let window = window_from_node(elem); let window = elem.owner_window();
let (task_source, canceller) = window let (task_source, canceller) = window
.task_manager() .task_manager()
.networking_task_source_with_canceller(); .networking_task_source_with_canceller();
@ -1106,7 +1104,7 @@ impl HTMLImageElement {
} }
let elem = self.upcast::<Element>(); 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); let has_pending_request = matches!(self.image_request.get(), ImageRequestPhase::Pending);
// Step 2 // Step 2
@ -1152,7 +1150,7 @@ impl HTMLImageElement {
can_gc, can_gc,
); );
let window = window_from_node(self); let window = self.owner_window();
let image_cache = window.image_cache(); let image_cache = window.image_cache();
// Step 14 // Step 14
@ -1203,7 +1201,7 @@ impl HTMLImageElement {
// Step 2 for <https://html.spec.whatwg.org/multipage/#dom-img-decode> // Step 2 for <https://html.spec.whatwg.org/multipage/#dom-img-decode>
fn react_to_decode_image_sync_steps(&self, promise: Rc<Promise>) { 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> // Step 2.1 of <https://html.spec.whatwg.org/multipage/#dom-img-decode>
if !document.is_fully_active() || if !document.is_fully_active() ||
matches!(self.current_request.borrow().state, State::Broken) matches!(self.current_request.borrow().state, State::Broken)
@ -1233,7 +1231,7 @@ impl HTMLImageElement {
} }
fn reject_image_decode_promises(&self) { 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() { for promise in self.image_decode_promises.borrow().iter() {
promise.reject_native(&DOMException::new( promise.reject_native(&DOMException::new(
&document.global(), &document.global(),
@ -1251,7 +1249,7 @@ impl HTMLImageElement {
selected_pixel_density: f64, selected_pixel_density: f64,
) { ) {
let this = Trusted::new(self); let this = Trusted::new(self);
let window = window_from_node(self); let window = self.owner_window();
let src = src.0; let src = src.0;
let _ = window.task_manager().dom_manipulation_task_source().queue( let _ = window.task_manager().dom_manipulation_task_source().queue(
task!(image_load_event: move || { task!(image_load_event: move || {
@ -1369,7 +1367,8 @@ impl HTMLImageElement {
return None; return None;
} }
let useMapElements = document_from_node(self) let useMapElements = self
.owner_document()
.upcast::<Node>() .upcast::<Node>()
.traverse_preorder(ShadowIncluding::No) .traverse_preorder(ShadowIncluding::No)
.filter_map(DomRoot::downcast::<HTMLMapElement>) .filter_map(DomRoot::downcast::<HTMLMapElement>)
@ -1847,7 +1846,7 @@ impl VirtualMethods for HTMLImageElement {
if let Some(s) = self.super_type() { if let Some(s) = self.super_type() {
s.bind_to_tree(context); s.bind_to_tree(context);
} }
let document = document_from_node(self); let document = self.owner_document();
if context.tree_connected { if context.tree_connected {
document.register_responsive_image(self); document.register_responsive_image(self);
} }
@ -1863,7 +1862,7 @@ impl VirtualMethods for HTMLImageElement {
fn unbind_from_tree(&self, context: &UnbindContext) { fn unbind_from_tree(&self, context: &UnbindContext) {
self.super_type().unwrap().unbind_from_tree(context); self.super_type().unwrap().unbind_from_tree(context);
let document = document_from_node(self); let document = self.owner_document();
document.unregister_responsive_image(self); document.unregister_responsive_image(self);
// The element is removed from a picture parent element // 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::keyboardevent::KeyboardEvent;
use crate::dom::mouseevent::MouseEvent; use crate::dom::mouseevent::MouseEvent;
use crate::dom::node::{ use crate::dom::node::{
document_from_node, window_from_node, BindContext, CloneChildrenFlag, Node, NodeDamage, BindContext, CloneChildrenFlag, Node, NodeDamage, NodeTraits, ShadowIncluding, UnbindContext,
ShadowIncluding, UnbindContext,
}; };
use crate::dom::nodelist::NodeList; use crate::dom::nodelist::NodeList;
use crate::dom::textcontrol::{TextControlElement, TextControlSelection}; use crate::dom::textcontrol::{TextControlElement, TextControlSelection};
@ -1271,7 +1270,7 @@ impl HTMLInputElementMethods<crate::DomTypeHolder> for HTMLInputElement {
}, },
ValueMode::Filename => { ValueMode::Filename => {
if value.is_empty() { if value.is_empty() {
let window = window_from_node(self); let window = self.owner_window();
let fl = FileList::new(&window, vec![]); let fl = FileList::new(&window, vec![]);
self.filelist.set(Some(&fl)); self.filelist.set(Some(&fl));
} else { } else {
@ -1842,7 +1841,7 @@ impl HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#file-upload-state-(type=file) // https://html.spec.whatwg.org/multipage/#file-upload-state-(type=file)
// Select files by invoking UI or by passed in argument // Select files by invoking UI or by passed in argument
fn select_files(&self, opt_test_paths: Option<Vec<DOMString>>, can_gc: CanGc) { 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 origin = get_blob_origin(&window.get_url());
let resource_threads = window.upcast::<GlobalScope>().resource_threads(); let resource_threads = window.upcast::<GlobalScope>().resource_threads();
@ -2064,7 +2063,7 @@ impl HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#implicit-submission // https://html.spec.whatwg.org/multipage/#implicit-submission
#[allow(unsafe_code)] #[allow(unsafe_code)]
fn implicit_submission(&self, can_gc: CanGc) { fn implicit_submission(&self, can_gc: CanGc) {
let doc = document_from_node(self); let doc = self.owner_document();
let node = doc.upcast::<Node>(); let node = doc.upcast::<Node>();
let owner = self.form_owner(); let owner = self.form_owner();
let form = match owner { let form = match owner {
@ -2319,7 +2318,7 @@ impl VirtualMethods for HTMLInputElement {
} }
if new_type == InputType::File { if new_type == InputType::File {
let window = window_from_node(self); let window = self.owner_window();
let filelist = FileList::new(&window, vec![]); let filelist = FileList::new(&window, vec![]);
self.filelist.set(Some(&filelist)); 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 // the space key. There's no nice way to catch this so let's use this for
// now. // now.
if let Some(point_in_target) = mouse_event.point_in_target() { 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( let index = window.text_index_query(
self.upcast::<Node>(), self.upcast::<Node>(),
point_in_target, point_in_target,
@ -2577,7 +2576,7 @@ impl VirtualMethods for HTMLInputElement {
self.input_type().is_textual_or_password() self.input_type().is_textual_or_password()
{ {
if event.IsTrusted() { if event.IsTrusted() {
let window = window_from_node(self); let window = self.owner_window();
window window
.task_manager() .task_manager()
.user_interaction_task_source() .user_interaction_task_source()
@ -2656,7 +2655,7 @@ impl Validatable for HTMLInputElement {
fn validity_state(&self) -> DomRoot<ValidityState> { fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state 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 { 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. // Step 1: If the element does not have a form owner, then return.
if let Some(form_owner) = self.form_owner() { if let Some(form_owner) = self.form_owner() {
// Step 2: If the element's node document is not fully active, then return. // 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() { if !document.is_fully_active() {
return; return;
@ -2852,7 +2851,7 @@ impl Activatable for HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#reset-button-state-(type=reset):activation-behavior // 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. // Step 1: If the element does not have a form owner, then return.
if let Some(form_owner) = self.form_owner() { 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. // Step 2: If the element's node document is not fully active, then return.
if !document.is_fully_active() { if !document.is_fully_active() {

View file

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

View file

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

View file

@ -20,7 +20,7 @@ use crate::dom::document::Document;
use crate::dom::element::{AttributeMutation, Element}; use crate::dom::element::{AttributeMutation, Element};
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlformelement::{FormControl, HTMLFormElement}; 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::validation::Validatable;
use crate::dom::validitystate::ValidityState; use crate::dom::validitystate::ValidityState;
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
@ -139,7 +139,7 @@ impl Validatable for HTMLObjectElement {
fn validity_state(&self) -> DomRoot<ValidityState> { fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state 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 { 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::htmlcollection::{CollectionFilter, HTMLCollection};
use crate::dom::htmloptionelement::HTMLOptionElement; use crate::dom::htmloptionelement::HTMLOptionElement;
use crate::dom::htmlselectelement::HTMLSelectElement; 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::dom::window::Window;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -57,7 +57,7 @@ impl HTMLOptionsCollection {
fn add_new_elements(&self, count: u32, can_gc: CanGc) -> ErrorResult { fn add_new_elements(&self, count: u32, can_gc: CanGc) -> ErrorResult {
let root = self.upcast().root_node(); let root = self.upcast().root_node();
let document = document_from_node(&*root); let document = root.owner_document();
for _ in 0..count { for _ in 0..count {
let element = let element =

View file

@ -16,7 +16,7 @@ use crate::dom::document::Document;
use crate::dom::element::{AttributeMutation, Element}; use crate::dom::element::{AttributeMutation, Element};
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlformelement::{FormControl, HTMLFormElement}; 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::nodelist::NodeList;
use crate::dom::validation::Validatable; use crate::dom::validation::Validatable;
use crate::dom::validitystate::ValidityState; use crate::dom::validitystate::ValidityState;
@ -188,7 +188,7 @@ impl Validatable for HTMLOutputElement {
fn validity_state(&self) -> DomRoot<ValidityState> { fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state 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 { 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::event::{Event, EventBubbles, EventCancelable, EventStatus};
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{ use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node, NodeTraits};
document_from_node, window_from_node, ChildrenMutation, CloneChildrenFlag, Node,
};
use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
use crate::fetch::create_a_potential_cors_request; 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, // Step 11, Asynchronously complete this algorithm with script,
// which refers to step 26.6 "When the chosen algorithm asynchronously completes", // which refers to step 26.6 "When the chosen algorithm asynchronously completes",
// of https://html.spec.whatwg.org/multipage/#prepare-a-script // of https://html.spec.whatwg.org/multipage/#prepare-a-script
let document = document_from_node(elem); let document = elem.owner_document();
match script_kind { match script_kind {
ExternalScriptKind::Asap => document.asap_script_loaded(elem, load), ExternalScriptKind::Asap => document.asap_script_loaded(elem, load),
@ -537,7 +535,7 @@ impl ResourceTimingListener for ClassicContext {
} }
fn resource_timing_global(&self) -> DomRoot<GlobalScope> { 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, character_encoding: &'static Encoding,
) { ) {
// Step 1, 2. // Step 1, 2.
let doc = document_from_node(script); let doc = script.owner_document();
let request = script_fetch_request( let request = script_fetch_request(
url.clone(), url.clone(),
cors_setting, cors_setting,
@ -652,7 +650,7 @@ impl HTMLScriptElement {
self.already_started.set(true); self.already_started.set(true);
// Step 12. // Step 12.
let doc = document_from_node(self); let doc = self.owner_document();
if self.parser_inserted.get() && *self.parser_document != *doc { if self.parser_inserted.get() && *self.parser_document != *doc {
return; return;
} }
@ -916,7 +914,7 @@ impl HTMLScriptElement {
/// <https://html.spec.whatwg.org/multipage/#execute-the-script-block> /// <https://html.spec.whatwg.org/multipage/#execute-the-script-block>
pub fn execute(&self, result: ScriptResult) { pub fn execute(&self, result: ScriptResult) {
// Step 1. // Step 1.
let doc = document_from_node(self); let doc = self.owner_document();
if self.parser_inserted.get() && *doc != *self.parser_document { if self.parser_inserted.get() && *doc != *self.parser_document {
return; return;
} }
@ -940,7 +938,7 @@ impl HTMLScriptElement {
// Step 3. // Step 3.
let neutralized_doc = if script.external || script.type_ == ScriptType::Module { let neutralized_doc = if script.external || script.type_ == ScriptType::Module {
debug!("loading external script, url = {}", script.url); debug!("loading external script, url = {}", script.url);
let doc = document_from_node(self); let doc = self.owner_document();
doc.incr_ignore_destructive_writes_counter(); doc.incr_ignore_destructive_writes_counter();
Some(doc) Some(doc)
} else { } else {
@ -948,7 +946,7 @@ impl HTMLScriptElement {
}; };
// Step 4. // Step 4.
let document = document_from_node(self); let document = self.owner_document();
let old_script = document.GetCurrentScript(); let old_script = document.GetCurrentScript();
match script.type_ { match script.type_ {
@ -982,13 +980,13 @@ impl HTMLScriptElement {
pub fn run_a_classic_script(&self, script: &ScriptOrigin, can_gc: CanGc) { pub fn run_a_classic_script(&self, script: &ScriptOrigin, can_gc: CanGc) {
// TODO use a settings object rather than this element's document/window // TODO use a settings object rather than this element's document/window
// Step 2 // Step 2
let document = document_from_node(self); let document = self.owner_document();
if !document.is_fully_active() || !document.is_scripting_enabled() { if !document.is_fully_active() || !document.is_scripting_enabled() {
return; return;
} }
// Steps 4-10 // Steps 4-10
let window = window_from_node(self); let window = self.owner_window();
let line_number = if script.external { let line_number = if script.external {
1 1
} else { } else {
@ -1012,13 +1010,13 @@ impl HTMLScriptElement {
pub fn run_a_module_script(&self, script: &ScriptOrigin, _rethrow_errors: bool, can_gc: CanGc) { 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 // TODO use a settings object rather than this element's document/window
// Step 2 // Step 2
let document = document_from_node(self); let document = self.owner_document();
if !document.is_fully_active() || !document.is_scripting_enabled() { if !document.is_fully_active() || !document.is_scripting_enabled() {
return; return;
} }
// Step 4 // Step 4
let window = window_from_node(self); let window = self.owner_window();
let global = window.upcast::<GlobalScope>(); let global = window.upcast::<GlobalScope>();
let _aes = AutoEntryScript::new(global); let _aes = AutoEntryScript::new(global);
@ -1063,7 +1061,7 @@ impl HTMLScriptElement {
} }
pub fn queue_error_event(&self) { pub fn queue_error_event(&self) {
let window = window_from_node(self); let window = self.owner_window();
window window
.task_manager() .task_manager()
.dom_manipulation_task_source() .dom_manipulation_task_source()
@ -1165,7 +1163,7 @@ impl HTMLScriptElement {
cancelable: EventCancelable, cancelable: EventCancelable,
can_gc: CanGc, can_gc: CanGc,
) -> EventStatus { ) -> EventStatus {
let window = window_from_node(self); let window = self.owner_window();
let event = Event::new(window.upcast(), type_, bubbles, cancelable, can_gc); let event = Event::new(window.upcast(), type_, bubbles, cancelable, can_gc);
event.fire(self.upcast(), 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 // 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 // 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. // running any scripts until the DOM tree is safe for interactions.
document_from_node(self).add_delayed_task(task!(ScriptPrepare: move || { self.owner_document()
let this = script.root(); .add_delayed_task(task!(ScriptPrepare: move || {
this.prepare(CanGc::note()); 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::htmloptgroupelement::HTMLOptGroupElement;
use crate::dom::htmloptionelement::HTMLOptionElement; use crate::dom::htmloptionelement::HTMLOptionElement;
use crate::dom::htmloptionscollection::HTMLOptionsCollection; 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::nodelist::NodeList;
use crate::dom::validation::{is_barred_by_datalist_ancestor, Validatable}; use crate::dom::validation::{is_barred_by_datalist_ancestor, Validatable};
use crate::dom::validitystate::{ValidationFlags, ValidityState}; 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 // https://html.spec.whatwg.org/multipage/#dom-select-options
fn Options(&self) -> DomRoot<HTMLOptionsCollection> { fn Options(&self) -> DomRoot<HTMLOptionsCollection> {
self.options.or_init(|| { self.options.or_init(|| {
let window = window_from_node(self); let window = self.owner_window();
HTMLOptionsCollection::new(&window, self, Box::new(OptionsFilter)) HTMLOptionsCollection::new(&window, self, Box::new(OptionsFilter))
}) })
} }
@ -510,7 +510,7 @@ impl Validatable for HTMLSelectElement {
fn validity_state(&self) -> DomRoot<ValidityState> { fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state 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 { 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::document::Document;
use crate::dom::element::{Element, ElementCreator}; use crate::dom::element::{Element, ElementCreator};
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{ use crate::dom::node::{BindContext, ChildrenMutation, Node, NodeTraits, UnbindContext};
document_from_node, stylesheets_owner_from_node, window_from_node, BindContext,
ChildrenMutation, Node, UnbindContext,
};
use crate::dom::stylesheet::StyleSheet as DOMStyleSheet; use crate::dom::stylesheet::StyleSheet as DOMStyleSheet;
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -91,8 +88,8 @@ impl HTMLStyleElement {
let element = self.upcast::<Element>(); let element = self.upcast::<Element>();
assert!(node.is_connected()); assert!(node.is_connected());
let window = window_from_node(node); let window = node.owner_window();
let doc = document_from_node(self); let doc = self.owner_document();
let mq_attribute = element.get_attribute(&ns!(), &local_name!("media")); let mq_attribute = element.get_attribute(&ns!(), &local_name!("media"));
let mq_str = match mq_attribute { let mq_str = match mq_attribute {
@ -136,7 +133,7 @@ impl HTMLStyleElement {
// No subresource loads were triggered, queue load event // No subresource loads were triggered, queue load event
if self.pending_loads.get() == 0 { if self.pending_loads.get() == 0 {
let window = window_from_node(self); let window = self.owner_window();
window window
.task_manager() .task_manager()
.dom_manipulation_task_source() .dom_manipulation_task_source()
@ -149,7 +146,7 @@ impl HTMLStyleElement {
// FIXME(emilio): This is duplicated with HTMLLinkElement::set_stylesheet. // FIXME(emilio): This is duplicated with HTMLLinkElement::set_stylesheet.
#[allow(crown::unrooted_must_root)] #[allow(crown::unrooted_must_root)]
pub fn set_stylesheet(&self, s: Arc<Stylesheet>) { 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() { if let Some(ref s) = *self.stylesheet.borrow() {
stylesheets_owner.remove_stylesheet(self.upcast(), s) stylesheets_owner.remove_stylesheet(self.upcast(), s)
} }
@ -166,7 +163,7 @@ impl HTMLStyleElement {
self.get_stylesheet().map(|sheet| { self.get_stylesheet().map(|sheet| {
self.cssom_stylesheet.or_init(|| { self.cssom_stylesheet.or_init(|| {
CSSStyleSheet::new( CSSStyleSheet::new(
&window_from_node(self), &self.owner_window(),
self.upcast::<Element>(), self.upcast::<Element>(),
"text/css".into(), "text/css".into(),
None, // todo handle location None, // todo handle location
@ -235,7 +232,8 @@ impl VirtualMethods for HTMLStyleElement {
if context.tree_connected { if context.tree_connected {
if let Some(s) = self.stylesheet.borrow_mut().take() { if let Some(s) = self.stylesheet.borrow_mut().take() {
self.clean_stylesheet_ownership(); 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::htmltablecolelement::HTMLTableColElement;
use crate::dom::htmltablerowelement::HTMLTableRowElement; use crate::dom::htmltablerowelement::HTMLTableRowElement;
use crate::dom::htmltablesectionelement::HTMLTableSectionElement; 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::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -149,13 +149,8 @@ impl HTMLTableElement {
return section; return section;
} }
let section = HTMLTableSectionElement::new( let section =
atom.clone(), HTMLTableSectionElement::new(atom.clone(), None, &self.owner_document(), None, can_gc);
None,
&document_from_node(self),
None,
can_gc,
);
match *atom { match *atom {
local_name!("thead") => self.SetTHead(Some(&section)), local_name!("thead") => self.SetTHead(Some(&section)),
local_name!("tfoot") => self.SetTFoot(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 // https://html.spec.whatwg.org/multipage/#dom-table-rows
fn Rows(&self) -> DomRoot<HTMLCollection> { fn Rows(&self) -> DomRoot<HTMLCollection> {
let filter = self.get_rows(); 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 // https://html.spec.whatwg.org/multipage/#dom-table-caption
@ -225,7 +220,7 @@ impl HTMLTableElementMethods<crate::DomTypeHolder> for HTMLTableElement {
let caption = HTMLTableCaptionElement::new( let caption = HTMLTableCaptionElement::new(
local_name!("caption"), local_name!("caption"),
None, None,
&document_from_node(self), &self.owner_document(),
None, None,
can_gc, can_gc,
); );
@ -302,7 +297,7 @@ impl HTMLTableElementMethods<crate::DomTypeHolder> for HTMLTableElement {
fn TBodies(&self) -> DomRoot<HTMLCollection> { fn TBodies(&self) -> DomRoot<HTMLCollection> {
self.tbodies.or_init(|| { self.tbodies.or_init(|| {
HTMLCollection::new_with_filter_fn( HTMLCollection::new_with_filter_fn(
&window_from_node(self), &self.owner_window(),
self.upcast(), self.upcast(),
|element, root| { |element, root| {
element.is::<HTMLTableSectionElement>() && element.is::<HTMLTableSectionElement>() &&
@ -318,7 +313,7 @@ impl HTMLTableElementMethods<crate::DomTypeHolder> for HTMLTableElement {
let tbody = HTMLTableSectionElement::new( let tbody = HTMLTableSectionElement::new(
local_name!("tbody"), local_name!("tbody"),
None, None,
&document_from_node(self), &self.owner_document(),
None, None,
can_gc, can_gc,
); );
@ -346,7 +341,7 @@ impl HTMLTableElementMethods<crate::DomTypeHolder> for HTMLTableElement {
let new_row = HTMLTableRowElement::new( let new_row = HTMLTableRowElement::new(
local_name!("tr"), local_name!("tr"),
None, None,
&document_from_node(self), &self.owner_document(),
None, None,
can_gc, can_gc,
); );

View file

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

View file

@ -19,7 +19,7 @@ use crate::dom::element::{Element, LayoutElementHelpers};
use crate::dom::htmlcollection::HTMLCollection; use crate::dom::htmlcollection::HTMLCollection;
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmltablerowelement::HTMLTableRowElement; 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::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -64,14 +64,10 @@ impl HTMLTableSectionElement {
impl HTMLTableSectionElementMethods<crate::DomTypeHolder> for HTMLTableSectionElement { impl HTMLTableSectionElementMethods<crate::DomTypeHolder> for HTMLTableSectionElement {
// https://html.spec.whatwg.org/multipage/#dom-tbody-rows // https://html.spec.whatwg.org/multipage/#dom-tbody-rows
fn Rows(&self) -> DomRoot<HTMLCollection> { fn Rows(&self) -> DomRoot<HTMLCollection> {
HTMLCollection::new_with_filter_fn( HTMLCollection::new_with_filter_fn(&self.owner_window(), self.upcast(), |element, root| {
&window_from_node(self), element.is::<HTMLTableRowElement>() &&
self.upcast(), element.upcast::<Node>().GetParentNode().as_deref() == Some(root)
|element, root| { })
element.is::<HTMLTableRowElement>() &&
element.upcast::<Node>().GetParentNode().as_deref() == Some(root)
},
)
} }
// https://html.spec.whatwg.org/multipage/#dom-tbody-insertrow // 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::document::Document;
use crate::dom::documentfragment::DocumentFragment; use crate::dom::documentfragment::DocumentFragment;
use crate::dom::htmlelement::HTMLElement; 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::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -64,7 +64,7 @@ impl HTMLTemplateElementMethods<crate::DomTypeHolder> for HTMLTemplateElement {
/// <https://html.spec.whatwg.org/multipage/#dom-template-content> /// <https://html.spec.whatwg.org/multipage/#dom-template-content>
fn Content(&self, can_gc: CanGc) -> DomRoot<DocumentFragment> { fn Content(&self, can_gc: CanGc) -> DomRoot<DocumentFragment> {
self.contents.or_init(|| { self.contents.or_init(|| {
let doc = document_from_node(self); let doc = self.owner_document();
doc.appropriate_template_contents_owner_document(can_gc) doc.appropriate_template_contents_owner_document(can_gc)
.CreateDocumentFragment(can_gc) .CreateDocumentFragment(can_gc)
}) })
@ -80,8 +80,9 @@ impl VirtualMethods for HTMLTemplateElement {
fn adopting_steps(&self, old_doc: &Document) { fn adopting_steps(&self, old_doc: &Document) {
self.super_type().unwrap().adopting_steps(old_doc); self.super_type().unwrap().adopting_steps(old_doc);
// Step 1. // Step 1.
let doc = let doc = self
document_from_node(self).appropriate_template_contents_owner_document(CanGc::note()); .owner_document()
.appropriate_template_contents_owner_document(CanGc::note());
// Step 2. // Step 2.
Node::adopt(self.Content(CanGc::note()).upcast(), &doc); 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::htmlinputelement::HTMLInputElement;
use crate::dom::keyboardevent::KeyboardEvent; use crate::dom::keyboardevent::KeyboardEvent;
use crate::dom::node::{ use crate::dom::node::{
window_from_node, BindContext, ChildrenMutation, CloneChildrenFlag, Node, NodeDamage, BindContext, ChildrenMutation, CloneChildrenFlag, Node, NodeDamage, NodeTraits, UnbindContext,
UnbindContext,
}; };
use crate::dom::nodelist::NodeList; use crate::dom::nodelist::NodeList;
use crate::dom::textcontrol::{TextControlElement, TextControlSelection}; use crate::dom::textcontrol::{TextControlElement, TextControlSelection};
@ -651,7 +650,7 @@ impl VirtualMethods for HTMLTextAreaElement {
} }
} else if event.type_() == atom!("keypress") && !event.DefaultPrevented() { } else if event.type_() == atom!("keypress") && !event.DefaultPrevented() {
if event.IsTrusted() { if event.IsTrusted() {
let window = window_from_node(self); let window = self.owner_window();
window window
.task_manager() .task_manager()
.user_interaction_task_source() .user_interaction_task_source()
@ -714,7 +713,7 @@ impl Validatable for HTMLTextAreaElement {
fn validity_state(&self) -> DomRoot<ValidityState> { fn validity_state(&self) -> DomRoot<ValidityState> {
self.validity_state 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 { 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::element::{AttributeMutation, Element, LayoutElementHelpers};
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlmediaelement::{HTMLMediaElement, ReadyState}; 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::performanceresourcetiming::InitiatorType;
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
use crate::fetch::FetchCanceller; use crate::fetch::FetchCanceller;
@ -125,7 +125,7 @@ impl HTMLVideoElement {
let sent_resize = if self.htmlmediaelement.get_ready_state() == ReadyState::HaveNothing { let sent_resize = if self.htmlmediaelement.get_ready_state() == ReadyState::HaveNothing {
None None
} else { } else {
let window = window_from_node(self); let window = self.owner_window();
let task_source = window.task_manager().media_element_task_source(); let task_source = window.task_manager().media_element_task_source();
task_source.queue_simple_event(self.upcast(), atom!("resize"), &window); task_source.queue_simple_event(self.upcast(), atom!("resize"), &window);
Some((width, height)) Some((width, height))
@ -168,7 +168,7 @@ impl HTMLVideoElement {
} }
// Step 3. // 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, Ok(url) => url,
Err(_) => return, Err(_) => return,
}; };
@ -176,7 +176,7 @@ impl HTMLVideoElement {
// Step 4. // Step 4.
// We use the image cache for poster frames so we save as much // We use the image cache for poster frames so we save as much
// network activity as possible. // network activity as possible.
let window = window_from_node(self); let window = self.owner_window();
let image_cache = window.image_cache(); let image_cache = window.image_cache();
let sender = generate_cache_listener_for_element(self); let sender = generate_cache_listener_for_element(self);
let cache_result = image_cache.track_image( let cache_result = image_cache.track_image(
@ -211,7 +211,7 @@ impl HTMLVideoElement {
can_gc: CanGc, can_gc: CanGc,
) { ) {
// Continuation of step 4. // 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()) let request = RequestBuilder::new(poster_url.clone(), document.global().get_referrer())
.destination(Destination::Image) .destination(Destination::Image)
.credentials_mode(CredentialsMode::Include) .credentials_mode(CredentialsMode::Include)
@ -228,7 +228,7 @@ impl HTMLVideoElement {
let blocker = &self.load_blocker; let blocker = &self.load_blocker;
LoadBlocker::terminate(blocker, can_gc); LoadBlocker::terminate(blocker, can_gc);
*blocker.borrow_mut() = Some(LoadBlocker::new( *blocker.borrow_mut() = Some(LoadBlocker::new(
&document_from_node(self), &self.owner_document(),
LoadType::Image(poster_url.clone()), 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 // 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. // 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> { 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 { impl PosterFrameFetchContext {
fn new(elem: &HTMLVideoElement, url: ServoUrl, id: PendingImageId) -> PosterFrameFetchContext { fn new(elem: &HTMLVideoElement, url: ServoUrl, id: PendingImageId) -> PosterFrameFetchContext {
let window = window_from_node(elem); let window = elem.owner_window();
PosterFrameFetchContext { PosterFrameFetchContext {
image_cache: window.image_cache(), image_cache: window.image_cache(),
elem: Trusted::new(elem), 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::bindings::inheritance::Castable;
use $crate::dom::element::Element; use $crate::dom::element::Element;
let element = self.upcast::<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 attr = element.get_attribute(&html5ever::ns!(), &html5ever::local_name!($htmlname));
let value = attr.as_ref().map(|attr| attr.value()); let value = attr.as_ref().map(|attr| attr.value());
let value = match value { let value = match value {
@ -410,7 +410,7 @@ macro_rules! define_event_handler(
macro_rules! define_window_owned_event_handler( macro_rules! define_window_owned_event_handler(
($handler: ty, $event_type: ident, $getter: ident, $setter: ident) => ( ($handler: ty, $event_type: ident, $getter: ident, $setter: ident) => (
fn $getter(&self) -> Option<::std::rc::Rc<$handler>> { fn $getter(&self) -> Option<::std::rc::Rc<$handler>> {
let document = document_from_node(self); let document = self.owner_document();
if document.has_browsing_context() { if document.has_browsing_context() {
document.window().$getter() document.window().$getter()
} else { } else {
@ -419,7 +419,7 @@ macro_rules! define_window_owned_event_handler(
} }
fn $setter(&self, listener: Option<::std::rc::Rc<$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() { if document.has_browsing_context() {
document.window().$setter(listener) 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::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
use crate::dom::bindings::str::DOMString; 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::dom::nodelist::NodeList;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -46,7 +46,7 @@ impl MutationRecord {
None, None,
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( pub fn character_data_mutated(
@ -65,7 +65,7 @@ impl MutationRecord {
None, None,
None, None,
)), )),
&*window_from_node(target), &*target.owner_window(),
CanGc::note(), CanGc::note(),
) )
} }
@ -77,7 +77,7 @@ impl MutationRecord {
next_sibling: Option<&Node>, next_sibling: Option<&Node>,
prev_sibling: Option<&Node>, prev_sibling: Option<&Node>,
) -> DomRoot<MutationRecord> { ) -> 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 added_nodes = added_nodes.map(|list| NodeList::new_simple_list_slice(&window, list));
let removed_nodes = let removed_nodes =
removed_nodes.map(|list| NodeList::new_simple_list_slice(&window, list)); 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 // https://dom.spec.whatwg.org/#dom-mutationrecord-addednodes
fn AddedNodes(&self) -> DomRoot<NodeList> { fn AddedNodes(&self) -> DomRoot<NodeList> {
self.added_nodes.or_init(|| { self.added_nodes
let window = window_from_node(&*self.target); .or_init(|| NodeList::empty(&self.target.owner_window()))
NodeList::empty(&window)
})
} }
// https://dom.spec.whatwg.org/#dom-mutationrecord-removednodes // https://dom.spec.whatwg.org/#dom-mutationrecord-removednodes
fn RemovedNodes(&self) -> DomRoot<NodeList> { fn RemovedNodes(&self) -> DomRoot<NodeList> {
self.removed_nodes.or_init(|| { self.removed_nodes
let window = window_from_node(&*self.target); .or_init(|| NodeList::empty(&self.target.owner_window()))
NodeList::empty(&window)
})
} }
// https://dom.spec.whatwg.org/#dom-mutationrecord-previoussibling // 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 // Spec says the choice of which global to create
// the mouse event on is not well-defined, // the mouse event on is not well-defined,
// and refers to heycam/webidl#135 // and refers to heycam/webidl#135
let win = window_from_node(self); let win = self.owner_window();
let mouse_event = MouseEvent::new( let mouse_event = MouseEvent::new(
&win, // ambiguous in spec &win, // ambiguous in spec
@ -813,7 +813,7 @@ impl Node {
/// Returns the rendered bounding content box if the element is rendered, /// Returns the rendered bounding content box if the element is rendered,
/// and none otherwise. /// and none otherwise.
pub fn bounding_content_box(&self, can_gc: CanGc) -> Option<Rect<Au>> { 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> { 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>> { 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> { 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> /// <https://drafts.csswg.org/cssom-view/#dom-element-scrollwidth>
@ -1044,7 +1044,7 @@ impl Node {
/// <https://dom.spec.whatwg.org/#dom-parentnode-queryselectorall> /// <https://dom.spec.whatwg.org/#dom-parentnode-queryselectorall>
#[allow(unsafe_code)] #[allow(unsafe_code)]
pub fn query_selector_all(&self, selectors: DOMString) -> Fallible<DomRoot<NodeList>> { 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)?; let iter = self.query_selector_iter(selectors)?;
Ok(NodeList::new_simple_list(&window, iter)) Ok(NodeList::new_simple_list(&window, iter))
} }
@ -1296,7 +1296,10 @@ impl Node {
} }
pub fn style(&self, can_gc: CanGc) -> Option<Arc<ComputedValues>> { 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; return None;
} }
self.style_data self.style_data
@ -2018,8 +2021,7 @@ impl Node {
}; };
// Step 4. // Step 4.
let document = document_from_node(parent); Node::adopt(node, &parent.owner_document());
Node::adopt(node, &document);
// Step 5. // Step 5.
Node::insert( Node::insert(
@ -2216,7 +2218,7 @@ impl Node {
if string.len() == 0 { if string.len() == 0 {
Node::replace_all(None, parent); Node::replace_all(None, parent);
} else { } 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); Node::replace_all(Some(text.upcast::<Node>()), parent);
}; };
} }
@ -2574,7 +2576,7 @@ impl Node {
/// <https://html.spec.whatwg.org/multipage/#fragment-serializing-algorithm-steps> /// <https://html.spec.whatwg.org/multipage/#fragment-serializing-algorithm-steps>
pub fn fragment_serialization_algorithm(&self, require_well_formed: bool) -> DOMString { pub fn fragment_serialization_algorithm(&self, require_well_formed: bool) -> DOMString {
// Step 1. Let context document be node's node document. // 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 // Step 2. If context document is an HTML document, return the result of HTML fragment serialization algorithm
// with node, false, and « ». // with node, false, and « ».
@ -2894,7 +2896,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
let previous_sibling = child.GetPreviousSibling(); let previous_sibling = child.GetPreviousSibling();
// Step 10. // Step 10.
let document = document_from_node(self); let document = self.owner_document();
Node::adopt(node, &document); Node::adopt(node, &document);
let removed_child = if node != child { 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> { pub(crate) trait NodeTraits {
derived.upcast().owner_doc() /// 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>( impl<T: DerivedFrom<Node> + DomObject> NodeTraits for T {
derived: &T, fn owner_document(&self) -> DomRoot<Document> {
) -> Option<DomRoot<ShadowRoot>> { self.upcast().owner_doc()
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)))
} }
}
pub fn window_from_node<T: DerivedFrom<Node> + DomObject>(derived: &T) -> DomRoot<Window> { fn owner_window(&self) -> DomRoot<Window> {
let document = document_from_node(derived); DomRoot::from_ref(self.owner_document().window())
DomRoot::from_ref(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 { 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::bindings::root::{Dom, DomRoot};
use crate::dom::domrectreadonly::DOMRectReadOnly; use crate::dom::domrectreadonly::DOMRectReadOnly;
use crate::dom::element::Element; 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::resizeobserverentry::ResizeObserverEntry;
use crate::dom::resizeobserversize::{ResizeObserverSize, ResizeObserverSizeImpl}; use crate::dom::resizeobserversize::{ResizeObserverSize, ResizeObserverSizeImpl};
use crate::dom::window::Window; use crate::dom::window::Window;
@ -111,7 +111,7 @@ impl ResizeObserver {
let width = box_size.width().to_f64_px(); let width = box_size.width().to_f64_px();
let height = box_size.height().to_f64_px(); let height = box_size.height().to_f64_px();
let size_impl = ResizeObserverSizeImpl::new(width, height); 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); let observer_size = ResizeObserverSize::new(&window, size_impl, can_gc);
// Note: content rect is built from content box size. // 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::bindings::str::DOMString;
use crate::dom::document::Document; use crate::dom::document::Document;
use crate::dom::eventtarget::EventTarget; 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::dom::range::Range;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -88,7 +88,7 @@ impl Selection {
return; return;
} }
let this = Trusted::new(self); let this = Trusted::new(self);
let window = window_from_node(&*self.document); let window = self.document.window();
window window
.task_manager() .task_manager()
.user_interaction_task_source() // w3c/selection-api#117 .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::documentorshadowroot::{DocumentOrShadowRoot, StyleSheetInDocument};
use crate::dom::element::Element; use crate::dom::element::Element;
use crate::dom::node::{ 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::stylesheetlist::{StyleSheetList, StyleSheetListOwner};
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
@ -314,7 +314,7 @@ impl VirtualMethods for ShadowRoot {
} }
if context.tree_connected { if context.tree_connected {
let document = document_from_node(self); let document = self.owner_document();
document.register_shadow_root(self); document.register_shadow_root(self);
} }
@ -332,7 +332,7 @@ impl VirtualMethods for ShadowRoot {
} }
if context.tree_connected { if context.tree_connected {
let document = document_from_node(self); let document = self.owner_document();
document.unregister_shadow_root(self); 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::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner};
use crate::dom::document::Document; use crate::dom::document::Document;
use crate::dom::element::Element; 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::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -70,7 +70,7 @@ impl SVGElementMethods<crate::DomTypeHolder> for SVGElement {
// https://html.spec.whatwg.org/multipage/#the-style-attribute // https://html.spec.whatwg.org/multipage/#the-style-attribute
fn Style(&self) -> DomRoot<CSSStyleDeclaration> { fn Style(&self) -> DomRoot<CSSStyleDeclaration> {
self.style_decl.or_init(|| { self.style_decl.or_init(|| {
let global = window_from_node(self); let global = self.owner_window();
CSSStyleDeclaration::new( CSSStyleDeclaration::new(
&global, &global,
CSSStyleOwner::Element(Dom::from_ref(self.upcast())), 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::bindings::str::DOMString;
use crate::dom::event::{EventBubbles, EventCancelable}; use crate::dom::event::{EventBubbles, EventCancelable};
use crate::dom::eventtarget::EventTarget; 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}; use crate::textinput::{SelectionDirection, SelectionState, TextInput, UTF8Bytes};
pub trait TextControlElement: DerivedFrom<EventTarget> + DerivedFrom<Node> { pub trait TextControlElement: DerivedFrom<EventTarget> + DerivedFrom<Node> {
@ -300,7 +300,7 @@ impl<'a, E: TextControlElement> TextControlSelection<'a, E> {
// Step 6 // Step 6
if textinput.selection_state() != original_selection_state { if textinput.selection_state() != original_selection_state {
let window = window_from_node(self.element); let window = self.element.owner_window();
window window
.task_manager() .task_manager()
.user_interaction_task_source() .user_interaction_task_source()

View file

@ -9,7 +9,7 @@ use dom_struct::dom_struct;
use js::rust::HandleObject; use js::rust::HandleObject;
use servo_atoms::Atom; 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::EventBinding::EventMethods;
use crate::dom::bindings::codegen::Bindings::UIEventBinding; use crate::dom::bindings::codegen::Bindings::UIEventBinding;
use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods;
@ -106,7 +106,7 @@ impl UIEvent {
if let Some(target_) = target_ { if let Some(target_) = target_ {
let element = target_.downcast::<Element>(); let element = target_.downcast::<Element>();
let document = match element { let document = match element {
Some(element) => document_from_node(element), Some(element) => element.owner_document(),
None => target_.downcast::<Window>().unwrap().Document(), None => target_.downcast::<Window>().unwrap().Document(),
}; };
self.view.set(Some(document.window())); 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::globalscope::GlobalScope;
use crate::dom::htmlheadelement::HTMLHeadElement; use crate::dom::htmlheadelement::HTMLHeadElement;
use crate::dom::htmlscriptelement::SourceCode; 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_module::ScriptFetchOptions;
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
pub fn load_script(head: &HTMLHeadElement) { 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() { let path_str = match doc.window().get_userscripts_path() {
Some(p) => p, Some(p) => p,
None => return, 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::element::cors_setting_for_element;
use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::event::{Event, EventBubbles, EventCancelable};
use crate::dom::htmlcanvaselement::{utils as canvas_utils, LayoutCanvasRenderingContextHelpers}; 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::promise::Promise;
use crate::dom::vertexarrayobject::VertexAttribData; use crate::dom::vertexarrayobject::VertexAttribData;
use crate::dom::webgl_extensions::WebGLExtensions; use crate::dom::webgl_extensions::WebGLExtensions;
@ -551,8 +551,7 @@ impl WebGLRenderingContext {
match self.canvas { match self.canvas {
HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => { HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => {
canvas.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); canvas.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
let document = document_from_node(&**canvas); canvas.owner_document().add_dirty_webgl_canvas(self);
document.add_dirty_webgl_canvas(self);
}, },
HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(_) => {}, HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(_) => {},
} }
@ -665,7 +664,7 @@ impl WebGLRenderingContext {
TexImageSource::HTMLImageElement(image) => { TexImageSource::HTMLImageElement(image) => {
let document = match self.canvas { let document = match self.canvas {
HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => { HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => {
document_from_node(&**canvas) canvas.owner_document()
}, },
HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(ref _canvas) => { HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(ref _canvas) => {
// TODO: Support retrieving image pixels here for OffscreenCanvas // TODO: Support retrieving image pixels here for OffscreenCanvas
@ -683,7 +682,7 @@ impl WebGLRenderingContext {
let window = match self.canvas { let window = match self.canvas {
HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => { HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => {
window_from_node(&**canvas) canvas.owner_window()
}, },
// This is marked as unreachable as we should have returned already // This is marked as unreachable as we should have returned already
HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(_) => unreachable!(), HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(_) => unreachable!(),

View file

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

View file

@ -133,7 +133,7 @@ use crate::dom::mediaquerylist::{MediaQueryList, MediaQueryListMatchState};
use crate::dom::mediaquerylistevent::MediaQueryListEvent; use crate::dom::mediaquerylistevent::MediaQueryListEvent;
use crate::dom::messageevent::MessageEvent; use crate::dom::messageevent::MessageEvent;
use crate::dom::navigator::Navigator; 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::performance::Performance;
use crate::dom::promise::Promise; use crate::dom::promise::Promise;
use crate::dom::screen::Screen; use crate::dom::screen::Screen;
@ -882,7 +882,7 @@ impl WindowMethods<crate::DomTypeHolder> for Window {
let container = window_proxy.frame_element()?; let container = window_proxy.frame_element()?;
// Step 6. // Step 6.
let container_doc = document_from_node(container); let container_doc = container.owner_document();
let current_doc = GlobalScope::current() let current_doc = GlobalScope::current()
.expect("No current global object") .expect("No current global object")
.as_window() .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::conversions::DerivedFrom;
use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::refcounted::Trusted;
use crate::dom::bindings::reflector::DomObject; 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; use crate::script_runtime::CanGc;
pub trait ImageCacheListener { pub trait ImageCacheListener {
@ -26,7 +26,7 @@ pub fn generate_cache_listener_for_element<
let trusted_node = Trusted::new(elem); let trusted_node = Trusted::new(elem);
let (responder_sender, responder_receiver) = ipc::channel().unwrap(); let (responder_sender, responder_receiver) = ipc::channel().unwrap();
let window = window_from_node(elem); let window = elem.owner_window();
let (task_source, canceller) = window let (task_source, canceller) = window
.task_manager() .task_manager()
.networking_task_source_with_canceller(); .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::bindings::root::DomRoot;
use crate::dom::document::Document; use crate::dom::document::Document;
use crate::dom::globalscope::GlobalScope; 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::dom::performanceresourcetiming::InitiatorType;
use crate::network_listener::{self, PreInvoke, ResourceTimingListener}; use crate::network_listener::{self, PreInvoke, ResourceTimingListener};
use crate::script_runtime::CanGc; use crate::script_runtime::CanGc;
@ -97,7 +97,7 @@ pub fn fetch_image_for_layout(
id: PendingImageId, id: PendingImageId,
cache: Arc<dyn ImageCache>, cache: Arc<dyn ImageCache>,
) { ) {
let document = document_from_node(node); let document = node.owner_document();
let context = LayoutImageContext { let context = LayoutImageContext {
id, id,
cache, cache,

View file

@ -19,7 +19,7 @@ use crate::dom::htmlanchorelement::HTMLAnchorElement;
use crate::dom::htmlareaelement::HTMLAreaElement; use crate::dom::htmlareaelement::HTMLAreaElement;
use crate::dom::htmlformelement::HTMLFormElement; use crate::dom::htmlformelement::HTMLFormElement;
use crate::dom::htmllinkelement::HTMLLinkElement; 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::dom::types::{Element, GlobalScope};
use crate::script_runtime::CanGc; 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"))); 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 { match doc {
Some(doc) => { Some(doc) => {
let element = doc.upcast::<Element>(); let element = doc.upcast::<Element>();
@ -348,7 +348,7 @@ pub fn follow_hyperlink(
} }
// Step 2, done in Step 7. // Step 2, done in Step 7.
let document = document_from_node(subject); let document = subject.owner_document();
let window = document.window(); let window = document.window();
// Step 3: source browsing context. // Step 3: source browsing context.

View file

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

View file

@ -130,7 +130,7 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlanchorelement::HTMLAnchorElement; use crate::dom::htmlanchorelement::HTMLAnchorElement;
use crate::dom::htmliframeelement::HTMLIFrameElement; use crate::dom::htmliframeelement::HTMLIFrameElement;
use crate::dom::mutationobserver::MutationObserver; 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::performanceentry::PerformanceEntry;
use crate::dom::performancepainttiming::PerformancePaintTiming; use crate::dom::performancepainttiming::PerformancePaintTiming;
use crate::dom::servoparser::{ParserContext, ServoParser}; use crate::dom::servoparser::{ParserContext, ServoParser};
@ -3062,7 +3062,7 @@ impl ScriptThread {
.find_iframe(parent_id, browsing_context_id) .find_iframe(parent_id, browsing_context_id)
}); });
let parent_browsing_context = match (parent_info, iframe.as_ref()) { 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( (Some(parent_id), _) => self.remote_window_proxy(
window.upcast(), window.upcast(),
top_level_browsing_context_id, top_level_browsing_context_id,

View file

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

View file

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