aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/element.rs19
-rw-r--r--components/script/dom/htmlframesetelement.rs7
-rw-r--r--components/script/dom/htmlheadelement.rs7
-rw-r--r--components/script/dom/htmlhtmlelement.rs8
-rwxr-xr-xcomponents/script/dom/htmlselectelement.rs7
-rw-r--r--components/script/dom/htmltablecaptionelement.rs8
-rw-r--r--components/script/dom/htmltablecellelement.rs7
-rw-r--r--components/script/dom/htmltablecolelement.rs8
-rw-r--r--components/script/dom/htmltableelement.rs7
-rw-r--r--components/script/dom/htmltablerowelement.rs7
-rw-r--r--components/script/dom/htmltablesectionelement.rs7
-rw-r--r--components/script/dom/htmltemplateelement.rs7
-rw-r--r--components/script/dom/node.rs14
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)
}