From 06759fd0fd4e6a1b905cb93fb023b389d7f73bc3 Mon Sep 17 00:00:00 2001 From: tigercosmos Date: Sun, 15 Oct 2017 21:48:14 +0800 Subject: [PATCH 1/2] use XML fragment serialization for innerHTML in XML documents --- components/script/dom/element.rs | 24 +++++++++++++++++-- .../domparsing/innerhtml-03.xhtml.ini | 14 ----------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index f6e5357df10..c30f27c8f69 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -120,6 +120,10 @@ 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; // 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 +1008,19 @@ impl Element { } } + pub fn xmlSerialize(&self, traversal_scope: XmlTraversalScope) -> Fallible { + let mut writer = vec![]; + match xmlSerialize::serialize(&mut writer, + &self.upcast::(), + 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 { if self.node.is_in_doc() { self.upcast::() @@ -2059,11 +2076,14 @@ impl ElementMethods for Element { /// https://w3c.github.io/DOM-Parsing/#widl-Element-innerHTML fn GetInnerHTML(&self) -> Fallible { - // 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 diff --git a/tests/wpt/metadata/domparsing/innerhtml-03.xhtml.ini b/tests/wpt/metadata/domparsing/innerhtml-03.xhtml.ini index f2b043ad4bf..cfe1e804e2c 100644 --- a/tests/wpt/metadata/domparsing/innerhtml-03.xhtml.ini +++ b/tests/wpt/metadata/domparsing/innerhtml-03.xhtml.ini @@ -1,21 +1,7 @@ [innerhtml-03.xhtml] type: testharness - [innerHTML in XHTML] - expected: FAIL - - [innerHTML in XHTML 1] - expected: FAIL - - [innerHTML in XHTML 2] - expected: FAIL - bug: https://github.com/servo/servo/issues/18776 - [innerHTML in XHTML 3] expected: FAIL [innerHTML in XHTML 4] expected: FAIL - - [innerHTML in XHTML 7] - expected: FAIL - From c77b61193f60bb936cd2a2549694204abbc55728 Mon Sep 17 00:00:00 2001 From: tigercosmos Date: Mon, 16 Oct 2017 03:05:44 +0800 Subject: [PATCH 2/2] use XML fragment serialization for outerHTML in XML documents --- components/script/dom/element.rs | 7 +- .../outerhtml.html.ini | 11 - .../outerHTML.html.ini | 288 +----------------- 3 files changed, 7 insertions(+), 299 deletions(-) delete mode 100644 tests/wpt/metadata/html/semantics/scripting-1/the-template-element/additions-to-serializing-xhtml-documents/outerhtml.html.ini diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index c30f27c8f69..8b9dda58f43 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -124,6 +124,7 @@ 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. @@ -2103,7 +2104,11 @@ impl ElementMethods for Element { // https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#widl-Element-outerHTML fn GetOuterHTML(&self) -> Fallible { - 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 diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-template-element/additions-to-serializing-xhtml-documents/outerhtml.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-template-element/additions-to-serializing-xhtml-documents/outerhtml.html.ini deleted file mode 100644 index 6fff7134d8f..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-template-element/additions-to-serializing-xhtml-documents/outerhtml.html.ini +++ /dev/null @@ -1,11 +0,0 @@ -[outerhtml.html] - type: testharness - [Template contents should be serialized instead of template element if serializing template element] - expected: FAIL - - [Template contents should be serialized instead of template element if serializing template element. Test nested template] - expected: FAIL - - [Template contents should be serialized instead of template element if serializing template element. Test serializing whole document] - expected: FAIL - diff --git a/tests/wpt/metadata/html/syntax/serializing-xml-fragments/outerHTML.html.ini b/tests/wpt/metadata/html/syntax/serializing-xml-fragments/outerHTML.html.ini index a7cb4f2e878..2988b641022 100644 --- a/tests/wpt/metadata/html/syntax/serializing-xml-fragments/outerHTML.html.ini +++ b/tests/wpt/metadata/html/syntax/serializing-xml-fragments/outerHTML.html.ini @@ -1,296 +1,11 @@ [outerHTML.html] type: testharness - [Node for a] - expected: FAIL - - [Node for abbr] - expected: FAIL - - [Node for address] - expected: FAIL - - [Node for article] - expected: FAIL - - [Node for aside] - expected: FAIL - - [Node for audio] - expected: FAIL - - [Node for b] - expected: FAIL - - [Node for bdi] - expected: FAIL - - [Node for bdo] - expected: FAIL - - [Node for blockquote] - expected: FAIL - - [Node for body] - expected: FAIL - - [Node for button] - expected: FAIL - - [Node for canvas] - expected: FAIL - - [Node for caption] - expected: FAIL - - [Node for cite] - expected: FAIL - - [Node for code] - expected: FAIL - - [Node for colgroup] - expected: FAIL - - [Node for command] - expected: FAIL - - [Node for datalist] - expected: FAIL - - [Node for dd] - expected: FAIL - - [Node for del] - expected: FAIL - - [Node for details] - expected: FAIL - - [Node for dfn] - expected: FAIL - - [Node for dialog] - expected: FAIL - - [Node for div] - expected: FAIL - - [Node for dl] - expected: FAIL - - [Node for dt] - expected: FAIL - - [Node for em] - expected: FAIL - - [Node for fieldset] - expected: FAIL - - [Node for figcaption] - expected: FAIL - - [Node for figure] - expected: FAIL - - [Node for footer] - expected: FAIL - - [Node for form] - expected: FAIL - - [Node for h1] - expected: FAIL - - [Node for h2] - expected: FAIL - - [Node for h3] - expected: FAIL - - [Node for h4] - expected: FAIL - - [Node for h5] - expected: FAIL - - [Node for h6] - expected: FAIL - - [Node for head] - expected: FAIL - - [Node for header] - expected: FAIL - - [Node for hgroup] - expected: FAIL - - [Node for html] - expected: FAIL - - [Node for i] - expected: FAIL - - [Node for iframe] - expected: FAIL - - [Node for ins] - expected: FAIL - - [Node for kbd] - expected: FAIL - - [Node for label] - expected: FAIL - - [Node for legend] - expected: FAIL - - [Node for li] - expected: FAIL - - [Node for map] - expected: FAIL - - [Node for mark] - expected: FAIL - - [Node for menu] - expected: FAIL - - [Node for meter] - expected: FAIL - - [Node for nav] - expected: FAIL - - [Node for noscript] - expected: FAIL - - [Node for object] - expected: FAIL - - [Node for ol] - expected: FAIL - - [Node for optgroup] - expected: FAIL - - [Node for option] - expected: FAIL - - [Node for output] - expected: FAIL - - [Node for p] - expected: FAIL - - [Node for pre] - expected: FAIL - - [Node for progress] - expected: FAIL - - [Node for q] - expected: FAIL - - [Node for rp] - expected: FAIL - - [Node for rt] - expected: FAIL - - [Node for ruby] - expected: FAIL - - [Node for s] - expected: FAIL - - [Node for samp] - expected: FAIL - - [Node for script] - expected: FAIL - - [Node for section] - expected: FAIL - - [Node for select] - expected: FAIL - - [Node for small] - expected: FAIL - - [Node for span] - expected: FAIL - - [Node for strong] - expected: FAIL - - [Node for style] - expected: FAIL - - [Node for sub] - expected: FAIL - - [Node for summary] - expected: FAIL - - [Node for sup] - expected: FAIL - - [Node for table] - expected: FAIL - - [Node for tbody] - expected: FAIL - - [Node for td] - expected: FAIL - - [Node for textarea] - expected: FAIL - - [Node for tfoot] - expected: FAIL - - [Node for th] - expected: FAIL - - [Node for thead] - expected: FAIL - - [Node for time] - expected: FAIL - - [Node for title] - expected: FAIL - - [Node for tr] - expected: FAIL - - [Node for u] - expected: FAIL - - [Node for ul] - expected: FAIL - - [Node for var] - expected: FAIL - - [Node for video] - expected: FAIL - - [Node for data] - expected: FAIL - [Node for area] expected: FAIL [Node for base] expected: FAIL - + [Node for br] expected: FAIL @@ -329,4 +44,3 @@ [Node for wbr] expected: FAIL -