Skip to content

Commit

Permalink
implement Document#createAttribute
Browse files Browse the repository at this point in the history
  • Loading branch information
ajnirp committed Nov 23, 2014
1 parent b4c3aec commit 4b754bd
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 66 deletions.
32 changes: 20 additions & 12 deletions components/script/dom/attr.rs
Expand Up @@ -82,7 +82,7 @@ pub struct Attr {
prefix: Option<DOMString>,

/// the element that owns this attribute.
owner: JS<Element>,
owner: Option<JS<Element>>,
}

impl Reflectable for Attr {
Expand All @@ -94,21 +94,21 @@ impl Reflectable for Attr {
impl Attr {
fn new_inherited(local_name: Atom, value: AttrValue,
name: Atom, namespace: Namespace,
prefix: Option<DOMString>, owner: JSRef<Element>) -> Attr {
prefix: Option<DOMString>, owner: Option<JSRef<Element>>) -> Attr {
Attr {
reflector_: Reflector::new(),
local_name: local_name,
value: DOMRefCell::new(value),
name: name,
namespace: namespace,
prefix: prefix,
owner: JS::from_rooted(owner),
owner: owner.map(|o| JS::from_rooted(o)),
}
}

pub fn new(window: JSRef<Window>, local_name: Atom, value: AttrValue,
name: Atom, namespace: Namespace,
prefix: Option<DOMString>, owner: JSRef<Element>) -> Temporary<Attr> {
prefix: Option<DOMString>, owner: Option<JSRef<Element>>) -> Temporary<Attr> {
reflect_dom_object(box Attr::new_inherited(local_name, value, name, namespace, prefix, owner),
&global::Window(window), AttrBinding::Wrap)
}
Expand Down Expand Up @@ -139,9 +139,16 @@ impl<'a> AttrMethods for JSRef<'a, Attr> {
}

fn SetValue(self, value: DOMString) {
let owner = self.owner.root();
let value = owner.parse_attribute(&self.namespace, self.local_name(), value);
self.set_value(ReplacedAttr, value);
match self.owner {
None => {
*self.value.borrow_mut() = StringAttrValue(value)
}
Some(o) => {
let owner = o.root();
let value = owner.parse_attribute(&self.namespace, self.local_name(), value);
self.set_value(ReplacedAttr, value, *owner);
}
}
}

fn TextContent(self) -> DOMString {
Expand Down Expand Up @@ -177,7 +184,7 @@ impl<'a> AttrMethods for JSRef<'a, Attr> {
}

fn GetOwnerElement(self) -> Option<Temporary<Element>> {
Some(Temporary::new(self.owner))
self.owner.map(|o| Temporary::new(o))
}

fn Specified(self) -> bool {
Expand All @@ -186,16 +193,17 @@ impl<'a> AttrMethods for JSRef<'a, Attr> {
}

pub trait AttrHelpers<'a> {
fn set_value(self, set_type: AttrSettingType, value: AttrValue);
fn set_value(self, set_type: AttrSettingType, value: AttrValue, owner: JSRef<Element>);
fn value(self) -> Ref<'a, AttrValue>;
fn local_name(self) -> &'a Atom;
fn summarize(self) -> AttrInfo;
}

impl<'a> AttrHelpers<'a> for JSRef<'a, Attr> {
fn set_value(self, set_type: AttrSettingType, value: AttrValue) {
let owner = self.owner.root();
let node: JSRef<Node> = NodeCast::from_ref(*owner);
fn set_value(self, set_type: AttrSettingType, value: AttrValue, owner: JSRef<Element>) {
assert!(Some(owner) == self.owner.map(|o| *o.root()));

let node: JSRef<Node> = NodeCast::from_ref(owner);
let namespace_is_null = self.namespace == ns!("");

match set_type {
Expand Down
18 changes: 17 additions & 1 deletion components/script/dom/document.rs
Expand Up @@ -2,7 +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::AttrHelpers;
use dom::attr::{Attr, AttrHelpers, StringAttrValue};
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::DocumentBinding;
use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState};
Expand Down Expand Up @@ -622,6 +622,22 @@ impl<'a> DocumentMethods for JSRef<'a, Document> {
ScriptCreated))
}

// http://dom.spec.whatwg.org/#dom-document-createattribute
fn CreateAttribute(self, local_name: DOMString) -> Fallible<Temporary<Attr>> {
if xml_name_type(local_name.as_slice()) == InvalidXMLName {
debug!("Not a valid element name");
return Err(InvalidCharacter);
}

let window = self.window.root();
let name = Atom::from_slice(local_name.as_slice());
// repetition used because string_cache::atom::Atom is non-copyable
let l_name = Atom::from_slice(local_name.as_slice());
let value = StringAttrValue("".to_string());

Ok(Attr::new(*window, name, value, l_name, ns!(""), None, None))
}

// http://dom.spec.whatwg.org/#dom-document-createdocumentfragment
fn CreateDocumentFragment(self) -> Temporary<DocumentFragment> {
DocumentFragment::new(self)
Expand Down
4 changes: 2 additions & 2 deletions components/script/dom/element.rs
Expand Up @@ -509,13 +509,13 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
None => {
let window = window_from_node(self).root();
let attr = Attr::new(*window, local_name, value.clone(),
name, namespace.clone(), prefix, self);
name, namespace.clone(), prefix, Some(self));
self.attrs.borrow_mut().push_unrooted(&attr);
(self.attrs.borrow().len() - 1, FirstSetAttr)
}
};

(*self.attrs.borrow())[idx].root().set_value(set_type, value);
(*self.attrs.borrow())[idx].root().set_value(set_type, value, self);
}

fn parse_attribute(self, namespace: &Namespace, local_name: &Atom,
Expand Down
2 changes: 1 addition & 1 deletion components/script/dom/node.rs
Expand Up @@ -1558,7 +1558,7 @@ impl Node {
&Attr::new(*window,
attr.local_name().clone(), attr.value().clone(),
attr.name().clone(), attr.namespace().clone(),
attr.prefix().clone(), copy_elem));
attr.prefix().clone(), Some(copy_elem)));
}
},
_ => ()
Expand Down
3 changes: 3 additions & 0 deletions components/script/dom/webidls/Document.webidl
Expand Up @@ -35,6 +35,9 @@ interface Document : Node {
[Throws]
ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);

