diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/element.rs | 19 | ||||
-rw-r--r-- | components/script/dom/htmlframesetelement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/htmlheadelement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/htmlhtmlelement.rs | 8 | ||||
-rwxr-xr-x | components/script/dom/htmlselectelement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/htmltablecaptionelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/htmltablecellelement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/htmltablecolelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/htmltableelement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/htmltablerowelement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/htmltablesectionelement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/htmltemplateelement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/node.rs | 14 |
13 files changed, 89 insertions, 24 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index baccc4e65aa..6f6f33f56a8 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -2449,8 +2449,6 @@ impl ElementMethods for Element { /// <https://w3c.github.io/DOM-Parsing/#widl-Element-innerHTML> fn SetInnerHTML(&self, value: DOMString) -> ErrorResult { - // Step 1. - let frag = self.parse_fragment(value)?; // Step 2. // https://github.com/w3c/DOM-Parsing/issues/1 let target = if let Some(template) = self.downcast::<HTMLTemplateElement>() { @@ -2458,6 +2456,23 @@ impl ElementMethods for Element { } else { DomRoot::from_ref(self.upcast()) }; + + // Fast path for when the value is small, doesn't contain any markup and doesn't require + // extra work to set innerHTML. + if !self.node.has_weird_parser_insertion_mode() && + value.len() < 100 && + !value + .as_bytes() + .iter() + .any(|c| matches!(*c, b'&' | b'\0' | b'<' | b'\r')) + { + Node::SetTextContent(&target, Some(value)); + return Ok(()); + } + + // Step 1. + let frag = self.parse_fragment(value)?; + Node::replace_all(Some(frag.upcast()), &target); Ok(()) } diff --git a/components/script/dom/htmlframesetelement.rs b/components/script/dom/htmlframesetelement.rs index 2c7260ee2c1..dc071b47074 100644 --- a/components/script/dom/htmlframesetelement.rs +++ b/components/script/dom/htmlframesetelement.rs @@ -4,6 +4,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLFrameSetElementBinding::HTMLFrameSetElementMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::DomRoot; use crate::dom::document::Document; use crate::dom::htmlelement::HTMLElement; @@ -33,12 +34,14 @@ impl HTMLFrameSetElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLFrameSetElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLFrameSetElement::new_inherited( local_name, prefix, document, )), document, - ) + ); + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } } diff --git a/components/script/dom/htmlheadelement.rs b/components/script/dom/htmlheadelement.rs index efa0bc7d515..1bd6e5e1148 100644 --- a/components/script/dom/htmlheadelement.rs +++ b/components/script/dom/htmlheadelement.rs @@ -37,10 +37,13 @@ impl HTMLHeadElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLHeadElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLHeadElement::new_inherited(local_name, prefix, document)), document, - ) + ); + + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } /// <https://html.spec.whatwg.org/multipage/#meta-referrer> diff --git a/components/script/dom/htmlhtmlelement.rs b/components/script/dom/htmlhtmlelement.rs index 05b34dec3dc..da77d3464d9 100644 --- a/components/script/dom/htmlhtmlelement.rs +++ b/components/script/dom/htmlhtmlelement.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::DomRoot; use crate::dom::document::Document; use crate::dom::htmlelement::HTMLElement; @@ -32,9 +33,12 @@ impl HTMLHtmlElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLHtmlElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLHtmlElement::new_inherited(localName, prefix, document)), document, - ) + ); + + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } } diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index caca2fddfc2..9d36413e4b5 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -93,12 +93,15 @@ impl HTMLSelectElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLSelectElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLSelectElement::new_inherited( local_name, prefix, document, )), document, - ) + ); + + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } // https://html.spec.whatwg.org/multipage/#concept-select-option-list diff --git a/components/script/dom/htmltablecaptionelement.rs b/components/script/dom/htmltablecaptionelement.rs index e6ff3da673e..b89b647691e 100644 --- a/components/script/dom/htmltablecaptionelement.rs +++ b/components/script/dom/htmltablecaptionelement.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::DomRoot; use crate::dom::document::Document; use crate::dom::htmlelement::HTMLElement; @@ -31,11 +32,14 @@ impl HTMLTableCaptionElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLTableCaptionElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLTableCaptionElement::new_inherited( local_name, prefix, document, )), document, - ) + ); + + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } } diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index 81e9dafb1cc..75a2140a090 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -45,12 +45,15 @@ impl HTMLTableCellElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLTableCellElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLTableCellElement::new_inherited( local_name, prefix, document, )), document, - ) + ); + + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } } diff --git a/components/script/dom/htmltablecolelement.rs b/components/script/dom/htmltablecolelement.rs index 7dcd27d953d..86382e1c2cb 100644 --- a/components/script/dom/htmltablecolelement.rs +++ b/components/script/dom/htmltablecolelement.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::DomRoot; use crate::dom::document::Document; use crate::dom::htmlelement::HTMLElement; @@ -31,11 +32,14 @@ impl HTMLTableColElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLTableColElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLTableColElement::new_inherited( local_name, prefix, document, )), document, - ) + ); + + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } } diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs index f42e72b5247..2fa44f3ad37 100644 --- a/components/script/dom/htmltableelement.rs +++ b/components/script/dom/htmltableelement.rs @@ -70,12 +70,15 @@ impl HTMLTableElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLTableElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLTableElement::new_inherited( local_name, prefix, document, )), document, - ) + ); + + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } pub fn get_border(&self) -> Option<u32> { diff --git a/components/script/dom/htmltablerowelement.rs b/components/script/dom/htmltablerowelement.rs index 1bece55857b..5da05be4019 100644 --- a/components/script/dom/htmltablerowelement.rs +++ b/components/script/dom/htmltablerowelement.rs @@ -57,12 +57,15 @@ impl HTMLTableRowElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLTableRowElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLTableRowElement::new_inherited( local_name, prefix, document, )), document, - ) + ); + + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } /// Determine the index for this `HTMLTableRowElement` within the given diff --git a/components/script/dom/htmltablesectionelement.rs b/components/script/dom/htmltablesectionelement.rs index fa0f3b93ab5..5787546f2be 100644 --- a/components/script/dom/htmltablesectionelement.rs +++ b/components/script/dom/htmltablesectionelement.rs @@ -42,12 +42,15 @@ impl HTMLTableSectionElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLTableSectionElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLTableSectionElement::new_inherited( local_name, prefix, document, )), document, - ) + ); + + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } } diff --git a/components/script/dom/htmltemplateelement.rs b/components/script/dom/htmltemplateelement.rs index 87f2063f5e3..673f6e0c98a 100644 --- a/components/script/dom/htmltemplateelement.rs +++ b/components/script/dom/htmltemplateelement.rs @@ -41,12 +41,15 @@ impl HTMLTemplateElement { prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLTemplateElement> { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLTemplateElement::new_inherited( local_name, prefix, document, )), document, - ) + ); + + n.upcast::<Node>().set_weird_parser_insertion_mode(); + n } } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 4579890a03e..503cc589b50 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -196,6 +196,10 @@ bitflags! { /// Specifies whether this node's shadow-including root is a document. const IS_CONNECTED = 1 << 10; + + /// Whether this node has a weird parser insertion mode. i.e whether setting innerHTML + /// needs extra work or not + const HAS_WEIRD_PARSER_INSERTION_MODE = 1 << 11; } } @@ -554,6 +558,16 @@ impl Node { self.flags.get().contains(NodeFlags::IS_IN_SHADOW_TREE) } + pub fn has_weird_parser_insertion_mode(&self) -> bool { + self.flags + .get() + .contains(NodeFlags::HAS_WEIRD_PARSER_INSERTION_MODE) + } + + pub fn set_weird_parser_insertion_mode(&self) { + self.set_flag(NodeFlags::HAS_WEIRD_PARSER_INSERTION_MODE, true) + } + pub fn is_connected(&self) -> bool { self.flags.get().contains(NodeFlags::IS_CONNECTED) } |