diff options
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r-- | components/script/dom/element.rs | 65 |
1 files changed, 37 insertions, 28 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 4a94f345b02..d9c2f6907e7 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -22,7 +22,7 @@ use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::UnionTypes::NodeOrString; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId}; -use dom::bindings::js::{JS, LayoutJS, MutNullableHeap}; +use dom::bindings::js::{JS, LayoutJS, MutNullableJS}; use dom::bindings::js::{Root, RootedReference}; use dom::bindings::refcounted::{Trusted, TrustedPromise}; use dom::bindings::reflector::DomObject; @@ -51,9 +51,11 @@ use dom::htmlimageelement::{HTMLImageElement, LayoutHTMLImageElementHelpers}; use dom::htmlinputelement::{HTMLInputElement, LayoutHTMLInputElementHelpers}; use dom::htmllabelelement::HTMLLabelElement; use dom::htmllegendelement::HTMLLegendElement; +use dom::htmllinkelement::HTMLLinkElement; use dom::htmlobjectelement::HTMLObjectElement; use dom::htmloptgroupelement::HTMLOptGroupElement; use dom::htmlselectelement::HTMLSelectElement; +use dom::htmlstyleelement::HTMLStyleElement; use dom::htmltablecellelement::{HTMLTableCellElement, HTMLTableCellElementLayoutHelpers}; use dom::htmltableelement::{HTMLTableElement, HTMLTableElementLayoutHelpers}; use dom::htmltablerowelement::{HTMLTableRowElement, HTMLTableRowElementLayoutHelpers}; @@ -75,7 +77,6 @@ use html5ever::serialize; use html5ever::serialize::SerializeOpts; use html5ever::serialize::TraversalScope; use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode}; -use html5ever::tree_builder::{LimitedQuirks, NoQuirks, Quirks}; use html5ever_atoms::{Prefix, LocalName, Namespace, QualName}; use js::jsapi::{HandleValue, JSAutoCompartment}; use parking_lot::RwLock; @@ -96,8 +97,7 @@ use std::rc::Rc; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; use style::attr::{AttrValue, LengthOrPercentageOrAuto}; -use style::context::ReflowGoal; -use style::dom::TRestyleDamage; +use style::context::{QuirksMode, ReflowGoal}; use style::element_state::*; use style::matching::{common_style_affecting_attributes, rare_style_affecting_attributes}; use style::parser::ParserContextExtraData; @@ -110,6 +110,7 @@ use style::sink::Push; use style::stylist::ApplicableDeclarationBlock; use style::values::CSSFloat; use style::values::specified::{self, CSSColor, CSSRGBA, LengthOrPercentage}; +use stylesheet_loader::StylesheetOwner; // TODO: Update focus state when the top-level browsing context gains or loses system focus, // and when the element enters or leaves a browsing context container. @@ -126,8 +127,8 @@ pub struct Element { id_attribute: DOMRefCell<Option<Atom>>, #[ignore_heap_size_of = "Arc"] style_attribute: DOMRefCell<Option<Arc<RwLock<PropertyDeclarationBlock>>>>, - attr_list: MutNullableHeap<JS<NamedNodeMap>>, - class_list: MutNullableHeap<JS<DOMTokenList>>, + attr_list: MutNullableJS<NamedNodeMap>, + class_list: MutNullableJS<DOMTokenList>, state: Cell<ElementState>, atomic_flags: AtomicElementFlags, } @@ -398,7 +399,7 @@ impl LayoutElementHelpers for LayoutJS<Element> { PropertyDeclaration::BackgroundImage(DeclaredValue::Value( background_image::SpecifiedValue(vec![ background_image::single_value::SpecifiedValue(Some( - specified::Image::for_cascade(Some(url.into()), specified::url::UrlExtraData { }) + specified::Image::for_cascade(url.into(), specified::url::UrlExtraData { }) )) ]))))); } @@ -1095,8 +1096,8 @@ impl Element { let quirks_mode = document_from_node(self).quirks_mode(); let is_equal = |lhs: &Atom, rhs: &Atom| { match quirks_mode { - NoQuirks | LimitedQuirks => lhs == rhs, - Quirks => lhs.eq_ignore_ascii_case(&rhs), + QuirksMode::NoQuirks | QuirksMode::LimitedQuirks => lhs == rhs, + QuirksMode::Quirks => lhs.eq_ignore_ascii_case(&rhs), } }; self.get_attribute(&ns!(), &local_name!("class")) @@ -1276,7 +1277,7 @@ impl Element { // Step 7 if *self.root_element() == *self { - if doc.quirks_mode() != Quirks { + if doc.quirks_mode() != QuirksMode::Quirks { win.scroll(x, y, behavior); } @@ -1285,7 +1286,7 @@ impl Element { // Step 9 if doc.GetBody().r() == self.downcast::<HTMLElement>() && - doc.quirks_mode() == Quirks && + doc.quirks_mode() == QuirksMode::Quirks && !self.potentially_scrollable() { win.scroll(x, y, behavior); return; @@ -1656,7 +1657,7 @@ impl ElementMethods for Element { // Step 5 if *self.root_element() == *self { - if doc.quirks_mode() == Quirks { + if doc.quirks_mode() == QuirksMode::Quirks { return 0.0; } @@ -1666,7 +1667,7 @@ impl ElementMethods for Element { // Step 7 if doc.GetBody().r() == self.downcast::<HTMLElement>() && - doc.quirks_mode() == Quirks && + doc.quirks_mode() == QuirksMode::Quirks && !self.potentially_scrollable() { return win.ScrollY() as f64; } @@ -1707,7 +1708,7 @@ impl ElementMethods for Element { // Step 7 if *self.root_element() == *self { - if doc.quirks_mode() != Quirks { + if doc.quirks_mode() != QuirksMode::Quirks { win.scroll(win.ScrollX() as f64, y, behavior); } @@ -1716,7 +1717,7 @@ impl ElementMethods for Element { // Step 9 if doc.GetBody().r() == self.downcast::<HTMLElement>() && - doc.quirks_mode() == Quirks && + doc.quirks_mode() == QuirksMode::Quirks && !self.potentially_scrollable() { win.scroll(win.ScrollX() as f64, y, behavior); return; @@ -1748,7 +1749,7 @@ impl ElementMethods for Element { // Step 5 if *self.root_element() == *self { - if doc.quirks_mode() != Quirks { + if doc.quirks_mode() != QuirksMode::Quirks { // Step 6 return win.ScrollX() as f64; } @@ -1758,7 +1759,7 @@ impl ElementMethods for Element { // Step 7 if doc.GetBody().r() == self.downcast::<HTMLElement>() && - doc.quirks_mode() == Quirks && + doc.quirks_mode() == QuirksMode::Quirks && !self.potentially_scrollable() { return win.ScrollX() as f64; } @@ -1799,7 +1800,7 @@ impl ElementMethods for Element { // Step 7 if *self.root_element() == *self { - if doc.quirks_mode() == Quirks { + if doc.quirks_mode() == QuirksMode::Quirks { return; } @@ -1809,7 +1810,7 @@ impl ElementMethods for Element { // Step 9 if doc.GetBody().r() == self.downcast::<HTMLElement>() && - doc.quirks_mode() == Quirks && + doc.quirks_mode() == QuirksMode::Quirks && !self.potentially_scrollable() { win.scroll(x, win.ScrollY() as f64, behavior); return; @@ -2421,6 +2422,18 @@ impl Element { }) } + pub fn as_stylesheet_owner(&self) -> Option<&StylesheetOwner> { + if let Some(s) = self.downcast::<HTMLStyleElement>() { + return Some(s as &StylesheetOwner) + } + + if let Some(l) = self.downcast::<HTMLLinkElement>() { + return Some(l as &StylesheetOwner) + } + + None + } + // https://html.spec.whatwg.org/multipage/#category-submit pub fn as_maybe_validatable(&self) -> Option<&Validatable> { let element = match self.upcast::<Node>().type_id() { @@ -2663,15 +2676,11 @@ impl Element { self.set_enabled_state(false); return; } - match ancestor.children() - .find(|child| child.is::<HTMLLegendElement>()) { - Some(ref legend) => { - // XXXabinader: should we save previous ancestor to avoid this iteration? - if node.ancestors().any(|ancestor| ancestor == *legend) { - continue; - } - }, - None => (), + if let Some(ref legend) = ancestor.children().find(|n| n.is::<HTMLLegendElement>()) { + // XXXabinader: should we save previous ancestor to avoid this iteration? + if node.ancestors().any(|ancestor| ancestor == *legend) { + continue; + } } self.set_disabled_state(true); self.set_enabled_state(false); |