mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Format script component
This commit is contained in:
parent
2ca7a13473
commit
c37a345dc9
357 changed files with 25485 additions and 18076 deletions
|
@ -49,27 +49,44 @@ pub struct HTMLElement {
|
|||
}
|
||||
|
||||
impl HTMLElement {
|
||||
pub fn new_inherited(tag_name: LocalName, prefix: Option<Prefix>,
|
||||
document: &Document) -> HTMLElement {
|
||||
pub fn new_inherited(
|
||||
tag_name: LocalName,
|
||||
prefix: Option<Prefix>,
|
||||
document: &Document,
|
||||
) -> HTMLElement {
|
||||
HTMLElement::new_inherited_with_state(ElementState::empty(), tag_name, prefix, document)
|
||||
}
|
||||
|
||||
pub fn new_inherited_with_state(state: ElementState, tag_name: LocalName,
|
||||
prefix: Option<Prefix>, document: &Document)
|
||||
-> HTMLElement {
|
||||
pub fn new_inherited_with_state(
|
||||
state: ElementState,
|
||||
tag_name: LocalName,
|
||||
prefix: Option<Prefix>,
|
||||
document: &Document,
|
||||
) -> HTMLElement {
|
||||
HTMLElement {
|
||||
element:
|
||||
Element::new_inherited_with_state(state, tag_name, ns!(html), prefix, document),
|
||||
element: Element::new_inherited_with_state(
|
||||
state,
|
||||
tag_name,
|
||||
ns!(html),
|
||||
prefix,
|
||||
document,
|
||||
),
|
||||
style_decl: Default::default(),
|
||||
dataset: Default::default(),
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unrooted_must_root)]
|
||||
pub fn new(local_name: LocalName, prefix: Option<Prefix>, document: &Document) -> DomRoot<HTMLElement> {
|
||||
Node::reflect_node(Box::new(HTMLElement::new_inherited(local_name, prefix, document)),
|
||||
document,
|
||||
HTMLElementBinding::Wrap)
|
||||
pub fn new(
|
||||
local_name: LocalName,
|
||||
prefix: Option<Prefix>,
|
||||
document: &Document,
|
||||
) -> DomRoot<HTMLElement> {
|
||||
Node::reflect_node(
|
||||
Box::new(HTMLElement::new_inherited(local_name, prefix, document)),
|
||||
document,
|
||||
HTMLElementBinding::Wrap,
|
||||
)
|
||||
}
|
||||
|
||||
fn is_body_or_frameset(&self) -> bool {
|
||||
|
@ -84,13 +101,24 @@ impl HTMLElement {
|
|||
node.set_flag(NodeFlags::SEQUENTIALLY_FOCUSABLE, true);
|
||||
} else {
|
||||
match node.type_id() {
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) |
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) |
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLIFrameElement)) |
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement))
|
||||
=> node.set_flag(NodeFlags::SEQUENTIALLY_FOCUSABLE, true),
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLinkElement)) |
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) => {
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(
|
||||
HTMLElementTypeId::HTMLButtonElement,
|
||||
)) |
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(
|
||||
HTMLElementTypeId::HTMLSelectElement,
|
||||
)) |
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(
|
||||
HTMLElementTypeId::HTMLIFrameElement,
|
||||
)) |
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(
|
||||
HTMLElementTypeId::HTMLTextAreaElement,
|
||||
)) => node.set_flag(NodeFlags::SEQUENTIALLY_FOCUSABLE, true),
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(
|
||||
HTMLElementTypeId::HTMLLinkElement,
|
||||
)) |
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(
|
||||
HTMLElementTypeId::HTMLAnchorElement,
|
||||
)) => {
|
||||
if element.has_attribute(&local_name!("href")) {
|
||||
node.set_flag(NodeFlags::SEQUENTIALLY_FOCUSABLE, true);
|
||||
}
|
||||
|
@ -119,10 +147,12 @@ impl HTMLElementMethods for HTMLElement {
|
|||
fn Style(&self) -> DomRoot<CSSStyleDeclaration> {
|
||||
self.style_decl.or_init(|| {
|
||||
let global = window_from_node(self);
|
||||
CSSStyleDeclaration::new(&global,
|
||||
CSSStyleOwner::Element(Dom::from_ref(self.upcast())),
|
||||
None,
|
||||
CSSModificationAccess::ReadWrite)
|
||||
CSSStyleDeclaration::new(
|
||||
&global,
|
||||
CSSStyleOwner::Element(Dom::from_ref(self.upcast())),
|
||||
None,
|
||||
CSSModificationAccess::ReadWrite,
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -162,7 +192,8 @@ impl HTMLElementMethods for HTMLElement {
|
|||
None
|
||||
}
|
||||
} else {
|
||||
self.upcast::<EventTarget>().get_event_handler_common("load")
|
||||
self.upcast::<EventTarget>()
|
||||
.get_event_handler_common("load")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -174,7 +205,8 @@ impl HTMLElementMethods for HTMLElement {
|
|||
document.window().SetOnload(listener)
|
||||
}
|
||||
} else {
|
||||
self.upcast::<EventTarget>().set_event_handler_common("load", listener)
|
||||
self.upcast::<EventTarget>()
|
||||
.set_event_handler_common("load", listener)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -188,7 +220,8 @@ impl HTMLElementMethods for HTMLElement {
|
|||
None
|
||||
}
|
||||
} else {
|
||||
self.upcast::<EventTarget>().get_event_handler_common("resize")
|
||||
self.upcast::<EventTarget>()
|
||||
.get_event_handler_common("resize")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -200,7 +233,8 @@ impl HTMLElementMethods for HTMLElement {
|
|||
document.window().SetOnresize(listener);
|
||||
}
|
||||
} else {
|
||||
self.upcast::<EventTarget>().set_event_handler_common("resize", listener)
|
||||
self.upcast::<EventTarget>()
|
||||
.set_event_handler_common("resize", listener)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -214,7 +248,8 @@ impl HTMLElementMethods for HTMLElement {
|
|||
None
|
||||
}
|
||||
} else {
|
||||
self.upcast::<EventTarget>().get_event_handler_common("blur")
|
||||
self.upcast::<EventTarget>()
|
||||
.get_event_handler_common("blur")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -226,7 +261,8 @@ impl HTMLElementMethods for HTMLElement {
|
|||
document.window().SetOnblur(listener)
|
||||
}
|
||||
} else {
|
||||
self.upcast::<EventTarget>().set_event_handler_common("blur", listener)
|
||||
self.upcast::<EventTarget>()
|
||||
.set_event_handler_common("blur", listener)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -240,7 +276,8 @@ impl HTMLElementMethods for HTMLElement {
|
|||
None
|
||||
}
|
||||
} else {
|
||||
self.upcast::<EventTarget>().get_event_handler_common("focus")
|
||||
self.upcast::<EventTarget>()
|
||||
.get_event_handler_common("focus")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -252,7 +289,8 @@ impl HTMLElementMethods for HTMLElement {
|
|||
document.window().SetOnfocus(listener)
|
||||
}
|
||||
} else {
|
||||
self.upcast::<EventTarget>().set_event_handler_common("focus", listener)
|
||||
self.upcast::<EventTarget>()
|
||||
.set_event_handler_common("focus", listener)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -266,7 +304,8 @@ impl HTMLElementMethods for HTMLElement {
|
|||
None
|
||||
}
|
||||
} else {
|
||||
self.upcast::<EventTarget>().get_event_handler_common("scroll")
|
||||
self.upcast::<EventTarget>()
|
||||
.get_event_handler_common("scroll")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -278,13 +317,16 @@ impl HTMLElementMethods for HTMLElement {
|
|||
document.window().SetOnscroll(listener)
|
||||
}
|
||||
} else {
|
||||
self.upcast::<EventTarget>().set_event_handler_common("scroll", listener)
|
||||
self.upcast::<EventTarget>()
|
||||
.set_event_handler_common("scroll", listener)
|
||||
}
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#attr-itemtype
|
||||
fn Itemtypes(&self) -> Option<Vec<DOMString>> {
|
||||
let atoms = self.element.get_tokenlist_attribute(&local_name!("itemtype"), );
|
||||
let atoms = self
|
||||
.element
|
||||
.get_tokenlist_attribute(&local_name!("itemtype"));
|
||||
|
||||
if atoms.is_empty() {
|
||||
return None;
|
||||
|
@ -300,7 +342,9 @@ impl HTMLElementMethods for HTMLElement {
|
|||
|
||||
// https://html.spec.whatwg.org/multipage/#names:-the-itemprop-attribute
|
||||
fn PropertyNames(&self) -> Option<Vec<DOMString>> {
|
||||
let atoms = self.element.get_tokenlist_attribute(&local_name!("itemprop"), );
|
||||
let atoms = self
|
||||
.element
|
||||
.get_tokenlist_attribute(&local_name!("itemprop"));
|
||||
|
||||
if atoms.is_empty() {
|
||||
return None;
|
||||
|
@ -317,12 +361,14 @@ impl HTMLElementMethods for HTMLElement {
|
|||
// https://html.spec.whatwg.org/multipage/#dom-click
|
||||
fn Click(&self) {
|
||||
if !self.upcast::<Element>().disabled_state() {
|
||||
synthetic_click_activation(self.upcast::<Element>(),
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
ActivationSource::FromClick)
|
||||
synthetic_click_activation(
|
||||
self.upcast::<Element>(),
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
ActivationSource::FromClick,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -418,7 +464,9 @@ impl HTMLElementMethods for HTMLElement {
|
|||
return node.GetTextContent().unwrap();
|
||||
}
|
||||
|
||||
window.layout_reflow(QueryMsg::ElementInnerTextQuery(node.to_trusted_node_address()));
|
||||
window.layout_reflow(QueryMsg::ElementInnerTextQuery(
|
||||
node.to_trusted_node_address(),
|
||||
));
|
||||
DOMString::from(window.layout().element_inner_text())
|
||||
}
|
||||
|
||||
|
@ -458,7 +506,7 @@ impl HTMLElementMethods for HTMLElement {
|
|||
},
|
||||
_ => {
|
||||
text.push(ch);
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -471,13 +519,12 @@ impl HTMLElementMethods for HTMLElement {
|
|||
}
|
||||
}
|
||||
|
||||
fn append_text_node_to_fragment(
|
||||
document: &Document,
|
||||
fragment: &DocumentFragment,
|
||||
text: String
|
||||
) {
|
||||
fn append_text_node_to_fragment(document: &Document, fragment: &DocumentFragment, text: String) {
|
||||
let text = Text::new(DOMString::from(text), document);
|
||||
fragment.upcast::<Node>().AppendChild(&text.upcast()).unwrap();
|
||||
fragment
|
||||
.upcast::<Node>()
|
||||
.AppendChild(&text.upcast())
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#attr-data-*
|
||||
|
@ -507,7 +554,6 @@ fn to_snake_case(name: DOMString) -> DOMString {
|
|||
DOMString::from(attr_name)
|
||||
}
|
||||
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#attr-data-*
|
||||
// if this attribute is in snake case with a data- prefix,
|
||||
// this function returns a name converted to camel case
|
||||
|
@ -546,44 +592,51 @@ fn to_camel_case(name: &str) -> Option<DOMString> {
|
|||
|
||||
impl HTMLElement {
|
||||
pub fn set_custom_attr(&self, name: DOMString, value: DOMString) -> ErrorResult {
|
||||
if name.chars()
|
||||
.skip_while(|&ch| ch != '\u{2d}')
|
||||
.nth(1).map_or(false, |ch| ch >= 'a' && ch <= 'z') {
|
||||
if name
|
||||
.chars()
|
||||
.skip_while(|&ch| ch != '\u{2d}')
|
||||
.nth(1)
|
||||
.map_or(false, |ch| ch >= 'a' && ch <= 'z')
|
||||
{
|
||||
return Err(Error::Syntax);
|
||||
}
|
||||
self.upcast::<Element>().set_custom_attribute(to_snake_case(name), value)
|
||||
self.upcast::<Element>()
|
||||
.set_custom_attribute(to_snake_case(name), value)
|
||||
}
|
||||
|
||||
pub fn get_custom_attr(&self, local_name: DOMString) -> Option<DOMString> {
|
||||
// FIXME(ajeffrey): Convert directly from DOMString to LocalName
|
||||
let local_name = LocalName::from(to_snake_case(local_name));
|
||||
self.upcast::<Element>().get_attribute(&ns!(), &local_name).map(|attr| {
|
||||
DOMString::from(&**attr.value()) // FIXME(ajeffrey): Convert directly from AttrValue to DOMString
|
||||
})
|
||||
self.upcast::<Element>()
|
||||
.get_attribute(&ns!(), &local_name)
|
||||
.map(|attr| {
|
||||
DOMString::from(&**attr.value()) // FIXME(ajeffrey): Convert directly from AttrValue to DOMString
|
||||
})
|
||||
}
|
||||
|
||||
pub fn delete_custom_attr(&self, local_name: DOMString) {
|
||||
// FIXME(ajeffrey): Convert directly from DOMString to LocalName
|
||||
let local_name = LocalName::from(to_snake_case(local_name));
|
||||
self.upcast::<Element>().remove_attribute(&ns!(), &local_name);
|
||||
self.upcast::<Element>()
|
||||
.remove_attribute(&ns!(), &local_name);
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#category-label
|
||||
pub fn is_labelable_element(&self) -> bool {
|
||||
// Note: HTMLKeygenElement is omitted because Servo doesn't currently implement it
|
||||
match self.upcast::<Node>().type_id() {
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(type_id)) =>
|
||||
match type_id {
|
||||
HTMLElementTypeId::HTMLInputElement =>
|
||||
self.downcast::<HTMLInputElement>().unwrap().input_type() != InputType::Hidden,
|
||||
HTMLElementTypeId::HTMLButtonElement |
|
||||
HTMLElementTypeId::HTMLMeterElement |
|
||||
HTMLElementTypeId::HTMLOutputElement |
|
||||
HTMLElementTypeId::HTMLProgressElement |
|
||||
HTMLElementTypeId::HTMLSelectElement |
|
||||
HTMLElementTypeId::HTMLTextAreaElement => true,
|
||||
_ => false,
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(type_id)) => match type_id {
|
||||
HTMLElementTypeId::HTMLInputElement => {
|
||||
self.downcast::<HTMLInputElement>().unwrap().input_type() != InputType::Hidden
|
||||
},
|
||||
HTMLElementTypeId::HTMLButtonElement |
|
||||
HTMLElementTypeId::HTMLMeterElement |
|
||||
HTMLElementTypeId::HTMLOutputElement |
|
||||
HTMLElementTypeId::HTMLProgressElement |
|
||||
HTMLElementTypeId::HTMLSelectElement |
|
||||
HTMLElementTypeId::HTMLTextAreaElement => true,
|
||||
_ => false,
|
||||
},
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
@ -597,27 +650,29 @@ impl HTMLElement {
|
|||
}
|
||||
|
||||
match self.upcast::<Node>().type_id() {
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(type_id)) =>
|
||||
match type_id {
|
||||
HTMLElementTypeId::HTMLButtonElement |
|
||||
HTMLElementTypeId::HTMLFieldSetElement |
|
||||
HTMLElementTypeId::HTMLInputElement |
|
||||
HTMLElementTypeId::HTMLObjectElement |
|
||||
HTMLElementTypeId::HTMLOutputElement |
|
||||
HTMLElementTypeId::HTMLSelectElement |
|
||||
HTMLElementTypeId::HTMLTextAreaElement => true,
|
||||
_ => false,
|
||||
},
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(type_id)) => match type_id {
|
||||
HTMLElementTypeId::HTMLButtonElement |
|
||||
HTMLElementTypeId::HTMLFieldSetElement |
|
||||
HTMLElementTypeId::HTMLInputElement |
|
||||
HTMLElementTypeId::HTMLObjectElement |
|
||||
HTMLElementTypeId::HTMLOutputElement |
|
||||
HTMLElementTypeId::HTMLSelectElement |
|
||||
HTMLElementTypeId::HTMLTextAreaElement => true,
|
||||
_ => false,
|
||||
},
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn supported_prop_names_custom_attr(&self) -> Vec<DOMString> {
|
||||
let element = self.upcast::<Element>();
|
||||
element.attrs().iter().filter_map(|attr| {
|
||||
let raw_name = attr.local_name();
|
||||
to_camel_case(&raw_name)
|
||||
}).collect()
|
||||
element
|
||||
.attrs()
|
||||
.iter()
|
||||
.filter_map(|attr| {
|
||||
let raw_name = attr.local_name();
|
||||
to_camel_case(&raw_name)
|
||||
}).collect()
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-lfe-labels
|
||||
|
@ -629,8 +684,7 @@ impl HTMLElement {
|
|||
|
||||
// Traverse ancestors for implicitly associated <label> elements
|
||||
// https://html.spec.whatwg.org/multipage/#the-label-element:attr-label-for-4
|
||||
let ancestors =
|
||||
self.upcast::<Node>()
|
||||
let ancestors = self.upcast::<Node>()
|
||||
.ancestors()
|
||||
.filter_map(DomRoot::downcast::<HTMLElement>)
|
||||
// If we reach a labelable element, we have a guarantee no ancestors above it
|
||||
|
@ -650,11 +704,12 @@ impl HTMLElement {
|
|||
// Traverse entire tree for <label> elements with `for` attribute matching `id`
|
||||
let root_element = element.root_element();
|
||||
let root_node = root_element.upcast::<Node>();
|
||||
let children = root_node.traverse_preorder()
|
||||
.filter_map(DomRoot::downcast::<Element>)
|
||||
.filter(|elem| elem.is::<HTMLLabelElement>())
|
||||
.filter(|elem| elem.get_string_attribute(&local_name!("for")) == id)
|
||||
.map(DomRoot::upcast::<Node>);
|
||||
let children = root_node
|
||||
.traverse_preorder()
|
||||
.filter_map(DomRoot::downcast::<Element>)
|
||||
.filter(|elem| elem.is::<HTMLLabelElement>())
|
||||
.filter(|elem| elem.get_string_attribute(&local_name!("for")) == id)
|
||||
.map(DomRoot::upcast::<Node>);
|
||||
|
||||
NodeList::new_simple_list(&window, children.chain(ancestors))
|
||||
}
|
||||
|
@ -671,13 +726,15 @@ impl VirtualMethods for HTMLElement {
|
|||
(name, AttributeMutation::Set(_)) if name.starts_with("on") => {
|
||||
let evtarget = self.upcast::<EventTarget>();
|
||||
let source_line = 1; //TODO(#9604) get current JS execution line
|
||||
evtarget.set_event_handler_uncompiled(window_from_node(self).get_url(),
|
||||
source_line,
|
||||
&name[2..],
|
||||
// FIXME(ajeffrey): Convert directly from AttrValue to DOMString
|
||||
DOMString::from(&**attr.value()));
|
||||
evtarget.set_event_handler_uncompiled(
|
||||
window_from_node(self).get_url(),
|
||||
source_line,
|
||||
&name[2..],
|
||||
// FIXME(ajeffrey): Convert directly from AttrValue to DOMString
|
||||
DOMString::from(&**attr.value()),
|
||||
);
|
||||
},
|
||||
_ => {}
|
||||
_ => {},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -692,12 +749,10 @@ impl VirtualMethods for HTMLElement {
|
|||
match name {
|
||||
&local_name!("itemprop") => AttrValue::from_serialized_tokenlist(value.into()),
|
||||
&local_name!("itemtype") => AttrValue::from_serialized_tokenlist(value.into()),
|
||||
_ => {
|
||||
self.super_type().unwrap().parse_plain_attribute(
|
||||
name,
|
||||
value,
|
||||
)
|
||||
},
|
||||
_ => self
|
||||
.super_type()
|
||||
.unwrap()
|
||||
.parse_plain_attribute(name, value),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue