diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-10-16 01:27:43 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-16 01:27:43 -0500 |
commit | adb45eb7279bad6e7048e810e3c2108bf2b628bb (patch) | |
tree | e42eec5cc910346de045cd8c42e088c7a00f5aab /components/script/dom/element.rs | |
parent | 086c48210c1ea0b65c91e1b300f796758080871f (diff) | |
parent | c77b61193f60bb936cd2a2549694204abbc55728 (diff) | |
download | servo-adb45eb7279bad6e7048e810e3c2108bf2b628bb.tar.gz servo-adb45eb7279bad6e7048e810e3c2108bf2b628bb.zip |
Auto merge of #18888 - tigercosmos:xml, r=jdm
fix #18776: use XML fragment serialization for innerHTML in XML documents
<!-- Please describe your changes on the following line: -->
I am not sure whether my solution is in the right way.
@jdm Can you give some advises?
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [ ] `./mach test-tidy` does not report any errors
- [ ] These changes fix #18776 (github issue number if applicable).
<!-- Either: -->
- [ ] There are tests for these changes OR
- [ ] These changes do not require tests because _____
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/18888)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r-- | components/script/dom/element.rs | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index e877a8b0752..485ad9c918e 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -120,6 +120,11 @@ use style::values::{CSSFloat, Either}; use style::values::{specified, computed}; use stylesheet_loader::StylesheetOwner; use task::TaskOnce; +use xml5ever::serialize as xmlSerialize; +use xml5ever::serialize::SerializeOpts as XmlSerializeOpts; +use xml5ever::serialize::TraversalScope as XmlTraversalScope; +use xml5ever::serialize::TraversalScope::ChildrenOnly as XmlChildrenOnly; +use xml5ever::serialize::TraversalScope::IncludeNode as XmlIncludeNode; // TODO: Update focus state when the top-level browsing context gains or loses system focus, // and when the element enters or leaves a browsing context container. @@ -1004,6 +1009,19 @@ impl Element { } } + pub fn xmlSerialize(&self, traversal_scope: XmlTraversalScope) -> Fallible<DOMString> { + let mut writer = vec![]; + match xmlSerialize::serialize(&mut writer, + &self.upcast::<Node>(), + XmlSerializeOpts { + traversal_scope: traversal_scope, + ..Default::default() + }) { + Ok(()) => Ok(DOMString::from(String::from_utf8(writer).unwrap())), + Err(_) => panic!("Cannot serialize element"), + } + } + pub fn root_element(&self) -> DomRoot<Element> { if self.node.is_in_doc() { self.upcast::<Node>() @@ -2047,11 +2065,14 @@ impl ElementMethods for Element { /// https://w3c.github.io/DOM-Parsing/#widl-Element-innerHTML fn GetInnerHTML(&self) -> Fallible<DOMString> { - // XXX TODO: XML case let qname = QualName::new(self.prefix().clone(), self.namespace().clone(), self.local_name().clone()); - self.serialize(ChildrenOnly(Some(qname))) + if document_from_node(self).is_html_document() { + return self.serialize(ChildrenOnly(Some(qname))); + } else { + return self.xmlSerialize(XmlChildrenOnly(Some(qname))); + } } /// https://w3c.github.io/DOM-Parsing/#widl-Element-innerHTML @@ -2071,7 +2092,11 @@ impl ElementMethods for Element { // https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#widl-Element-outerHTML fn GetOuterHTML(&self) -> Fallible<DOMString> { - self.serialize(IncludeNode) + if document_from_node(self).is_html_document() { + return self.serialize(IncludeNode); + } else { + return self.xmlSerialize(XmlIncludeNode); + } } // https://w3c.github.io/DOM-Parsing/#dom-element-outerhtml |