diff options
author | Achal Shah <achals@gmail.com> | 2014-11-23 02:03:45 -0800 |
---|---|---|
committer | Achal Shah <achals@gmail.com> | 2014-11-23 23:37:13 -0800 |
commit | 23ed1f705bb278e213928db59e9151484d24f4d9 (patch) | |
tree | a1b63dba4f6aec30a7c7e13e7145eb966888899c /components/script/dom | |
parent | 90007ee781e53f65344a24a0bdbeb86d5c0fe065 (diff) | |
download | servo-23ed1f705bb278e213928db59e9151484d24f4d9.tar.gz servo-23ed1f705bb278e213928db59e9151484d24f4d9.zip |
Implement HTML{Anchor,Area,Link}Element.relList.
https://github.com/servo/servo/issues/3994
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/htmlanchorelement.rs | 28 | ||||
-rw-r--r-- | components/script/dom/htmlareaelement.rs | 43 | ||||
-rw-r--r-- | components/script/dom/htmllinkelement.rs | 28 | ||||
-rw-r--r-- | components/script/dom/virtualmethods.rs | 7 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLAnchorElement.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLAreaElement.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLLinkElement.webidl | 2 |
7 files changed, 99 insertions, 13 deletions
diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index 72c5d2fe7ae..2b1d615a4bf 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::HTMLAnchorElementBinding; @@ -9,9 +10,10 @@ use dom::bindings::codegen::Bindings::HTMLAnchorElementBinding::HTMLAnchorElemen use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::InheritTypes::HTMLAnchorElementDerived; use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, NodeCast}; -use dom::bindings::js::{JSRef, Temporary, OptionalRootable}; +use dom::bindings::js::{MutNullableJS, JSRef, Temporary, OptionalRootable}; use dom::bindings::utils::{Reflectable, Reflector}; use dom::document::{Document, DocumentHelpers}; +use dom::domtokenlist::DOMTokenList; use dom::element::{Element, AttributeHandlers, HTMLAnchorElementTypeId}; use dom::event::Event; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; @@ -19,11 +21,14 @@ use dom::htmlelement::HTMLElement; use dom::node::{Node, NodeHelpers, ElementNodeTypeId}; use dom::virtualmethods::VirtualMethods; +use std::default::Default; +use string_cache::Atom; use servo_util::str::DOMString; #[dom_struct] pub struct HTMLAnchorElement { - htmlelement: HTMLElement + htmlelement: HTMLElement, + rel_list: MutNullableJS<DOMTokenList>, } impl HTMLAnchorElementDerived for EventTarget { @@ -35,7 +40,8 @@ impl HTMLAnchorElementDerived for EventTarget { impl HTMLAnchorElement { fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: JSRef<Document>) -> HTMLAnchorElement { HTMLAnchorElement { - htmlelement: HTMLElement::new_inherited(HTMLAnchorElementTypeId, localName, prefix, document) + htmlelement: HTMLElement::new_inherited(HTMLAnchorElementTypeId, localName, prefix, document), + rel_list: Default::default(), } } @@ -84,6 +90,13 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLAnchorElement> { } self.handle_event_impl(event); } + + fn parse_plain_attribute(&self, name: &Atom, value: DOMString) -> AttrValue { + match name { + &atom!("rel") => AttrValue::from_tokenlist(value), + _ => self.super_type().unwrap().parse_plain_attribute(name, value), + } + } } impl Reflectable for HTMLAnchorElement { @@ -102,4 +115,13 @@ impl<'a> HTMLAnchorElementMethods for JSRef<'a, HTMLAnchorElement> { let node: JSRef<Node> = NodeCast::from_ref(self); node.SetTextContent(Some(value)) } + + fn RelList(self) -> Temporary<DOMTokenList> { + if self.rel_list.get().is_none() { + let element: JSRef<Element> = ElementCast::from_ref(self); + let rel_list = DOMTokenList::new(element, &atom!("rel")); + self.rel_list.assign(Some(rel_list)); + } + self.rel_list.get().unwrap() + } } diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs index c4272fde753..ffc2eb2b23a 100644 --- a/components/script/dom/htmlareaelement.rs +++ b/components/script/dom/htmlareaelement.rs @@ -2,23 +2,32 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use dom::attr::AttrValue; use dom::bindings::codegen::Bindings::HTMLAreaElementBinding; -use dom::bindings::codegen::InheritTypes::HTMLAreaElementDerived; -use dom::bindings::js::{JSRef, Temporary}; +use dom::bindings::codegen::Bindings::HTMLAreaElementBinding::HTMLAreaElementMethods; +use dom::bindings::codegen::InheritTypes::{HTMLAreaElementDerived, HTMLElementCast}; +use dom::bindings::codegen::InheritTypes::ElementCast; +use dom::bindings::js::{MutNullableJS, JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector}; use dom::document::Document; +use dom::domtokenlist::DOMTokenList; +use dom::element::Element; use dom::element::HTMLAreaElementTypeId; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlelement::HTMLElement; use dom::node::{Node, NodeHelpers, ElementNodeTypeId}; +use dom::virtualmethods::VirtualMethods; +use std::default::Default; +use string_cache::Atom; use servo_util::str::DOMString; #[jstraceable] #[must_root] #[privatize] pub struct HTMLAreaElement { - htmlelement: HTMLElement + htmlelement: HTMLElement, + rel_list: MutNullableJS<DOMTokenList>, } impl HTMLAreaElementDerived for EventTarget { @@ -30,7 +39,8 @@ impl HTMLAreaElementDerived for EventTarget { impl HTMLAreaElement { fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: JSRef<Document>) -> HTMLAreaElement { HTMLAreaElement { - htmlelement: HTMLElement::new_inherited(HTMLAreaElementTypeId, localName, prefix, document) + htmlelement: HTMLElement::new_inherited(HTMLAreaElementTypeId, localName, prefix, document), + rel_list: Default::default(), } } @@ -41,8 +51,33 @@ impl HTMLAreaElement { } } +impl<'a> VirtualMethods for JSRef<'a, HTMLAreaElement> { + fn super_type<'a>(&'a self) -> Option<&'a VirtualMethods> { + let htmlelement: &JSRef<HTMLElement> = HTMLElementCast::from_borrowed_ref(self); + Some(htmlelement as &VirtualMethods) + } + + fn parse_plain_attribute(&self, name: &Atom, value: DOMString) -> AttrValue { + match name { + &atom!("rel") => AttrValue::from_tokenlist(value), + _ => self.super_type().unwrap().parse_plain_attribute(name, value), + } + } +} + impl Reflectable for HTMLAreaElement { fn reflector<'a>(&'a self) -> &'a Reflector { self.htmlelement.reflector() } } + +impl<'a> HTMLAreaElementMethods for JSRef<'a, HTMLAreaElement> { + fn RelList(self) -> Temporary<DOMTokenList> { + if self.rel_list.get().is_none() { + let element: JSRef<Element> = ElementCast::from_ref(self); + let rel_list = DOMTokenList::new(element, &atom!("rel")); + self.rel_list.assign(Some(rel_list)); + } + self.rel_list.get().unwrap() + } +} diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index 503a2cd14fd..acec40b942c 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -2,14 +2,16 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::attr::Attr; +use dom::attr::{Attr, AttrValue}; use dom::attr::AttrHelpers; use dom::bindings::codegen::Bindings::HTMLLinkElementBinding; +use dom::bindings::codegen::Bindings::HTMLLinkElementBinding::HTMLLinkElementMethods; use dom::bindings::codegen::InheritTypes::HTMLLinkElementDerived; use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast}; -use dom::bindings::js::{JSRef, Temporary, OptionalRootable}; +use dom::bindings::js::{MutNullableJS, JSRef, Temporary, OptionalRootable}; use dom::bindings::utils::{Reflectable, Reflector}; use dom::document::Document; +use dom::domtokenlist::DOMTokenList; use dom::element::{AttributeHandlers, Element, HTMLLinkElementTypeId}; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlelement::HTMLElement; @@ -19,12 +21,14 @@ use layout_interface::{LayoutChan, LoadStylesheetMsg}; use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS}; use std::ascii::AsciiExt; +use std::default::Default; use url::UrlParser; use string_cache::Atom; #[dom_struct] pub struct HTMLLinkElement { htmlelement: HTMLElement, + rel_list: MutNullableJS<DOMTokenList>, } impl HTMLLinkElementDerived for EventTarget { @@ -36,7 +40,8 @@ impl HTMLLinkElementDerived for EventTarget { impl HTMLLinkElement { fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: JSRef<Document>) -> HTMLLinkElement { HTMLLinkElement { - htmlelement: HTMLElement::new_inherited(HTMLLinkElementTypeId, localName, prefix, document) + htmlelement: HTMLElement::new_inherited(HTMLLinkElementTypeId, localName, prefix, document), + rel_list: Default::default(), } } @@ -87,6 +92,13 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLLinkElement> { } } + fn parse_plain_attribute(&self, name: &Atom, value: DOMString) -> AttrValue { + match name { + &atom!("rel") => AttrValue::from_tokenlist(value), + _ => self.super_type().unwrap().parse_plain_attribute(name, value), + } + } + fn bind_to_tree(&self, tree_in_doc: bool) { match self.super_type() { Some(ref s) => s.bind_to_tree(tree_in_doc), @@ -132,3 +144,13 @@ impl Reflectable for HTMLLinkElement { } } +impl<'a> HTMLLinkElementMethods for JSRef<'a, HTMLLinkElement> { + fn RelList(self) -> Temporary<DOMTokenList> { + if self.rel_list.get().is_none() { + let element: JSRef<Element> = ElementCast::from_ref(self); + let rel_list = DOMTokenList::new(element, &atom!("rel")); + self.rel_list.assign(Some(rel_list)); + } + self.rel_list.get().unwrap() + } +} diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index 03c4b27c737..66378463a82 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -6,6 +6,7 @@ use dom::attr::Attr; use dom::attr::{AttrValue, StringAttrValue}; use dom::bindings::codegen::InheritTypes::ElementCast; use dom::bindings::codegen::InheritTypes::HTMLAnchorElementCast; +use dom::bindings::codegen::InheritTypes::HTMLAreaElementCast; use dom::bindings::codegen::InheritTypes::HTMLBodyElementCast; use dom::bindings::codegen::InheritTypes::HTMLButtonElementCast; use dom::bindings::codegen::InheritTypes::HTMLCanvasElementCast; @@ -28,6 +29,7 @@ use dom::document::Document; use dom::element::Element; use dom::element::ElementTypeId_; use dom::element::HTMLAnchorElementTypeId; +use dom::element::HTMLAreaElementTypeId; use dom::element::HTMLBodyElementTypeId; use dom::element::HTMLButtonElementTypeId; use dom::element::HTMLCanvasElementTypeId; @@ -47,6 +49,7 @@ use dom::element::HTMLTableHeaderCellElementTypeId; use dom::element::HTMLTextAreaElementTypeId; use dom::event::Event; use dom::htmlanchorelement::HTMLAnchorElement; +use dom::htmlareaelement::HTMLAreaElement; use dom::htmlbodyelement::HTMLBodyElement; use dom::htmlbuttonelement::HTMLButtonElement; use dom::htmlcanvaselement::HTMLCanvasElement; @@ -160,6 +163,10 @@ pub fn vtable_for<'a>(node: &'a JSRef<'a, Node>) -> &'a VirtualMethods + 'a { let element: &'a JSRef<'a, HTMLAnchorElement> = HTMLAnchorElementCast::to_borrowed_ref(node).unwrap(); element as &'a VirtualMethods + 'a } + ElementNodeTypeId(HTMLAreaElementTypeId) => { + let element: &'a JSRef<'a, HTMLAreaElement> = HTMLAreaElementCast::to_borrowed_ref(node).unwrap(); + element as &'a VirtualMethods + 'a + } ElementNodeTypeId(HTMLBodyElementTypeId) => { let element: &'a JSRef<'a, HTMLBodyElement> = HTMLBodyElementCast::to_borrowed_ref(node).unwrap(); element as &'a VirtualMethods + 'a diff --git a/components/script/dom/webidls/HTMLAnchorElement.webidl b/components/script/dom/webidls/HTMLAnchorElement.webidl index de80a803514..d5a120ce822 100644 --- a/components/script/dom/webidls/HTMLAnchorElement.webidl +++ b/components/script/dom/webidls/HTMLAnchorElement.webidl @@ -17,7 +17,7 @@ interface HTMLAnchorElement : HTMLElement { // attribute DOMString download; //[PutForwards=value] attribute DOMSettableTokenList ping; // attribute DOMString rel; - //readonly attribute DOMTokenList relList; + readonly attribute DOMTokenList relList; // attribute DOMString hreflang; // attribute DOMString type; diff --git a/components/script/dom/webidls/HTMLAreaElement.webidl b/components/script/dom/webidls/HTMLAreaElement.webidl index 0cbbe2d7ce1..9184b76dfdf 100644 --- a/components/script/dom/webidls/HTMLAreaElement.webidl +++ b/components/script/dom/webidls/HTMLAreaElement.webidl @@ -12,7 +12,7 @@ interface HTMLAreaElement : HTMLElement { // attribute DOMString download; //[PutForwards=value] attribute DOMSettableTokenList ping; // attribute DOMString rel; - //readonly attribute DOMTokenList relList; + readonly attribute DOMTokenList relList; // attribute DOMString hreflang; // attribute DOMString type; diff --git a/components/script/dom/webidls/HTMLLinkElement.webidl b/components/script/dom/webidls/HTMLLinkElement.webidl index 3757bada2b3..cb28fd76b18 100644 --- a/components/script/dom/webidls/HTMLLinkElement.webidl +++ b/components/script/dom/webidls/HTMLLinkElement.webidl @@ -8,7 +8,7 @@ interface HTMLLinkElement : HTMLElement { // attribute DOMString href; // attribute DOMString crossOrigin; // attribute DOMString rel; - //readonly attribute DOMTokenList relList; + readonly attribute DOMTokenList relList; // attribute DOMString media; // attribute DOMString hreflang; // attribute DOMString type; |