diff --git a/src/wrappers/HTMLElement.js b/src/wrappers/HTMLElement.js index 5073a18..5f76ac6 100644 --- a/src/wrappers/HTMLElement.js +++ b/src/wrappers/HTMLElement.js @@ -15,6 +15,7 @@ var snapshotNodeList = scope.snapshotNodeList; var unwrap = scope.unwrap; var wrap = scope.wrap; + var wrappers = scope.wrappers; ///////////////////////////////////////////////////////////////////////////// // innerHTML and outerHTML @@ -116,6 +117,9 @@ } function getInnerHTML(node) { + if (node instanceof wrappers.HTMLTemplateElement) + node = node.content; + var s = ''; for (var child = node.firstChild; child; child = child.nextSibling) { s += getOuterHTML(child, node); @@ -138,6 +142,7 @@ var oldIe = /MSIE/.test(navigator.userAgent); var OriginalHTMLElement = window.HTMLElement; + var OriginalHTMLTemplateElement = window.HTMLTemplateElement; function HTMLElement(node) { Element.call(this, node); @@ -145,8 +150,6 @@ HTMLElement.prototype = Object.create(Element.prototype); mixin(HTMLElement.prototype, { get innerHTML() { - // TODO(arv): This should fallback to this.impl.innerHTML if there - // are no shadow trees below or above the context node. return getInnerHTML(this); }, set innerHTML(value) { @@ -163,10 +166,22 @@ var removedNodes = snapshotNodeList(this.childNodes); - if (this.invalidateShadowRenderer()) - setInnerHTML(this, value, this.tagName); - else + if (this.invalidateShadowRenderer()) { + if (this instanceof wrappers.HTMLTemplateElement) + setInnerHTML(this.content, value); + else + setInnerHTML(this, value, this.tagName); + + // If we have a non native template element we need to handle this + // manually since setting impl.innerHTML would add the html as direct + // children and not be moved over to the content fragment. + } else if (!OriginalHTMLTemplateElement && + this instanceof wrappers.HTMLTemplateElement) { + setInnerHTML(this.content, value); + } else { this.impl.innerHTML = value; + } + var addedNodes = snapshotNodeList(this.childNodes); enqueueMutation(this, 'childList', { diff --git a/src/wrappers/HTMLTemplateElement.js b/src/wrappers/HTMLTemplateElement.js index c8f8867..10ef039 100644 --- a/src/wrappers/HTMLTemplateElement.js +++ b/src/wrappers/HTMLTemplateElement.js @@ -6,10 +6,8 @@ 'use strict'; var HTMLElement = scope.wrappers.HTMLElement; - var getInnerHTML = scope.getInnerHTML; var mixin = scope.mixin; var registerWrapper = scope.registerWrapper; - var setInnerHTML = scope.setInnerHTML; var unwrap = scope.unwrap; var wrap = scope.wrap; @@ -62,13 +60,6 @@ return contentTable.get(this); }, - get innerHTML() { - return getInnerHTML(this.content); - }, - set innerHTML(value) { - setInnerHTML(this.content, value); - } - // TODO(arv): cloneNode needs to clone content. }); diff --git a/test/js/HTMLTemplateElement.js b/test/js/HTMLTemplateElement.js index f54518b..91680c1 100644 --- a/test/js/HTMLTemplateElement.js +++ b/test/js/HTMLTemplateElement.js @@ -36,6 +36,18 @@ suite('HTML Template Element', function() { var template = div.firstChild; assert.equal(template.innerHTML, ''); + + assert.equal(div.innerHTML, ''); + }); + + test('get outerHTML', function() { + var div = document.createElement('div'); + div.innerHTML = ''; + var template = div.firstChild; + + assert.equal(template.outerHTML, ''); + assert.equal(div.outerHTML, + '
'); }); test('set innerHTML', function() {