Skip to content

Commit 8f5764d

Browse files
committed
optimize createElement for divs
1 parent 3e856cb commit 8f5764d

File tree

4 files changed

+38
-6
lines changed

4 files changed

+38
-6
lines changed

components/script/dom/bindings/constructor.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ fn html_constructor(
183183
&document,
184184
ElementCreator::ScriptCreated,
185185
None,
186+
false
186187
)
187188
};
188189

components/script/dom/create.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ fn create_html_element(
151151
// local name set to localName, custom element state set to "undefined",
152152
// custom element definition set to null, is value set to is,
153153
// and node document set to document.
154-
let element = create_native_html_element(name, prefix, document, creator, proto);
154+
let element = create_native_html_element(name, prefix, document, creator, proto, false);
155155
element.set_is(definition.name.clone());
156156
element.set_custom_element_state(CustomElementState::Undefined);
157157
match mode {
@@ -236,7 +236,8 @@ fn create_html_element(
236236
// namespace set to namespace, namespace prefix set to prefix, local name set to localName,
237237
// custom element state set to "uncustomized", custom element definition set to null,
238238
// is value set to is, and node document set to document.
239-
let result = create_native_html_element(name.clone(), prefix, document, creator, proto);
239+
let is_builtin = is.is_none() && !is_valid_custom_element_name(&name.local);
240+
let result = create_native_html_element(name.clone(), prefix, document, creator, proto, is_builtin);
240241
// Step 5.3. If namespace is the HTML namespace, and either localName is a valid custom element name or
241242
// is is non-null, then set result’s custom element state to "undefined".
242243
match is {
@@ -247,8 +248,6 @@ fn create_html_element(
247248
None => {
248249
if is_valid_custom_element_name(&name.local) {
249250
result.set_custom_element_state(CustomElementState::Undefined);
250-
} else {
251-
result.set_custom_element_state(CustomElementState::Uncustomized);
252251
}
253252
},
254253
};
@@ -263,6 +262,7 @@ pub(crate) fn create_native_html_element(
263262
document: &Document,
264263
creator: ElementCreator,
265264
proto: Option<HandleObject>,
265+
defined: bool,
266266
) -> DomRoot<Element> {
267267
assert_eq!(name.ns, ns!(html));
268268

@@ -318,7 +318,14 @@ pub(crate) fn create_native_html_element(
318318
local_name!("dfn") => make!(HTMLElement),
319319
local_name!("dialog") => make!(HTMLDialogElement),
320320
local_name!("dir") => make!(HTMLDirectoryElement),
321-
local_name!("div") => make!(HTMLDivElement),
321+
local_name!("div") => {
322+
let obj = if defined {
323+
HTMLDivElement::new_defined(name.local, prefix, document, proto, CanGc::note())
324+
} else {
325+
HTMLDivElement::new(name.local, prefix, document, proto, CanGc::note())
326+
};
327+
DomRoot::upcast(obj)
328+
},
322329
local_name!("dl") => make!(HTMLDListElement),
323330
local_name!("dt") => make!(HTMLElement),
324331
local_name!("em") => make!(HTMLElement),

components/script/dom/customelementregistry.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ use crate::script_runtime::{CanGc, JSContext};
5050
use crate::script_thread::ScriptThread;
5151

5252
/// <https://dom.spec.whatwg.org/#concept-element-custom-element-state>
53-
#[derive(Clone, Copy, Default, Eq, JSTraceable, MallocSizeOf, PartialEq)]
53+
#[derive(Clone, Copy, Debug, Default, Eq, JSTraceable, MallocSizeOf, PartialEq)]
5454
pub(crate) enum CustomElementState {
5555
Undefined,
5656
Failed,

components/script/dom/htmldivelement.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use dom_struct::dom_struct;
66
use html5ever::{LocalName, Prefix};
77
use js::rust::HandleObject;
8+
use stylo_dom::ElementState;
89

910
use crate::dom::bindings::codegen::Bindings::HTMLDivElementBinding::HTMLDivElementMethods;
1011
use crate::dom::bindings::root::DomRoot;
@@ -30,6 +31,29 @@ impl HTMLDivElement {
3031
}
3132
}
3233

34+
#[cfg_attr(crown, allow(crown::unrooted_must_root))]
35+
pub(crate) fn new_defined(
36+
local_name: LocalName,
37+
prefix: Option<Prefix>,
38+
document: &Document,
39+
proto: Option<HandleObject>,
40+
can_gc: CanGc,
41+
) -> DomRoot<HTMLDivElement> {
42+
Node::reflect_node_with_proto(
43+
Box::new(HTMLDivElement {
44+
htmlelement: HTMLElement::new_inherited_with_state(
45+
ElementState::DEFINED,
46+
local_name,
47+
prefix,
48+
document
49+
)
50+
}),
51+
document,
52+
proto,
53+
can_gc,
54+
)
55+
}
56+
3357
#[cfg_attr(crown, allow(crown::unrooted_must_root))]
3458
pub(crate) fn new(
3559
local_name: LocalName,

0 commit comments

Comments
 (0)