diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2015-10-06 17:21:44 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2015-10-21 11:37:16 +0200 |
commit | 13ea3ac413c511872784ccde416956217746553c (patch) | |
tree | 732335bbc9a5e4b42f93a0b629c76ad41cd8aa3f /components/script/dom/document.rs | |
parent | bd363b009db8e5e233cd862aef5c8d497495a10e (diff) | |
download | servo-13ea3ac413c511872784ccde416956217746553c.tar.gz servo-13ea3ac413c511872784ccde416956217746553c.zip |
Introduce trait Castable
This trait is used to hold onto the downcast and upcast functions of all
castable IDL interfaces. A castable IDL interface is one which either derives
from or is derived by other interfaces.
The deriving relation is represented by implementations of marker trait
DerivedFrom<T: Castable> generated in InheritTypes.
/^[ ]*use dom::bindings::codegen::InheritTypes::.*(Base|Cast|Derived)/ {
/::[a-zA-Z]+(Base|Cast|Derived);/d
s/([{ ])[a-zA-Z]+(Base|Cast|Derived), /\1/g
s/([{ ])[a-zA-Z]+(Base|Cast|Derived), /\1/g
s/, [a-zA-Z]+(Base|Cast|Derived)([},])/\2/g
s/, [a-zA-Z]+(Base|Cast|Derived)([},])/\2/g
/\{([a-zA-Z]+(Base|Cast|Derived))?\};$/d
s/\{([a-zA-Z_]+)\};$/\1;/
}
s/([a-zA-Z]+)Cast::from_ref\(\&?\**([a-zA-Z_]+)(\.r\(\))?\)/\2.upcast::<\1>()/g
s/([a-zA-Z]+)Cast::from_ref\(\&?\**([a-zA-Z_]+)(\.[a-zA-Z_]+\(\))?\)/\2\3.upcast::<\1>()/g
s/\(([a-zA-Z]+)Cast::from_ref\)/\(Castable::upcast::<\1>\)/g
s/([a-zA-Z]+)Cast::from_root/Root::upcast::<\1>/g
s/([a-zA-Z]+)Cast::from_layout_js\(\&([a-zA-Z_.]+)\)/\2.upcast::<\1>()/g
s/([a-zA-Z]+)Cast::to_ref\(\&?\**([a-zA-Z_]+)(\.r\(\))?\)/\2.downcast::<\1>()/g
s/([a-zA-Z]+)Cast::to_ref\(\&?\**([a-zA-Z_]+)(\.[a-zA-Z_]+\(\))?\)/\2\3.downcast::<\1>()/g
s/\(([a-zA-Z]+)Cast::to_ref\)/\(Castable::downcast::<\1>\)/g
s/([a-zA-Z]+)Cast::to_root/Root::downcast::<\1>/g
s/([a-zA-Z]+)Cast::to_layout_js\(&?([a-zA-Z_.]+(\(\))?)\)/\2.downcast::<\1>()/g
s/\.is_document\(\)/.is::<Document>()/g
s/\.is_htmlanchorelement\(\)/.is::<HTMLAnchorElement>()/g
s/\.is_htmlappletelement\(\)/.is::<HTMLAppletElement>()/g
s/\.is_htmlareaelement\(\)/.is::<HTMLAreaElement>()/g
s/\.is_htmlbodyelement\(\)/.is::<HTMLBodyElement>()/g
s/\.is_htmlembedelement\(\)/.is::<HTMLEmbedElement>()/g
s/\.is_htmlfieldsetelement\(\)/.is::<HTMLFieldSetElement>()/g
s/\.is_htmlformelement\(\)/.is::<HTMLFormElement>()/g
s/\.is_htmlframesetelement\(\)/.is::<HTMLFrameSetElement>()/g
s/\.is_htmlhtmlelement\(\)/.is::<HTMLHtmlElement>()/g
s/\.is_htmlimageelement\(\)/.is::<HTMLImageElement>()/g
s/\.is_htmllegendelement\(\)/.is::<HTMLLegendElement>()/g
s/\.is_htmloptgroupelement\(\)/.is::<HTMLOptGroupElement>()/g
s/\.is_htmloptionelement\(\)/.is::<HTMLOptionElement>()/g
s/\.is_htmlscriptelement\(\)/.is::<HTMLScriptElement>()/g
s/\.is_htmltabledatacellelement\(\)/.is::<HTMLTableDataCellElement>()/g
s/\.is_htmltableheadercellelement\(\)/.is::<HTMLTableHeaderCellElement>()/g
s/\.is_htmltablerowelement\(\)/.is::<HTMLTableRowElement>()/g
s/\.is_htmltablesectionelement\(\)/.is::<HTMLTableSectionElement>()/g
s/\.is_htmltitleelement\(\)/.is::<HTMLTitleElement>()/g
Diffstat (limited to 'components/script/dom/document.rs')
-rw-r--r-- | components/script/dom/document.rs | 253 |
1 files changed, 125 insertions, 128 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index c29e3a2d2cc..2078c872978 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -14,19 +14,9 @@ use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter; use dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use dom::bindings::codegen::InheritTypes::{DocumentDerived, DocumentTypeCast, ElementCast}; -use dom::bindings::codegen::InheritTypes::{ElementDerived, ElementTypeId}; -use dom::bindings::codegen::InheritTypes::{EventCast, EventTargetCast}; -use dom::bindings::codegen::InheritTypes::{HTMLAnchorElementCast, HTMLAnchorElementDerived}; -use dom::bindings::codegen::InheritTypes::{HTMLAppletElementDerived, HTMLAreaElementDerived}; -use dom::bindings::codegen::InheritTypes::{HTMLBaseElementCast, HTMLBodyElementCast}; -use dom::bindings::codegen::InheritTypes::{HTMLElementCast, HTMLElementTypeId}; -use dom::bindings::codegen::InheritTypes::{HTMLEmbedElementDerived, HTMLFormElementDerived}; -use dom::bindings::codegen::InheritTypes::{HTMLHeadElementCast, HTMLHtmlElementCast}; -use dom::bindings::codegen::InheritTypes::{HTMLIFrameElementCast, HTMLImageElementDerived}; -use dom::bindings::codegen::InheritTypes::{HTMLScriptElementDerived, HTMLTitleElementDerived}; -use dom::bindings::codegen::InheritTypes::{NodeCast, NodeTypeId}; +use dom::bindings::codegen::InheritTypes::{ElementTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::codegen::UnionTypes::NodeOrString; +use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; use dom::bindings::js::RootedReference; @@ -45,13 +35,20 @@ use dom::element::{Element, ElementCreator}; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::{EventTarget}; use dom::htmlanchorelement::HTMLAnchorElement; +use dom::htmlappletelement::HTMLAppletElement; +use dom::htmlareaelement::HTMLAreaElement; use dom::htmlbaseelement::HTMLBaseElement; +use dom::htmlbodyelement::HTMLBodyElement; use dom::htmlcollection::{CollectionFilter, HTMLCollection}; use dom::htmlelement::{HTMLElement}; +use dom::htmlembedelement::HTMLEmbedElement; +use dom::htmlformelement::HTMLFormElement; use dom::htmlheadelement::HTMLHeadElement; use dom::htmlhtmlelement::HTMLHtmlElement; use dom::htmliframeelement::{self, HTMLIFrameElement}; +use dom::htmlimageelement::HTMLImageElement; use dom::htmlscriptelement::HTMLScriptElement; +use dom::htmltitleelement::HTMLTitleElement; use dom::keyboardevent::KeyboardEvent; use dom::location::Location; use dom::messageevent::MessageEvent; @@ -167,7 +164,7 @@ impl PartialEq for Document { struct ImagesFilter; impl CollectionFilter for ImagesFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { - elem.is_htmlimageelement() + elem.is::<HTMLImageElement>() } } @@ -175,7 +172,7 @@ impl CollectionFilter for ImagesFilter { struct EmbedsFilter; impl CollectionFilter for EmbedsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { - elem.is_htmlembedelement() + elem.is::<HTMLEmbedElement>() } } @@ -183,7 +180,7 @@ impl CollectionFilter for EmbedsFilter { struct LinksFilter; impl CollectionFilter for LinksFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { - (elem.is_htmlanchorelement() || elem.is_htmlareaelement()) && + (elem.is::<HTMLAnchorElement>() || elem.is::<HTMLAreaElement>()) && elem.has_attribute(&atom!("href")) } } @@ -192,7 +189,7 @@ impl CollectionFilter for LinksFilter { struct FormsFilter; impl CollectionFilter for FormsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { - elem.is_htmlformelement() + elem.is::<HTMLFormElement>() } } @@ -200,7 +197,7 @@ impl CollectionFilter for FormsFilter { struct ScriptsFilter; impl CollectionFilter for ScriptsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { - elem.is_htmlscriptelement() + elem.is::<HTMLScriptElement>() } } @@ -208,7 +205,7 @@ impl CollectionFilter for ScriptsFilter { struct AnchorsFilter; impl CollectionFilter for AnchorsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { - elem.is_htmlanchorelement() && elem.has_attribute(&atom!("href")) + elem.is::<HTMLAnchorElement>() && elem.has_attribute(&atom!("href")) } } @@ -216,7 +213,7 @@ impl CollectionFilter for AnchorsFilter { struct AppletsFilter; impl CollectionFilter for AppletsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { - elem.is_htmlappletelement() + elem.is::<HTMLAppletElement>() } } @@ -290,10 +287,10 @@ impl Document { /// Refresh the cached first base element in the DOM. /// https://github.com/w3c/web-platform-tests/issues/2122 pub fn refresh_base_element(&self) { - let base = NodeCast::from_ref(self) + let base = self.upcast::<Node>() .traverse_preorder() - .filter_map(HTMLBaseElementCast::to_root) - .filter(|element| ElementCast::from_ref(&**element).has_attribute(&atom!("href"))) + .filter_map(Root::downcast::<HTMLBaseElement>) + .filter(|element| element.upcast::<Element>().has_attribute(&atom!("href"))) .next(); self.base_element.set(base.r()); } @@ -383,7 +380,7 @@ impl Document { id: Atom) { debug!("Adding named element to document {:p}: {:p} id={}", self, element, id); assert!({ - let node = NodeCast::from_ref(element); + let node = element.upcast::<Node>(); node.is_in_doc() }); assert!(!id.is_empty()); @@ -400,11 +397,11 @@ impl Document { Occupied(entry) => { let elements = entry.into_mut(); - let new_node = NodeCast::from_ref(element); + let new_node = element.upcast::<Node>(); let mut head: usize = 0; - let root = NodeCast::from_ref(root.r()); + let root = root.upcast::<Node>(); for node in root.traverse_preorder() { - if let Some(elem) = ElementCast::to_ref(node.r()) { + if let Some(elem) = node.downcast::<Element>() { if (*elements)[head].root().r() == elem { head += 1; } @@ -424,16 +421,16 @@ impl Document { pub fn find_fragment_node(&self, fragid: &str) -> Option<Root<Element>> { self.GetElementById(fragid.to_owned()).or_else(|| { let check_anchor = |&node: &&HTMLAnchorElement| { - let elem = ElementCast::from_ref(node); + let elem = node.upcast::<Element>(); elem.get_attribute(&ns!(""), &atom!("name")).map_or(false, |attr| { &**attr.r().value() == fragid }) }; - let doc_node = NodeCast::from_ref(self); + let doc_node = self.upcast::<Node>(); doc_node.traverse_preorder() - .filter_map(HTMLAnchorElementCast::to_root) + .filter_map(Root::downcast::<HTMLAnchorElement>) .find(|node| check_anchor(&node.r())) - .map(ElementCast::from_root) + .map(Root::upcast::<Element>) }) } @@ -443,7 +440,7 @@ impl Document { Some(root) => root, None => return None, }; - let root = NodeCast::from_ref(root); + let root = root.upcast::<Node>(); let address = match self.window.layout().hit_test(root.to_trusted_node_address(), *point) { Ok(HitTestResponse(node_address)) => Some(node_address), Err(()) => { @@ -460,7 +457,7 @@ impl Document { Some(root) => root, None => return vec!(), }; - let root = NodeCast::from_ref(root); + let root = root.upcast::<Node>(); match self.window.layout().mouse_over(root.to_trusted_node_address(), *point) { Ok(MouseOverResponse(node_address)) => node_address, Err(()) => vec!(), @@ -474,7 +471,7 @@ impl Document { let event = Event::new(GlobalRef::Window(&self.window), "readystatechange".to_owned(), EventBubbles::DoesNotBubble, EventCancelable::NotCancelable); - let target = EventTargetCast::from_ref(self); + let target = self.upcast::<EventTarget>(); let _ = event.r().fire(target); } @@ -542,7 +539,7 @@ impl Document { } pub fn dirty_all_nodes(&self) { - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); for node in root.traverse_preorder() { node.r().dirty(NodeDamage::OtherNodeDamage) } @@ -565,18 +562,18 @@ impl Document { None => return, }; - let el = match ElementCast::to_ref(node.r()) { + let el = match node.downcast::<Element>() { Some(el) => Root::from_ref(el), None => { let parent = node.r().GetParentNode(); - match parent.and_then(ElementCast::to_root) { + match parent.and_then(Root::downcast::<Element>) { Some(parent) => parent, None => return, } }, }; - let node = NodeCast::from_ref(el.r()); + let node = el.upcast::<Node>(); debug!("{} on {:?}", mouse_event_type_string, node.debug_str()); // Prevent click event if form control element is disabled. if let MouseEventType::Click = mouse_event_type { @@ -601,7 +598,7 @@ impl Document { false, false, false, false, 0i16, None); - let event = EventCast::from_ref(event.r()); + let event = event.upcast::<Event>(); // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#trusted-events event.set_trusted(true); @@ -609,7 +606,7 @@ impl Document { match mouse_event_type { MouseEventType::Click => el.authentic_click_activation(event), _ => { - let target = EventTargetCast::from_ref(node); + let target = node.upcast::<EventTarget>(); event.fire(target); }, } @@ -639,7 +636,7 @@ impl Document { false, false, false, false, 0i16, None); - let event = EventCast::from_ref(mouse_event.r()); + let event = mouse_event.upcast::<Event>(); event.fire(target); } @@ -653,8 +650,8 @@ impl Document { for node_address in &mouse_over_addresses { let node = node::from_untrusted_node_address(js_runtime, *node_address); mouse_over_targets.push(node.r().inclusive_ancestors() - .find(|node| node.r().is_element()) - .map(|node| JS::from_ref(ElementCast::to_ref(node.r()).unwrap())) + .find(|node| node.is::<Element>()) + .map(|node| JS::from_ref(node.downcast::<Element>().unwrap())) .unwrap()); }; @@ -667,7 +664,7 @@ impl Document { if target_ref.get_hover_state() { target_ref.set_hover_state(false); - let target = EventTargetCast::from_ref(target_ref); + let target = target_ref.upcast::<EventTarget>(); self.fire_mouse_event(point, &target, "mouseout".to_owned()); } @@ -681,7 +678,7 @@ impl Document { if !target.get_hover_state() { target.set_hover_state(true); - let target = EventTargetCast::from_ref(*target); + let target = target.upcast::<EventTarget>(); self.fire_mouse_event(point, target, "mouseover".to_owned()); @@ -693,7 +690,7 @@ impl Document { let top_most_node = node::from_untrusted_node_address(js_runtime, mouse_over_addresses[0]); - let target = EventTargetCast::from_ref(top_most_node.r()); + let target = top_most_node.upcast::<EventTarget>(); self.fire_mouse_event(point, target, "mousemove".to_owned()); } @@ -716,9 +713,9 @@ impl Document { let body = self.GetBody(); let target = match (&focused, &body) { - (&Some(ref focused), _) => EventTargetCast::from_ref(focused.r()), - (&None, &Some(ref body)) => EventTargetCast::from_ref(body.r()), - (&None, &None) => EventTargetCast::from_ref(&*self.window), + (&Some(ref focused), _) => focused.upcast::<EventTarget>(), + (&None, &Some(ref body)) => body.upcast::<EventTarget>(), + (&None, &None) => self.window.upcast::<EventTarget>(), }; let ctrl = modifiers.contains(CONTROL); @@ -741,7 +738,7 @@ impl Document { props.location, is_repeating, is_composing, ctrl, alt, shift, meta, None, props.key_code); - let event = EventCast::from_ref(keyevent.r()); + let event = keyevent.upcast::<Event>(); event.fire(target); let mut prevented = event.DefaultPrevented(); @@ -754,7 +751,7 @@ impl Document { props.location, is_repeating, is_composing, ctrl, alt, shift, meta, props.char_code, 0); - let ev = EventCast::from_ref(event.r()); + let ev = event.upcast::<Event>(); ev.fire(target); prevented = ev.DefaultPrevented(); // TODO: if keypress event is canceled, prevent firing input events @@ -771,7 +768,7 @@ impl Document { // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27337 match key { Key::Space if !prevented && state == KeyState::Released => { - let maybe_elem: Option<&Element> = ElementCast::to_ref(target); + let maybe_elem: Option<&Element> = target.downcast::<Element>(); if let Some(el) = maybe_elem { if let Some(a) = el.as_maybe_activatable() { a.synthetic_click_activation(ctrl, alt, shift, meta); @@ -779,7 +776,7 @@ impl Document { } } Key::Enter if !prevented && state == KeyState::Released => { - let maybe_elem: Option<&Element> = ElementCast::to_ref(target); + let maybe_elem: Option<&Element> = target.downcast::<Element>(); if let Some(el) = maybe_elem { if let Some(a) = el.as_maybe_activatable() { a.implicit_submission(ctrl, alt, shift, meta); @@ -800,18 +797,18 @@ impl Document { match nodes.into_iter().next().unwrap() { NodeOrString::eNode(node) => Ok(node), NodeOrString::eString(string) => { - Ok(NodeCast::from_root(self.CreateTextNode(string))) + Ok(Root::upcast::<Node>(self.CreateTextNode(string))) }, } } else { - let fragment = NodeCast::from_root(self.CreateDocumentFragment()); + let fragment = Root::upcast::<Node>(self.CreateDocumentFragment()); for node in nodes { match node { NodeOrString::eNode(node) => { try!(fragment.r().AppendChild(node.r())); }, NodeOrString::eString(string) => { - let node = NodeCast::from_root(self.CreateTextNode(string)); + let node = Root::upcast::<Node>(self.CreateTextNode(string)); // No try!() here because appending a text node // should not fail. fragment.r().AppendChild(node.r()).unwrap(); @@ -823,17 +820,17 @@ impl Document { } pub fn get_body_attribute(&self, local_name: &Atom) -> DOMString { - match self.GetBody().and_then(HTMLBodyElementCast::to_root) { + match self.GetBody().and_then(Root::downcast::<HTMLBodyElement>) { Some(ref body) => { - ElementCast::from_ref(body.r()).get_string_attribute(local_name) + body.upcast::<Element>().get_string_attribute(local_name) }, None => "".to_owned() } } pub fn set_body_attribute(&self, local_name: &Atom, value: DOMString) { - if let Some(ref body) = self.GetBody().and_then(HTMLBodyElementCast::to_root) { - ElementCast::from_ref(body.r()).set_string_attribute(local_name, value); + if let Some(ref body) = self.GetBody().and_then(Root::downcast::<HTMLBodyElement>) { + body.upcast::<Element>().set_string_attribute(local_name, value); } } @@ -943,8 +940,8 @@ impl Document { /// Find an iframe element in the document. pub fn find_iframe(&self, subpage_id: SubpageId) -> Option<Root<HTMLIFrameElement>> { - NodeCast::from_ref(self).traverse_preorder() - .filter_map(HTMLIFrameElementCast::to_root) + self.upcast::<Node>().traverse_preorder() + .filter_map(Root::downcast::<HTMLIFrameElement>) .find(|node| node.r().subpage_id() == Some(subpage_id)) } } @@ -1061,7 +1058,7 @@ impl Document { GlobalRef::Window(window), DocumentBinding::Wrap); { - let node = NodeCast::from_ref(document.r()); + let node = document.upcast::<Node>(); node.set_owner_doc(document.r()); } document @@ -1069,7 +1066,7 @@ impl Document { fn create_node_list<F: Fn(&Node) -> bool>(&self, callback: F) -> Root<NodeList> { let doc = self.GetDocumentElement(); - let maybe_node = doc.r().map(NodeCast::from_ref); + let maybe_node = doc.r().map(Castable::upcast::<Node>); let iter = maybe_node.iter().flat_map(|node| node.traverse_preorder()) .filter(|node| callback(node.r())); NodeList::new_simple_list(&self.window, iter) @@ -1078,7 +1075,7 @@ impl Document { fn get_html_element(&self) -> Option<Root<HTMLHtmlElement>> { self.GetDocumentElement() .r() - .and_then(HTMLHtmlElementCast::to_ref) + .and_then(Castable::downcast::<HTMLHtmlElement>) .map(Root::from_ref) } @@ -1102,7 +1099,7 @@ impl Document { impl Element { fn click_event_filter_by_disabled_state(&self) -> bool { - let node = NodeCast::from_ref(self); + let node = self.upcast::<Node>(); match node.type_id() { NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) | NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) | @@ -1134,7 +1131,7 @@ impl DocumentMethods for Document { match self.get_focused_element() { Some(element) => Some(element), // Step 3. and 4. None => match self.GetBody() { // Step 5. - Some(body) => Some(ElementCast::from_root(body)), + Some(body) => Some(Root::upcast::<Element>(body)), None => self.GetDocumentElement(), } } @@ -1189,32 +1186,32 @@ impl DocumentMethods for Document { // https://dom.spec.whatwg.org/#dom-document-doctype fn GetDoctype(&self) -> Option<Root<DocumentType>> { - let node = NodeCast::from_ref(self); + let node = self.upcast::<Node>(); node.children() - .filter_map(|c| DocumentTypeCast::to_ref(c.r()).map(Root::from_ref)) + .filter_map(|c| c.downcast::<DocumentType>().map(Root::from_ref)) .next() } // https://dom.spec.whatwg.org/#dom-document-documentelement fn GetDocumentElement(&self) -> Option<Root<Element>> { - let node = NodeCast::from_ref(self); + let node = self.upcast::<Node>(); node.child_elements().next() } // https://dom.spec.whatwg.org/#dom-document-getelementsbytagname fn GetElementsByTagName(&self, tag_name: DOMString) -> Root<HTMLCollection> { - HTMLCollection::by_tag_name(&self.window, NodeCast::from_ref(self), tag_name) + HTMLCollection::by_tag_name(&self.window, self.upcast::<Node>(), tag_name) } // https://dom.spec.whatwg.org/#dom-document-getelementsbytagnamens fn GetElementsByTagNameNS(&self, maybe_ns: Option<DOMString>, tag_name: DOMString) -> Root<HTMLCollection> { - HTMLCollection::by_tag_name_ns(&self.window, NodeCast::from_ref(self), tag_name, maybe_ns) + HTMLCollection::by_tag_name_ns(&self.window, self.upcast::<Node>(), tag_name, maybe_ns) } // https://dom.spec.whatwg.org/#dom-document-getelementsbyclassname fn GetElementsByClassName(&self, classes: DOMString) -> Root<HTMLCollection> { - HTMLCollection::by_class_name(&self.window, NodeCast::from_ref(self), classes) + HTMLCollection::by_class_name(&self.window, self.upcast::<Node>(), classes) } // https://dom.spec.whatwg.org/#dom-nonelementparentnode-getelementbyid @@ -1307,7 +1304,7 @@ impl DocumentMethods for Document { // https://dom.spec.whatwg.org/#dom-document-importnode fn ImportNode(&self, node: &Node, deep: bool) -> Fallible<Root<Node>> { // Step 1. - if node.is_document() { + if node.is::<Document>() { return Err(Error::NotSupported); } @@ -1323,7 +1320,7 @@ impl DocumentMethods for Document { // https://dom.spec.whatwg.org/#dom-document-adoptnode fn AdoptNode(&self, node: &Node) -> Fallible<Root<Node>> { // Step 1. - if node.is_document() { + if node.is::<Document>() { return Err(Error::NotSupported); } @@ -1338,17 +1335,17 @@ impl DocumentMethods for Document { fn CreateEvent(&self, mut interface: DOMString) -> Fallible<Root<Event>> { interface.make_ascii_lowercase(); match &*interface { - "uievents" | "uievent" => Ok(EventCast::from_root( + "uievents" | "uievent" => Ok(Root::upcast::<Event>( UIEvent::new_uninitialized(&self.window))), - "mouseevents" | "mouseevent" => Ok(EventCast::from_root( + "mouseevents" | "mouseevent" => Ok(Root::upcast::<Event>( MouseEvent::new_uninitialized(&self.window))), - "customevent" => Ok(EventCast::from_root( + "customevent" => Ok(Root::upcast::<Event>( CustomEvent::new_uninitialized(GlobalRef::Window(&self.window)))), "htmlevents" | "events" | "event" => Ok(Event::new_uninitialized( GlobalRef::Window(&self.window))), - "keyboardevent" | "keyevents" => Ok(EventCast::from_root( + "keyboardevent" | "keyevents" => Ok(Root::upcast::<Event>( KeyboardEvent::new_uninitialized(&self.window))), - "messageevent" => Ok(EventCast::from_root( + "messageevent" => Ok(Root::upcast::<Event>( MessageEvent::new_uninitialized(GlobalRef::Window(&self.window)))), _ => Err(Error::NotSupported) } @@ -1384,15 +1381,15 @@ impl DocumentMethods for Document { let title = self.GetDocumentElement().and_then(|root| { if root.r().namespace() == &ns!(SVG) && root.r().local_name() == &atom!("svg") { // Step 1. - NodeCast::from_ref(root.r()).child_elements().find(|node| { + root.upcast::<Node>().child_elements().find(|node| { node.r().namespace() == &ns!(SVG) && node.r().local_name() == &atom!("title") - }).map(NodeCast::from_root) + }).map(Root::upcast::<Node>) } else { // Step 2. - NodeCast::from_ref(root.r()) - .traverse_preorder() - .find(|node| node.r().is_htmltitleelement()) + root.upcast::<Node>() + .traverse_preorder() + .find(|node| node.r().is::<HTMLTitleElement>()) } }); @@ -1415,25 +1412,25 @@ impl DocumentMethods for Document { let elem = if root.r().namespace() == &ns!(SVG) && root.r().local_name() == &atom!("svg") { - let elem = NodeCast::from_ref(root.r()).child_elements().find(|node| { + let elem = root.upcast::<Node>().child_elements().find(|node| { node.r().namespace() == &ns!(SVG) && node.r().local_name() == &atom!("title") }); match elem { - Some(elem) => NodeCast::from_root(elem), + Some(elem) => Root::upcast::<Node>(elem), None => { let name = QualName::new(ns!(SVG), atom!("title")); let elem = Element::create(name, None, self, ElementCreator::ScriptCreated); - NodeCast::from_ref(root.r()) - .AppendChild(NodeCast::from_ref(elem.r())) - .unwrap() + root.upcast::<Node>() + .AppendChild(elem.upcast::<Node>()) + .unwrap() } } } else if root.r().namespace() == &ns!(HTML) { - let elem = NodeCast::from_ref(root.r()) - .traverse_preorder() - .find(|node| node.r().is_htmltitleelement()); + let elem = root.upcast::<Node>() + .traverse_preorder() + .find(|node| node.r().is::<HTMLTitleElement>()); match elem { Some(elem) => elem, None => { @@ -1442,9 +1439,9 @@ impl DocumentMethods for Document { let name = QualName::new(ns!(HTML), atom!("title")); let elem = Element::create(name, None, self, ElementCreator::ScriptCreated); - NodeCast::from_ref(head.r()) - .AppendChild(NodeCast::from_ref(elem.r())) - .unwrap() + head.upcast::<Node>() + .AppendChild(elem.upcast::<Node>()) + .unwrap() }, None => return, } @@ -1460,9 +1457,9 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-head fn GetHead(&self) -> Option<Root<HTMLHeadElement>> { self.get_html_element().and_then(|root| { - let node = NodeCast::from_ref(root.r()); + let node = root.upcast::<Node>(); node.children() - .filter_map(|c| HTMLHeadElementCast::to_ref(c.r()).map(Root::from_ref)) + .filter_map(|c| c.downcast::<HTMLHeadElement>().map(Root::from_ref)) .next() }) } @@ -1475,7 +1472,7 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-body fn GetBody(&self) -> Option<Root<HTMLElement>> { self.get_html_element().and_then(|root| { - let node = NodeCast::from_ref(root.r()); + let node = root.upcast::<Node>(); node.children().find(|child| { match child.r().type_id() { NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLBodyElement)) | @@ -1483,7 +1480,7 @@ impl DocumentMethods for Document { _ => false } }).map(|node| { - Root::from_ref(HTMLElementCast::to_ref(node.r()).unwrap()) + Root::from_ref(node.downcast::<HTMLElement>().unwrap()) }) }) } @@ -1496,7 +1493,7 @@ impl DocumentMethods for Document { None => return Err(Error::HierarchyRequest), }; - let node = NodeCast::from_ref(new_body); + let node = new_body.upcast::<Node>(); match node.type_id() { NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLBodyElement)) | NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLFrameSetElement)) => {} @@ -1512,9 +1509,9 @@ impl DocumentMethods for Document { match (self.get_html_element(), &old_body) { // Step 3. (Some(ref root), &Some(ref child)) => { - let root = NodeCast::from_ref(root.r()); - let child = NodeCast::from_ref(child.r()); - let new_body = NodeCast::from_ref(new_body); + let root = root.upcast::<Node>(); + let child = child.upcast::<Node>(); + let new_body = new_body.upcast::<Node>(); assert!(root.ReplaceChild(new_body, child).is_ok()) }, @@ -1523,8 +1520,8 @@ impl DocumentMethods for Document { // Step 5. (Some(ref root), &None) => { - let root = NodeCast::from_ref(root.r()); - let new_body = NodeCast::from_ref(new_body); + let root = root.upcast::<Node>(); + let new_body = new_body.upcast::<Node>(); assert!(root.AppendChild(new_body).is_ok()); } } @@ -1534,7 +1531,7 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-getelementsbyname fn GetElementsByName(&self, name: DOMString) -> Root<NodeList> { self.create_node_list(|node| { - let element = match ElementCast::to_ref(node) { + let element = match node.downcast::<Element>() { Some(element) => element, None => return false, }; @@ -1550,7 +1547,7 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-images fn Images(&self) -> Root<HTMLCollection> { self.images.or_init(|| { - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); let filter = box ImagesFilter; HTMLCollection::create(&self.window, root, filter) }) @@ -1559,7 +1556,7 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-embeds fn Embeds(&self) -> Root<HTMLCollection> { self.embeds.or_init(|| { - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); let filter = box EmbedsFilter; HTMLCollection::create(&self.window, root, filter) }) @@ -1573,7 +1570,7 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-links fn Links(&self) -> Root<HTMLCollection> { self.links.or_init(|| { - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); let filter = box LinksFilter; HTMLCollection::create(&self.window, root, filter) }) @@ -1582,7 +1579,7 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-forms fn Forms(&self) -> Root<HTMLCollection> { self.forms.or_init(|| { - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); let filter = box FormsFilter; HTMLCollection::create(&self.window, root, filter) }) @@ -1591,7 +1588,7 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-scripts fn Scripts(&self) -> Root<HTMLCollection> { self.scripts.or_init(|| { - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); let filter = box ScriptsFilter; HTMLCollection::create(&self.window, root, filter) }) @@ -1600,7 +1597,7 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-anchors fn Anchors(&self) -> Root<HTMLCollection> { self.anchors.or_init(|| { - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); let filter = box AnchorsFilter; HTMLCollection::create(&self.window, root, filter) }) @@ -1610,7 +1607,7 @@ impl DocumentMethods for Document { fn Applets(&self) -> Root<HTMLCollection> { // FIXME: This should be return OBJECT elements containing applets. self.applets.or_init(|| { - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); let filter = box AppletsFilter; HTMLCollection::create(&self.window, root, filter) }) @@ -1623,43 +1620,43 @@ impl DocumentMethods for Document { // https://dom.spec.whatwg.org/#dom-parentnode-children fn Children(&self) -> Root<HTMLCollection> { - HTMLCollection::children(&self.window, NodeCast::from_ref(self)) + HTMLCollection::children(&self.window, self.upcast::<Node>()) } // https://dom.spec.whatwg.org/#dom-parentnode-firstelementchild fn GetFirstElementChild(&self) -> Option<Root<Element>> { - NodeCast::from_ref(self).child_elements().next() + self.upcast::<Node>().child_elements().next() } // https://dom.spec.whatwg.org/#dom-parentnode-lastelementchild fn GetLastElementChild(&self) -> Option<Root<Element>> { - NodeCast::from_ref(self).rev_children().filter_map(ElementCast::to_root).next() + self.upcast::<Node>().rev_children().filter_map(Root::downcast::<Element>).next() } // https://dom.spec.whatwg.org/#dom-parentnode-childelementcount fn ChildElementCount(&self) -> u32 { - NodeCast::from_ref(self).child_elements().count() as u32 + self.upcast::<Node>().child_elements().count() as u32 } // https://dom.spec.whatwg.org/#dom-parentnode-prepend fn Prepend(&self, nodes: Vec<NodeOrString>) -> ErrorResult { - NodeCast::from_ref(self).prepend(nodes) + self.upcast::<Node>().prepend(nodes) } // https://dom.spec.whatwg.org/#dom-parentnode-append fn Append(&self, nodes: Vec<NodeOrString>) -> ErrorResult { - NodeCast::from_ref(self).append(nodes) + self.upcast::<Node>().append(nodes) } // https://dom.spec.whatwg.org/#dom-parentnode-queryselector fn QuerySelector(&self, selectors: DOMString) -> Fallible<Option<Root<Element>>> { - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); root.query_selector(selectors) } // https://dom.spec.whatwg.org/#dom-parentnode-queryselectorall fn QuerySelectorAll(&self, selectors: DOMString) -> Fallible<Root<NodeList>> { - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); root.query_selector_all(selectors) } @@ -1716,7 +1713,7 @@ impl DocumentMethods for Document { } impl CollectionFilter for NamedElementFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { - filter_by_name(&self.name, NodeCast::from_ref(elem)) + filter_by_name(&self.name, elem.upcast::<Node>()) } } // https://html.spec.whatwg.org/multipage/#dom-document-nameditem-filter @@ -1725,7 +1722,7 @@ impl DocumentMethods for Document { NodeTypeId::Element(ElementTypeId::HTMLElement(type_)) => type_, _ => return false, }; - let elem = match ElementCast::to_ref(node) { + let elem = match node.downcast::<Element>() { Some(elem) => elem, None => return false, }; @@ -1767,7 +1764,7 @@ impl DocumentMethods for Document { } } let name = Atom::from_slice(&name); - let root = NodeCast::from_ref(self); + let root = self.upcast::<Node>(); { // Step 1. let mut elements = root.traverse_preorder().filter(|node| { @@ -1849,7 +1846,7 @@ impl DocumentProgressHandler { let event = Event::new(GlobalRef::Window(window), "DOMContentLoaded".to_owned(), EventBubbles::DoesNotBubble, EventCancelable::NotCancelable); - let doctarget = EventTargetCast::from_ref(document.r()); + let doctarget = document.upcast::<EventTarget>(); let _ = doctarget.DispatchEvent(event.r()); window.reflow(ReflowGoal::ForDisplay, @@ -1868,8 +1865,8 @@ impl DocumentProgressHandler { let event = Event::new(GlobalRef::Window(window), "load".to_owned(), EventBubbles::DoesNotBubble, EventCancelable::NotCancelable); - let wintarget = EventTargetCast::from_ref(window); - let doctarget = EventTargetCast::from_ref(document.r()); + let wintarget = window.upcast::<EventTarget>(); + let doctarget = document.upcast::<EventTarget>(); event.r().set_trusted(true); let _ = wintarget.dispatch_event_with_target(doctarget, event.r()); @@ -1881,7 +1878,7 @@ impl DocumentProgressHandler { let event = Event::new(GlobalRef::Window(frame_window.r()), "load".to_owned(), EventBubbles::DoesNotBubble, EventCancelable::NotCancelable); - let target = EventTargetCast::from_ref(frame_element); + let target = frame_element.upcast::<EventTarget>(); event.r().fire(target); }; |