Skip to content
This repository was archived by the owner on Mar 13, 2018. It is now read-only.

Commit 409fb08

Browse files
committed
Merge pull request #370 from arv/template-inner-html
innerHTML was not working correctly for HTMLTemplateElement
2 parents 3d48070 + 4391e43 commit 409fb08

File tree

3 files changed

+32
-14
lines changed

3 files changed

+32
-14
lines changed

src/wrappers/HTMLElement.js

+20-5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
var snapshotNodeList = scope.snapshotNodeList;
1616
var unwrap = scope.unwrap;
1717
var wrap = scope.wrap;
18+
var wrappers = scope.wrappers;
1819

1920
/////////////////////////////////////////////////////////////////////////////
2021
// innerHTML and outerHTML
@@ -116,6 +117,9 @@
116117
}
117118

118119
function getInnerHTML(node) {
120+
if (node instanceof wrappers.HTMLTemplateElement)
121+
node = node.content;
122+
119123
var s = '';
120124
for (var child = node.firstChild; child; child = child.nextSibling) {
121125
s += getOuterHTML(child, node);
@@ -138,15 +142,14 @@
138142
var oldIe = /MSIE/.test(navigator.userAgent);
139143

140144
var OriginalHTMLElement = window.HTMLElement;
145+
var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
141146

142147
function HTMLElement(node) {
143148
Element.call(this, node);
144149
}
145150
HTMLElement.prototype = Object.create(Element.prototype);
146151
mixin(HTMLElement.prototype, {
147152
get innerHTML() {
148-
// TODO(arv): This should fallback to this.impl.innerHTML if there
149-
// are no shadow trees below or above the context node.
150153
return getInnerHTML(this);
151154
},
152155
set innerHTML(value) {
@@ -163,10 +166,22 @@
163166

164167
var removedNodes = snapshotNodeList(this.childNodes);
165168

166-
if (this.invalidateShadowRenderer())
167-
setInnerHTML(this, value, this.tagName);
168-
else
169+
if (this.invalidateShadowRenderer()) {
170+
if (this instanceof wrappers.HTMLTemplateElement)
171+
setInnerHTML(this.content, value);
172+
else
173+
setInnerHTML(this, value, this.tagName);
174+
175+
// If we have a non native template element we need to handle this
176+
// manually since setting impl.innerHTML would add the html as direct
177+
// children and not be moved over to the content fragment.
178+
} else if (!OriginalHTMLTemplateElement &&
179+
this instanceof wrappers.HTMLTemplateElement) {
180+
setInnerHTML(this.content, value);
181+
} else {
169182
this.impl.innerHTML = value;
183+
}
184+
170185
var addedNodes = snapshotNodeList(this.childNodes);
171186

172187
enqueueMutation(this, 'childList', {

src/wrappers/HTMLTemplateElement.js

-9
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@
66
'use strict';
77

88
var HTMLElement = scope.wrappers.HTMLElement;
9-
var getInnerHTML = scope.getInnerHTML;
109
var mixin = scope.mixin;
1110
var registerWrapper = scope.registerWrapper;
12-
var setInnerHTML = scope.setInnerHTML;
1311
var unwrap = scope.unwrap;
1412
var wrap = scope.wrap;
1513

@@ -62,13 +60,6 @@
6260
return contentTable.get(this);
6361
},
6462

65-
get innerHTML() {
66-
return getInnerHTML(this.content);
67-
},
68-
set innerHTML(value) {
69-
setInnerHTML(this.content, value);
70-
}
71-
7263
// TODO(arv): cloneNode needs to clone content.
7364

7465
});

test/js/HTMLTemplateElement.js

+12
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ suite('HTML Template Element', function() {
3636
var template = div.firstChild;
3737

3838
assert.equal(template.innerHTML, '<a></a><b></b>');
39+
40+
assert.equal(div.innerHTML, '<template><a></a><b></b></template>');
41+
});
42+
43+
test('get outerHTML', function() {
44+
var div = document.createElement('div');
45+
div.innerHTML = '<template><a></a><b></b></template>';
46+
var template = div.firstChild;
47+
48+
assert.equal(template.outerHTML, '<template><a></a><b></b></template>');
49+
assert.equal(div.outerHTML,
50+
'<div><template><a></a><b></b></template></div>');
3951
});
4052

4153
test('set innerHTML', function() {

0 commit comments

Comments
 (0)