Skip to content

Commit 28ba9d0

Browse files
committed
script: use create_element instead of DOM struct constructors
Signed-off-by: Mukilan Thiyagarajan <[email protected]>
1 parent d094d03 commit 28ba9d0

13 files changed

+254
-98
lines changed

components/script/dom/domimplementation.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
44

55
use dom_struct::dom_struct;
6-
use html5ever::{local_name, ns};
6+
use html5ever::{QualName, local_name, ns};
77
use script_bindings::error::Error;
88
use script_traits::DocumentActivity;
99

@@ -22,12 +22,10 @@ use crate::dom::bindings::root::{Dom, DomRoot};
2222
use crate::dom::bindings::str::DOMString;
2323
use crate::dom::document::{Document, DocumentSource, HasBrowsingContext, IsHTMLDocument};
2424
use crate::dom::documenttype::DocumentType;
25-
use crate::dom::html::htmlbodyelement::HTMLBodyElement;
26-
use crate::dom::html::htmlheadelement::HTMLHeadElement;
27-
use crate::dom::html::htmlhtmlelement::HTMLHtmlElement;
28-
use crate::dom::html::htmltitleelement::HTMLTitleElement;
25+
use crate::dom::element::{CustomElementCreationMode, ElementCreator};
2926
use crate::dom::node::Node;
3027
use crate::dom::text::Text;
28+
use crate::dom::types::Element;
3129
use crate::dom::xmldocument::XMLDocument;
3230
use crate::script_runtime::CanGc;
3331