[Throws]
Attr createAttribute(DOMString localName);

[Throws]
Node importNode(Node node, optional boolean deep = false);
[Throws]
Expand Down
9 changes: 0 additions & 9 deletions tests/wpt/metadata/dom/interfaces.html.ini
Expand Up @@ -126,9 +126,6 @@
[Document interface: operation importNode(Node,boolean)]
expected: FAIL
[Document interface: operation createAttribute(DOMString)]
expected: FAIL
[Document interface: operation createAttributeNS(DOMString,DOMString)]
expected: FAIL
Expand Down Expand Up @@ -180,12 +177,6 @@
[Document interface: xmlDoc must inherit property "origin" with the proper type (3)]
expected: FAIL
[Document interface: xmlDoc must inherit property "createAttribute" with the proper type (20)]
expected: FAIL
[Document interface: calling createAttribute(DOMString) on xmlDoc with too few arguments must throw TypeError]
expected: FAIL
[Document interface: xmlDoc must inherit property "createAttributeNS" with the proper type (21)]
expected: FAIL
Expand Down
35 changes: 0 additions & 35 deletions tests/wpt/metadata/dom/nodes/Document-createAttribute.html.ini

This file was deleted.

6 changes: 0 additions & 6 deletions tests/wpt/metadata/html/dom/interfaces.html.ini
Expand Up @@ -1053,12 +1053,6 @@
[Document interface: document.implementation.createDocument(null, "", null) must inherit property "origin" with the proper type (3)]
expected: FAIL

[Document interface: document.implementation.createDocument(null, "", null) must inherit property "createAttribute" with the proper type (20)]
expected: FAIL

[Document interface: calling createAttribute(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError]
expected: FAIL

[Document interface: document.implementation.createDocument(null, "", null) must inherit property "createAttributeNS" with the proper type (21)]
expected: FAIL

Expand Down

5 comments on commit 4b754bd

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from Manishearth
at ajnirp@4b754bd

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging wenderen/servo/document-create-attribute = 4b754bd into auto

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wenderen/servo/document-create-attribute = 4b754bd merged ok, testing candidate = d215ff7

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding master to auto = d215ff7

Please sign in to comment.