diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2015-09-12 17:17:22 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2015-09-13 23:40:24 +0200 |
commit | 650afc9d3e0d351df493e11831b1c072f79e8889 (patch) | |
tree | 5331507cce86913a1f77d331a45e515ae85ca58d | |
parent | d5ee58caf269779e86b2efc50ddf37d3e4eba9b9 (diff) | |
download | servo-650afc9d3e0d351df493e11831b1c072f79e8889.tar.gz servo-650afc9d3e0d351df493e11831b1c072f79e8889.zip |
Fix cloning of Element's attributes
No virtual method was invoked when copies of attributes were appended to
newly-cloned elements.
-rw-r--r-- | components/script/dom/element.rs | 6 | ||||
-rw-r--r-- | components/script/dom/node.rs | 15 | ||||
-rw-r--r-- | tests/wpt/metadata/dom/nodes/Element-matches.html.ini | 12 | ||||
-rw-r--r-- | tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All.html.ini | 33 |
4 files changed, 10 insertions, 56 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index bd522dccf0a..87804d373fd 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -83,7 +83,7 @@ use url::UrlParser; use std::ascii::AsciiExt; use std::borrow::{Cow, ToOwned}; -use std::cell::{Ref, RefMut}; +use std::cell::Ref; use std::default::Default; use std::mem; use std::sync::Arc; @@ -597,10 +597,6 @@ impl Element { self.attrs.borrow() } - pub fn attrs_mut(&self) -> RefMut<Vec<JS<Attr>>> { - self.attrs.borrow_mut() - } - pub fn style_attribute(&self) -> &DOMRefCell<Option<PropertyDeclarationBlock>> { &self.style_attribute } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index ae725d3d856..c9e78200c99 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1768,15 +1768,12 @@ impl Node { let node_elem = ElementCast::to_ref(node).unwrap(); let copy_elem = ElementCast::to_ref(copy.r()).unwrap(); - let window = document.r().window(); - for ref attr in &*node_elem.attrs() { - let attr = attr.root(); - let newattr = - Attr::new(window.r(), - attr.r().local_name().clone(), attr.r().value().clone(), - attr.r().name().clone(), attr.r().namespace().clone(), - attr.r().prefix().clone(), Some(copy_elem)); - copy_elem.attrs_mut().push(JS::from_rooted(&newattr)); + for attr in node_elem.attrs().iter().map(JS::root) { + copy_elem.push_new_attribute(attr.local_name().clone(), + attr.value().clone(), + attr.name().clone(), + attr.namespace().clone(), + attr.prefix().clone()); } }, _ => () diff --git a/tests/wpt/metadata/dom/nodes/Element-matches.html.ini b/tests/wpt/metadata/dom/nodes/Element-matches.html.ini index cf9f112738c..657462fd41c 100644 --- a/tests/wpt/metadata/dom/nodes/Element-matches.html.ini +++ b/tests/wpt/metadata/dom/nodes/Element-matches.html.ini @@ -27,12 +27,6 @@ [Detached Element.matches: :lang pseudo-class selector, matching specified language with partial value (with no refNodes): #pseudo-lang-div3:lang(en)] expected: FAIL - [Detached Element.matches: :enabled pseudo-class selector, matching all disabled form controls (with no refNodes): #pseudo-ui :disabled] - expected: FAIL - - [Detached Element.matches: :checked pseudo-class selector, matching checked radio buttons and checkboxes (with no refNodes): #pseudo-ui :checked] - expected: FAIL - [Fragment Element.matches: Attribute hyphen-separated list selector, matching lang attribute with partial value (with no refNodes): #attr-hyphen-div3[lang|="en"\]] expected: FAIL @@ -42,12 +36,6 @@ [Fragment Element.matches: :lang pseudo-class selector, matching specified language with partial value (with no refNodes): #pseudo-lang-div3:lang(en)] expected: FAIL - [Fragment Element.matches: :enabled pseudo-class selector, matching all disabled form controls (with no refNodes): #pseudo-ui :disabled] - expected: FAIL - - [Fragment Element.matches: :checked pseudo-class selector, matching checked radio buttons and checkboxes (with no refNodes): #pseudo-ui :checked] - expected: FAIL - [In-document Element.matches: Universal selector, matching all children of the specified reference element (with refNode Element): >*] expected: FAIL diff --git a/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All.html.ini b/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All.html.ini index a99874300b0..8a083c760ac 100644 --- a/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All.html.ini +++ b/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All.html.ini @@ -120,21 +120,6 @@ [Detached Element.querySelector: :lang pseudo-class selector, not matching incorrect language: #pseudo-lang-div4:lang(es-AR)] expected: FAIL - [Detached Element.querySelectorAll: :enabled pseudo-class selector, matching all enabled form controls: #pseudo-ui :enabled] - expected: FAIL - - [Detached Element.querySelectorAll: :enabled pseudo-class selector, matching all disabled form controls: #pseudo-ui :disabled] - expected: FAIL - - [Detached Element.querySelector: :enabled pseudo-class selector, matching all disabled form controls: #pseudo-ui :disabled] - expected: FAIL - - [Detached Element.querySelectorAll: :checked pseudo-class selector, matching checked radio buttons and checkboxes: #pseudo-ui :checked] - expected: FAIL - - [Detached Element.querySelector: :checked pseudo-class selector, matching checked radio buttons and checkboxes: #pseudo-ui :checked] - expected: FAIL - [Detached Element.querySelectorAll: :first-line pseudo-element (one-colon syntax) selector, not matching any elements: #pseudo-element:first-line] expected: FAIL @@ -201,21 +186,6 @@ [Fragment.querySelector: :lang pseudo-class selector, not matching incorrect language: #pseudo-lang-div4:lang(es-AR)] expected: FAIL - [Fragment.querySelectorAll: :enabled pseudo-class selector, matching all enabled form controls: #pseudo-ui :enabled] - expected: FAIL - - [Fragment.querySelectorAll: :enabled pseudo-class selector, matching all disabled form controls: #pseudo-ui :disabled] - expected: FAIL - - [Fragment.querySelector: :enabled pseudo-class selector, matching all disabled form controls: #pseudo-ui :disabled] - expected: FAIL - - [Fragment.querySelectorAll: :checked pseudo-class selector, matching checked radio buttons and checkboxes: #pseudo-ui :checked] - expected: FAIL - - [Fragment.querySelector: :checked pseudo-class selector, matching checked radio buttons and checkboxes: #pseudo-ui :checked] - expected: FAIL - [Fragment.querySelectorAll: :first-line pseudo-element (one-colon syntax) selector, not matching any elements: #pseudo-element:first-line] expected: FAIL @@ -759,3 +729,6 @@ [In-document Element.querySelectorAll: Syntax, group of selectors separator, no whitespace: #group em,#group strong] expected: FAIL + [In-document Element.querySelectorAll: :enabled pseudo-class selector, matching all disabled form controls: #pseudo-ui :disabled] + expected: FAIL + |