@@ -199,10 +197,12 @@ impl DOMImplementationMethods<crate::DomTypeHolder> for DOMImplementation {
199197
{
200198
// Step 4.
201199
let doc_node = doc.upcast::<Node>();
202-
let doc_html = DomRoot::upcast::<Node>(HTMLHtmlElement::new(
203-
local_name!("html"),
200+
let doc_html = DomRoot::upcast::<Node>(Element::create(
201+
QualName::new(None, ns!(html), local_name!("html")),
204202
None,
205203
&doc,
204+
ElementCreator::ScriptCreated,
205+
CustomElementCreationMode::Asynchronous,
206206
None,
207207
can_gc,
208208
));
@@ -212,10 +212,12 @@ impl DOMImplementationMethods<crate::DomTypeHolder> for DOMImplementation {
212212

213213
{
214214
// Step 5.
215-
let doc_head = DomRoot::upcast::<Node>(HTMLHeadElement::new(
216-
local_name!("head"),
215+
let doc_head = DomRoot::upcast::<Node>(Element::create(
216+
QualName::new(None, ns!(html), local_name!("head")),
217217
None,
218218
&doc,
219+
ElementCreator::ScriptCreated,
220+
CustomElementCreationMode::Asynchronous,
219221
None,
220222
can_gc,
221223
));
@@ -224,10 +226,12 @@ impl DOMImplementationMethods<crate::DomTypeHolder> for DOMImplementation {
224226
// Step 6.
225227
if let Some(title_str) = title {
226228
// Step 6.1.
227-
let doc_title = DomRoot::upcast::<Node>(HTMLTitleElement::new(
228-
local_name!("title"),
229+
let doc_title = DomRoot::upcast::<Node>(Element::create(
230+
QualName::new(None, ns!(html), local_name!("title")),
229231
None,
230232
&doc,
233+
ElementCreator::ScriptCreated,
234+
CustomElementCreationMode::Asynchronous,
231235
None,
232236
can_gc,
233237
));
@@ -240,7 +244,15 @@ impl DOMImplementationMethods<crate::DomTypeHolder> for DOMImplementation {
240244
}
241245

242246
// Step 7.
243-
let doc_body = HTMLBodyElement::new(local_name!("body"), None, &doc, None, can_gc);
247+
let doc_body = Element::create(
248+
QualName::new(None, ns!(html), local_name!("body")),
249+
None,
250+
&doc,
251+
ElementCreator::ScriptCreated,
252+
CustomElementCreationMode::Asynchronous,
253+
None,
254+
can_gc,
255+
);
244256
doc_html.AppendChild(doc_body.upcast(), can_gc).unwrap();
245257
}
246258

components/script/dom/element.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2957,13 +2957,15 @@ impl Element {
29572957
},
29582958
// set context to the result of creating an element
29592959
// given this's node document, "body", and the HTML namespace.
2960-
_ => DomRoot::upcast(HTMLBodyElement::new(
2961-
local_name!("body"),
2960+
_ => Element::create(
2961+
QualName::new(None, ns!(html), local_name!("body")),
29622962
None,
29632963
owner_doc,
2964+
ElementCreator::ScriptCreated, // TODO??
2965+
CustomElementCreationMode::Asynchronous,
29642966
None,
29652967
can_gc,
2966-
)),
2968+
),
29672969
}
29682970
}
29692971

components/script/dom/html/htmldetailselement.rs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use std::cell::{Cell, Ref};
66

77
use dom_struct::dom_struct;
8-
use html5ever::{LocalName, Prefix, local_name};
8+
use html5ever::{LocalName, Prefix, QualName, local_name, ns};
99
use js::rust::HandleObject;
1010

1111
use crate::dom::attr::Attr;
@@ -18,7 +18,7 @@ use crate::dom::bindings::inheritance::Castable;
1818
use crate::dom::bindings::refcounted::Trusted;
1919
use crate::dom::bindings::root::{Dom, DomRoot};
2020
use crate::dom::document::Document;
21-
use crate::dom::element::{AttributeMutation, Element};
21+
use crate::dom::element::{AttributeMutation, CustomElementCreationMode, Element, ElementCreator};
2222
use crate::dom::eventtarget::EventTarget;
2323
use crate::dom::html::htmlelement::HTMLElement;
2424
use crate::dom::html::htmlslotelement::HTMLSlotElement;
@@ -105,13 +105,30 @@ impl HTMLDetailsElement {
105105
.upcast::<Element>()
106106
.attach_ua_shadow_root(false, can_gc);
107107

108-
let summary = HTMLSlotElement::new(local_name!("slot"), None, &document, None, can_gc);
108+
let summary = Element::create(
109+
QualName::new(None, ns!(html), local_name!("slot")),
110+
None,
111+
&document,
112+
ElementCreator::ScriptCreated,
113+
CustomElementCreationMode::Asynchronous,
114+
None,
115+
can_gc,
116+
);
117+
let summary = DomRoot::downcast::<HTMLSlotElement>(summary).unwrap();
109118
root.upcast::<Node>()
110119
.AppendChild(summary.upcast::<Node>(), can_gc)
111120
.unwrap();
112121

113-
let fallback_summary =
114-
HTMLElement::new(local_name!("summary"), None, &document, None, can_gc);
122+
let fallback_summary = Element::create(
123+
QualName::new(None, ns!(html), local_name!("summary")),
124+
None,
125+
&document,
126+
ElementCreator::ScriptCreated,
127+
CustomElementCreationMode::Asynchronous,
128+
None,
129+
can_gc,
130+
);
131+
let fallback_summary = DomRoot::downcast::<HTMLElement>(fallback_summary).unwrap();
115132
fallback_summary
116133
.upcast::<Node>()
117134
.set_text_content_for_element(Some(DEFAULT_SUMMARY.into()), can_gc);
@@ -120,7 +137,16 @@ impl HTMLDetailsElement {
120137
.AppendChild(fallback_summary.upcast::<Node>(), can_gc)
121138
.unwrap();
122139

123-
let descendants = HTMLSlotElement::new(local_name!("slot"), None, &document, None, can_gc);
140+
let descendants = Element::create(
141+
QualName::new(None, ns!(html), local_name!("slot")),
142+
None,
143+
&document,
144+
ElementCreator::ScriptCreated,
145+
CustomElementCreationMode::Asynchronous,
146+
None,
147+
can_gc,
148+
);
149+
let descendants = DomRoot::downcast::<HTMLSlotElement>(descendants).unwrap();
124150
root.upcast::<Node>()
125151
.AppendChild(descendants.upcast::<Node>(), can_gc)
126152
.unwrap();

components/script/dom/html/htmlelement.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::default::Default;
77
use std::rc::Rc;
88

99
use dom_struct::dom_struct;
10-
use html5ever::{LocalName, Prefix, local_name, ns};
10+
use html5ever::{LocalName, Prefix, QualName, local_name, ns};
1111
use js::rust::HandleObject;
1212
use layout_api::{QueryMsg, ScrollContainerQueryType, ScrollContainerResponse};
1313
use script_bindings::codegen::GenericBindings::DocumentBinding::DocumentMethods;
@@ -36,12 +36,11 @@ use crate::dom::customelementregistry::{CallbackReaction, CustomElementState};
3636
use crate::dom::document::{Document, FocusInitiator};
3737
use crate::dom::documentfragment::DocumentFragment;
3838
use crate::dom::domstringmap::DOMStringMap;
39-
use crate::dom::element::{AttributeMutation, Element};
39+
use crate::dom::element::{AttributeMutation, CustomElementCreationMode, Element, ElementCreator};
4040
use crate::dom::elementinternals::ElementInternals;
4141
use crate::dom::event::Event;
4242
use crate::dom::eventtarget::EventTarget;
4343
use crate::dom::html::htmlbodyelement::HTMLBodyElement;
44-
use crate::dom::html::htmlbrelement::HTMLBRElement;
4544
use crate::dom::html::htmldetailselement::HTMLDetailsElement;
4645
use crate::dom::html::htmlformelement::{FormControl, HTMLFormElement};
4746
use crate::dom::html::htmlframesetelement::HTMLFrameSetElement;
@@ -1060,7 +1059,15 @@ impl HTMLElement {
10601059
text = String::new();
10611060
}
10621061

1063-
let br = HTMLBRElement::new(local_name!("br"), None, &document, None, can_gc);
1062+
let br = Element::create(
1063+
QualName::new(None, ns!(html), local_name!("br")),
1064+
None,
1065+
&document,
1066+
ElementCreator::ScriptCreated,
1067+
CustomElementCreationMode::Asynchronous,
1068+
None,
1069+
can_gc,
1070+
);
10641071
fragment
10651072
.upcast::<Node>()
10661073
.AppendChild(br.upcast(), can_gc)

components/script/dom/html/htmlinputelement.rs

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use embedder_traits::{
1818
};
1919
use encoding_rs::Encoding;
2020
use euclid::{Point2D, Rect, Size2D};
21-
use html5ever::{LocalName, Prefix, local_name, ns};
21+
use html5ever::{LocalName, Prefix, QualName, local_name, ns};
2222
use js::jsapi::{
2323
ClippedTime, DateGetMsecSinceEpoch, Handle, JS_ClearPendingException, JSObject, NewDateObject,
2424
NewUCRegExpObject, ObjectIsDate, RegExpFlag_UnicodeSets, RegExpFlags,
@@ -60,14 +60,15 @@ use crate::dom::bindings::str::{DOMString, FromInputValueString, ToInputValueStr
6060
use crate::dom::clipboardevent::ClipboardEvent;
6161
use crate::dom::compositionevent::CompositionEvent;
6262
use crate::dom::document::Document;
63-
use crate::dom::element::{AttributeMutation, Element, LayoutElementHelpers};
63+
use crate::dom::element::{
64+
AttributeMutation, CustomElementCreationMode, Element, ElementCreator, LayoutElementHelpers,
65+
};
6466
use crate::dom::event::{Event, EventBubbles, EventCancelable};
6567
use crate::dom::eventtarget::EventTarget;
6668
use crate::dom::file::File;
6769
use crate::dom::filelist::{FileList, LayoutFileListHelpers};
6870
use crate::dom::globalscope::GlobalScope;
6971
use crate::dom::html::htmldatalistelement::HTMLDataListElement;
70-
use crate::dom::html::htmldivelement::HTMLDivElement;
7172
use crate::dom::html::htmlelement::HTMLElement;
7273
use crate::dom::html::htmlfieldsetelement::HTMLFieldSetElement;
7374
use crate::dom::html::htmlformelement::{
@@ -123,9 +124,9 @@ const DEFAULT_FILE_INPUT_VALUE: &str = "No file chosen";
123124
// TextNode within an inline flow. Another example is the horizontal scroll.
124125
// FIXME(#38263): Refactor these logics into a TextControl wrapper that would decouple all textual input.
125126
struct InputTypeTextShadowTree {
126-
inner_container: Dom<HTMLDivElement>,
127-
text_container: Dom<HTMLDivElement>,
128-
placeholder_container: DomRefCell<Option<Dom<HTMLDivElement>>>,
127+
inner_container: Dom<Element>,
128+
text_container: Dom<Element>,
129+
placeholder_container: DomRefCell<Option<Dom<Element>>>,
129130
}
130131

131132
impl InputTypeTextShadowTree {
@@ -158,7 +159,7 @@ impl InputTypeTextShadowTree {
158159
/// The shadow tree consists of a single div with the currently selected color as
159160
/// the background.
160161
struct InputTypeColorShadowTree {
161-
color_value: Dom<HTMLDivElement>,
162+
color_value: Dom<Element>,
162163
}
163164

164165
#[derive(Clone, JSTraceable, MallocSizeOf)]
@@ -178,8 +179,17 @@ fn create_ua_widget_div_with_text_node(
178179
implemented_pseudo: PseudoElement,
179180
as_first_child: bool,
180181
can_gc: CanGc,
181-
) -> DomRoot<HTMLDivElement> {
182-
let el = HTMLDivElement::new(local_name!("div"), None, document, None, can_gc);
182+
) -> DomRoot<Element> {
183+
let el = Element::create(
184+
QualName::new(None, ns!(html), local_name!("div")),
185+
None,
186+
document,
187+
ElementCreator::ScriptCreated,
188+
CustomElementCreationMode::Asynchronous,
189+
None,
190+
can_gc,
191+
);
192+
183193
parent
184194
.upcast::<Node>()
185195
.AppendChild(el.upcast::<Node>(), can_gc)
@@ -1168,8 +1178,15 @@ impl HTMLInputElement {
11681178
let shadow_root = self.shadow_root(can_gc);
11691179
Node::replace_all(None, shadow_root.upcast::<Node>(), can_gc);
11701180

1171-
let inner_container =
1172-
HTMLDivElement::new(local_name!("div"), None, &document, None, can_gc);
1181+
let inner_container = Element::create(
1182+
QualName::new(None, ns!(html), local_name!("div")),
1183+
None,
1184+
&document,
1185+
ElementCreator::ScriptCreated,
1186+
CustomElementCreationMode::Asynchronous,
1187+
None,
1188+
can_gc,
1189+
);
11731190
shadow_root
11741191
.upcast::<Node>()
11751192
.AppendChild(inner_container.upcast::<Node>(), can_gc)
@@ -1223,7 +1240,15 @@ impl HTMLInputElement {
12231240
let shadow_root = self.shadow_root(can_gc);
12241241
Node::replace_all(None, shadow_root.upcast::<Node>(), can_gc);
12251242

1226-
let color_value = HTMLDivElement::new(local_name!("div"), None, &document, None, can_gc);
1243+
let color_value = Element::create(
1244+
QualName::new(None, ns!(html), local_name!("div")),
1245+
None,
1246+
&document,
1247+
ElementCreator::ScriptCreated,
1248+
CustomElementCreationMode::Asynchronous,
1249+
None,
1250+
can_gc,
1251+
);
12271252
shadow_root
12281253
.upcast::<Node>()
12291254
.AppendChild(color_value.upcast::<Node>(), can_gc)
@@ -1343,10 +1368,11 @@ impl HTMLInputElement {
13431368
value = DOMString::from("#000000");
13441369
}
13451370
let style = format!("background-color: {value}");
1346-
color_shadow_tree
1347-
.color_value
1348-
.upcast::<Element>()
1349-
.set_string_attribute(&local_name!("style"), style.into(), can_gc);
1371+
color_shadow_tree.color_value.set_string_attribute(
1372+
&local_name!("style"),
1373+
style.into(),
1374+
can_gc,
1375+
);
13501376
}
13511377

13521378
fn update_shadow_tree(&self, can_gc: CanGc) {

components/script/dom/html/htmlmediaelement.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use dom_struct::dom_struct;
1515
use embedder_traits::{MediaPositionState, MediaSessionEvent, MediaSessionPlaybackState};
1616
use euclid::default::Size2D;
1717
use headers::{ContentLength, ContentRange, HeaderMapExt};
18-
use html5ever::{LocalName, Prefix, local_name, ns};
18+
use html5ever::{LocalName, Prefix, QualName, local_name, ns};
1919
use http::StatusCode;
2020
use http::header::{self, HeaderMap, HeaderValue};
2121
use ipc_channel::ipc::{self, IpcSharedMemory, channel};
@@ -74,16 +74,14 @@ use crate::dom::blob::Blob;
7474
use crate::dom::csp::{GlobalCspReporting, Violation};
7575
use crate::dom::document::Document;
7676
use crate::dom::element::{
77-
AttributeMutation, Element, ElementCreator, cors_setting_for_element,
78-
reflect_cross_origin_attribute, set_cross_origin_attribute,
77+
AttributeMutation, CustomElementCreationMode, Element, ElementCreator,
78+
cors_setting_for_element, reflect_cross_origin_attribute, set_cross_origin_attribute,
7979
};
8080
use crate::dom::event::Event;
8181
use crate::dom::eventtarget::EventTarget;
8282
use crate::dom::globalscope::GlobalScope;
8383
use crate::dom::html::htmlelement::HTMLElement;
84-
use crate::dom::html::htmlscriptelement::HTMLScriptElement;
8584
use crate::dom::html::htmlsourceelement::HTMLSourceElement;
86-
use crate::dom::html::htmlstyleelement::HTMLStyleElement;
8785
use crate::dom::html::htmlvideoelement::HTMLVideoElement;
8886
use crate::dom::mediaerror::MediaError;
8987
use crate::dom::mediafragmentparser::MediaFragmentParser;
@@ -2061,12 +2059,13 @@ impl HTMLMediaElement {
20612059
.upcast::<Element>()
20622060
.attach_ua_shadow_root(false, can_gc);
20632061
let document = self.owner_document();
2064-
let script = HTMLScriptElement::new(
2065-
local_name!("script"),
2062+
let script = Element::create(
2063+
QualName::new(None, ns!(html), local_name!("script")),
20662064
None,
20672065
&document,
2068-
None,
20692066
ElementCreator::ScriptCreated,
2067+
CustomElementCreationMode::Asynchronous,
2068+
None,
20702069
can_gc,
20712070
);
20722071
// This is our hacky way to temporarily workaround the lack of a privileged
@@ -2088,14 +2087,16 @@ impl HTMLMediaElement {
20882087
return;
20892088
}
20902089

2091-
let style = HTMLStyleElement::new(
2092-
local_name!("script"),
2090+
let style = Element::create(
2091+
QualName::new(None, ns!(html), local_name!("style")),
20932092
None,
20942093
&document,
2095-
None,
20962094
ElementCreator::ScriptCreated,
2095+
CustomElementCreationMode::Asynchronous,
2096+
None,
20972097
can_gc,
20982098
);
2099+
20992100
style
21002101
.upcast::<Node>()
21012102
.set_text_content_for_element(Some(DOMString::from(MEDIA_CONTROL_CSS)), can_gc);

0 commit comments

Comments
 (0)