Skip to content

Commit

Permalink
Add Element::InsertAdjacentHTML
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeGomez committed Jun 8, 2016
1 parent 40feb52 commit 8c57208
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 117 deletions.
35 changes: 35 additions & 0 deletions components/script/dom/element.rs
Expand Up @@ -2029,6 +2029,41 @@ impl ElementMethods for Element {
let where_ = try!(AdjacentPosition::parse(&*where_));
self.insert_adjacent(where_, text.upcast()).map(|_| ())
}

// https://w3c.github.io/DOM-Parsing/#dom-element-insertadjacenthtml
fn InsertAdjacentHTML(&self, position: DOMString, text: DOMString)
-> ErrorResult {
// Step 1.
let position = try!(AdjacentPosition::parse(&*position));

let context = match position {
AdjacentPosition::BeforeBegin | AdjacentPosition::AfterEnd => {
match self.upcast::<Node>().GetParentNode() {
Some(ref node) if node.is::<Document>() => {
return Err(Error::NoModificationAllowed)
}
None => return Err(Error::NoModificationAllowed),
Some(node) => node,
}
}
AdjacentPosition::AfterBegin | AdjacentPosition::BeforeEnd => {
Root::from_ref(self.upcast::<Node>())
}
};

// Step 2.
let context = match context.downcast::<Element>() {
Some(elem) if elem.local_name() != &atom!("html") ||
!elem.html_element_in_html_document() => Root::from_ref(elem),
_ => Root::upcast(HTMLBodyElement::new(atom!("body"), None, &*context.owner_doc()))
};

// Step 3.
let fragment = try!(context.upcast::<Node>().parse_fragment(text));

// Step 4.
context.insert_adjacent(position, fragment.upcast()).map(|_| ())
}
}

pub fn fragment_affecting_attributes() -> [Atom; 3] {
Expand Down
2 changes: 2 additions & 0 deletions components/script/dom/webidls/Element.webidl
Expand Up @@ -75,6 +75,8 @@ interface Element : Node {
Element? insertAdjacentElement(DOMString where_, Element element); // historical
[Throws]
void insertAdjacentText(DOMString where_, DOMString data);
[Throws]
void insertAdjacentHTML(DOMString position, DOMString html);
};

// http://dev.w3.org/csswg/cssom-view/#extensions-to-the-element-interface
Expand Down
6 changes: 0 additions & 6 deletions tests/wpt/metadata/domparsing/insert-adjacent.html.ini
Expand Up @@ -3,12 +3,6 @@
[insertAdjacentHTML(beforebegin, <h3>beforebegin</h3> )]
expected: FAIL

[insertAdjacentHTML(afterbegin, <h3>afterbegin</h3> )]
expected: FAIL

[insertAdjacentHTML(beforeend, <h3>beforeend</h3> )]
expected: FAIL

[insertAdjacentHTML(afterend, <h3>afterend</h3> )]
expected: FAIL

57 changes: 0 additions & 57 deletions tests/wpt/metadata/domparsing/insert_adjacent_html.html.ini
Expand Up @@ -3,87 +3,30 @@
[beforeBegin content without next sibling]
expected: FAIL

[Afterbegin content without next sibling]
expected: FAIL

[BeforeEnd content without next sibling]
expected: FAIL

[afterend content without next sibling]
expected: FAIL

[beforeBegin content again, with next sibling]
expected: FAIL

[Afterbegin content again, with next sibling]
expected: FAIL

[BeforeEnd content again, with next sibling]
expected: FAIL

[afterend content again, with next sibling]
expected: FAIL

[Should throw when inserting with invalid position string]
expected: FAIL

[When the parent node is null, insertAdjacentHTML should throw for beforebegin and afterend (text)]
expected: FAIL

[When the parent node is null, insertAdjacentHTML should throw for beforebegin and afterend (comments)]
expected: FAIL

[When the parent node is null, insertAdjacentHTML should throw for beforebegin and afterend (elements)]
expected: FAIL

[When the parent node is a document, insertAdjacentHTML should throw for beforebegin and afterend (text)]
expected: FAIL

[When the parent node is a document, insertAdjacentHTML should throw for beforebegin and afterend (comments)]
expected: FAIL

[When the parent node is a document, insertAdjacentHTML should throw for beforebegin and afterend (elements)]
expected: FAIL

[Inserting after being and before end should order things correctly]
expected: FAIL

[beforeBegin child node not in tree but has parent]
expected: FAIL

[Afterbegin child node not in tree but has parent]
expected: FAIL

[BeforeEnd child node not in tree but has parent]
expected: FAIL

[afterend child node not in tree but has parent]
expected: FAIL

[beforeBegin content2 without next sibling]
expected: FAIL

[Afterbegin content2 without next sibling]
expected: FAIL

[BeforeEnd content2 without next sibling]
expected: FAIL

[afterend content2 without next sibling]
expected: FAIL

[beforeBegin content2 test again, now that there's a next sibling]
expected: FAIL
[Afterbegin content2 test again, now that there's a next sibling]
expected: FAIL

[BeforeEnd content2 test again, now that there's a next sibling]
expected: FAIL
[afterend content2 test again, now that there's a next sibling]
expected: FAIL

[Inserting kids of the <html> element should not do weird things with implied <body>/<head> tags]
expected: FAIL

54 changes: 0 additions & 54 deletions tests/wpt/metadata/domparsing/insert_adjacent_html.xhtml.ini
Expand Up @@ -3,84 +3,30 @@
[beforeBegin content without next sibling]
expected: FAIL

[Afterbegin content without next sibling]
expected: FAIL

[BeforeEnd content without next sibling]
expected: FAIL

[afterend content without next sibling]
expected: FAIL

[beforeBegin content again, with next sibling]
expected: FAIL

[Afterbegin content again, with next sibling]
expected: FAIL

[BeforeEnd content again, with next sibling]
expected: FAIL

[afterend content again, with next sibling]
expected: FAIL

[Should throw when inserting with invalid position string]
expected: FAIL

[When the parent node is null, insertAdjacentHTML should throw for beforebegin and afterend (text)]
expected: FAIL

[When the parent node is null, insertAdjacentHTML should throw for beforebegin and afterend (comments)]
expected: FAIL

[When the parent node is null, insertAdjacentHTML should throw for beforebegin and afterend (elements)]
expected: FAIL

[When the parent node is a document, insertAdjacentHTML should throw for beforebegin and afterend (text)]
expected: FAIL

[When the parent node is a document, insertAdjacentHTML should throw for beforebegin and afterend (comments)]
expected: FAIL

[When the parent node is a document, insertAdjacentHTML should throw for beforebegin and afterend (elements)]
expected: FAIL

[Inserting after being and before end should order things correctly]
expected: FAIL

[beforeBegin child node not in tree but has parent]
expected: FAIL

[Afterbegin child node not in tree but has parent]
expected: FAIL

[BeforeEnd child node not in tree but has parent]
expected: FAIL

[afterend child node not in tree but has parent]
expected: FAIL

[beforeBegin content2 without next sibling]
expected: FAIL

[Afterbegin content2 without next sibling]
expected: FAIL

[BeforeEnd content2 without next sibling]
expected: FAIL

[afterend content2 without next sibling]
expected: FAIL

[beforeBegin content2 test again, now that there's a next sibling]
expected: FAIL
[Afterbegin content2 test again, now that there's a next sibling]
expected: FAIL

[BeforeEnd content2 test again, now that there's a next sibling]
expected: FAIL
[afterend content2 test again, now that there's a next sibling]
expected: FAIL

Expand Down

0 comments on commit 8c57208

Please sign in to comment.