Format script component

This commit is contained in:
chansuke 2018-09-18 23:24:15 +09:00 committed by Josh Matthews
parent 2ca7a13473
commit c37a345dc9
357 changed files with 25485 additions and 18076 deletions

View file

@ -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),
}
}
}