diff options
-rw-r--r-- | components/layout_thread/dom_wrapper.rs | 1 | ||||
-rw-r--r-- | components/layout_thread_2020/dom_wrapper.rs | 1 | ||||
-rw-r--r-- | components/script/dom/create.rs | 2 | ||||
-rw-r--r-- | components/script/dom/element.rs | 14 | ||||
-rw-r--r-- | components/style/servo/selector_parser.rs | 4 | ||||
-rw-r--r-- | tests/wpt/metadata/MANIFEST.json | 2 | ||||
-rw-r--r-- | tests/wpt/metadata/custom-elements/Document-createElement.html.ini | 3 | ||||
-rw-r--r-- | tests/wpt/metadata/custom-elements/pseudo-class-defined.html.ini | 31 | ||||
-rw-r--r-- | tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html | 1 |
9 files changed, 52 insertions, 7 deletions
diff --git a/components/layout_thread/dom_wrapper.rs b/components/layout_thread/dom_wrapper.rs index 466d844418a..c47635afedb 100644 --- a/components/layout_thread/dom_wrapper.rs +++ b/components/layout_thread/dom_wrapper.rs @@ -955,6 +955,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> { NonTSPseudoClass::Focus | NonTSPseudoClass::Fullscreen | NonTSPseudoClass::Hover | + NonTSPseudoClass::Defined | NonTSPseudoClass::Enabled | NonTSPseudoClass::Disabled | NonTSPseudoClass::Checked | diff --git a/components/layout_thread_2020/dom_wrapper.rs b/components/layout_thread_2020/dom_wrapper.rs index 520014837db..e2bdc0f42a6 100644 --- a/components/layout_thread_2020/dom_wrapper.rs +++ b/components/layout_thread_2020/dom_wrapper.rs @@ -962,6 +962,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> { NonTSPseudoClass::Focus | NonTSPseudoClass::Fullscreen | NonTSPseudoClass::Hover | + NonTSPseudoClass::Defined | NonTSPseudoClass::Enabled | NonTSPseudoClass::Disabled | NonTSPseudoClass::Checked | diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index d67550ee47f..f68a680483d 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -200,6 +200,8 @@ fn create_html_element( None => { if is_valid_custom_element_name(&*name.local) { result.set_custom_element_state(CustomElementState::Undefined); + } else { + result.set_custom_element_state(CustomElementState::Uncustomized); } }, }; diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 29bdaf2f3bf..c26e492d544 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -324,14 +324,23 @@ impl Element { } pub fn set_custom_element_state(&self, state: CustomElementState) { - self.ensure_rare_data().custom_element_state = state; + // no need to inflate rare data for uncustomized + if state != CustomElementState::Uncustomized || self.rare_data().is_some() { + self.ensure_rare_data().custom_element_state = state; + } + // https://dom.spec.whatwg.org/#concept-element-defined + let in_defined_state = match state { + CustomElementState::Uncustomized | CustomElementState::Custom => true, + _ => false, + }; + self.set_state(ElementState::IN_DEFINED_STATE, in_defined_state) } pub fn get_custom_element_state(&self) -> CustomElementState { if let Some(rare_data) = self.rare_data().as_ref() { return rare_data.custom_element_state; } - CustomElementState::Undefined + CustomElementState::Uncustomized } pub fn set_custom_element_definition(&self, definition: Rc<CustomElementDefinition>) { @@ -3039,6 +3048,7 @@ impl<'a> SelectorsElement for DomRoot<Element> { NonTSPseudoClass::Focus | NonTSPseudoClass::Fullscreen | NonTSPseudoClass::Hover | + NonTSPseudoClass::Defined | NonTSPseudoClass::Enabled | NonTSPseudoClass::Disabled | NonTSPseudoClass::Checked | diff --git a/components/style/servo/selector_parser.rs b/components/style/servo/selector_parser.rs index 942dcdba1bb..599b603f4ff 100644 --- a/components/style/servo/selector_parser.rs +++ b/components/style/servo/selector_parser.rs @@ -278,6 +278,7 @@ pub enum NonTSPseudoClass { Active, AnyLink, Checked, + Defined, Disabled, Enabled, Focus, @@ -332,6 +333,7 @@ impl ToCss for NonTSPseudoClass { Active => ":active", AnyLink => ":any-link", Checked => ":checked", + Defined => ":defined", Disabled => ":disabled", Enabled => ":enabled", Focus => ":focus", @@ -371,6 +373,7 @@ impl NonTSPseudoClass { Focus => ElementState::IN_FOCUS_STATE, Fullscreen => ElementState::IN_FULLSCREEN_STATE, Hover => ElementState::IN_HOVER_STATE, + Defined => ElementState::IN_DEFINED_STATE, Enabled => ElementState::IN_ENABLED_STATE, Disabled => ElementState::IN_DISABLED_STATE, Checked => ElementState::IN_CHECKED_STATE, @@ -436,6 +439,7 @@ impl<'a, 'i> ::selectors::Parser<'i> for SelectorParser<'a> { "active" => Active, "any-link" => AnyLink, "checked" => Checked, + "defined" => Defined, "disabled" => Disabled, "enabled" => Enabled, "focus" => Focus, diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 0dee8a56d65..0556b1d2367 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -667507,7 +667507,7 @@ "testharness" ], "custom-elements/pseudo-class-defined.html": [ - "24cb5fe4cd392246e292d255c0858aa7f2b5dd0e", + "ed12830d5a9582dbf3ec30c74a43fe381221a139", "testharness" ], "custom-elements/range-and-constructors.html": [ diff --git a/tests/wpt/metadata/custom-elements/Document-createElement.html.ini b/tests/wpt/metadata/custom-elements/Document-createElement.html.ini deleted file mode 100644 index ef2a2e288c1..00000000000 --- a/tests/wpt/metadata/custom-elements/Document-createElement.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[Document-createElement.html] - [document.createElement must create an instance of autonomous custom elements when it has is attribute] - expected: FAIL diff --git a/tests/wpt/metadata/custom-elements/pseudo-class-defined.html.ini b/tests/wpt/metadata/custom-elements/pseudo-class-defined.html.ini index 1739e94c1d0..a146ed2bf32 100644 --- a/tests/wpt/metadata/custom-elements/pseudo-class-defined.html.ini +++ b/tests/wpt/metadata/custom-elements/pseudo-class-defined.html.ini @@ -1,8 +1,37 @@ [pseudo-class-defined.html] - expected: ERROR [Untitled] expected: FAIL [pseudo-class-defined] expected: FAIL + [createElementNS("http://www.w3.org/2000/svg", "div") should be :defined] + expected: FAIL + + [Without browsing context: createElementNS("http://www.w3.org/2000/svg", "div") should be :defined] + expected: FAIL + + [Without browsing context: createElementNS("http://www.w3.org/2000/svg", "p", { is: "" }) should be :defined] + expected: FAIL + + [createElementNS("http://www.w3.org/2000/svg", "p", { is: "" }) should be :defined] + expected: FAIL + + [Without browsing context: createElementNS("http://www.w3.org/2000/svg", "abbr", { is: "my-abbr" }) should be :defined] + expected: FAIL + + [createElementNS("http://www.w3.org/2000/svg", "abbr", { is: "my-abbr" }) should be :defined] + expected: FAIL + + [createElementNS("http://www.w3.org/2000/svg", "font-face") should be :defined] + expected: FAIL + + [Without browsing context: createElementNS("http://www.w3.org/2000/svg", "font-face") should be :defined] + expected: FAIL + + [createElementNS("http://www.w3.org/2000/svg", "a-a") should be :defined] + expected: FAIL + + [Without browsing context: createElementNS("http://www.w3.org/2000/svg", "a-a") should be :defined] + expected: FAIL + diff --git a/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html b/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html index 24cb5fe4cd3..ed12830d5a9 100644 --- a/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html +++ b/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html @@ -16,6 +16,7 @@ const testList = [ const neither = 'rgb(255, 0, 0)'; const defined = 'rgb(255, 165, 0)'; const not_defined = 'rgb(0, 0, 255)'; +const iframe = document.getElementById("iframe"); iframe.srcdoc = `<style> * { color:${neither}; } :defined { color:${defined}; } |