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

Commit 4065e87

Browse files
committed
Implement inserAdjacentHTML
1 parent 82461fd commit 4065e87

2 files changed

Lines changed: 152 additions & 0 deletions

File tree

src/wrappers/HTMLElement.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,54 @@
137137
return getOuterHTML(this);
138138
},
139139
set outerHTML(value) {
140+
// TODO(arv): Mutation observer
140141
var p = this.parentNode;
141142
if (p) {
142143
p.invalidateShadowRenderer();
143144
this.impl.outerHTML = value;
144145
}
146+
},
147+
148+
insertAdjacentHTML: function(position, text) {
149+
var contextElement, refNode;
150+
switch (String(position).toLowerCase()) {
151+
case 'beforebegin':
152+
contextElement = this.parentNode;
153+
refNode = this;
154+
break;
155+
case 'afterend':
156+
contextElement = this.parentNode;
157+
refNode = this.nextSibling;
158+
break;
159+
case 'afterbegin':
160+
contextElement = this;
161+
refNode = this.firstChild;
162+
break;
163+
case 'beforeend':
164+
contextElement = this;
165+
refNode = null;
166+
break;
167+
default:
168+
return;
169+
}
170+
171+
var df = frag(contextElement, text);
172+
contextElement.insertBefore(df, refNode);
145173
}
146174
});
147175

176+
function frag(contextElement, html) {
177+
// TODO(arv): This does not work with SVG and other non HTML elements.
178+
var p = unwrap(contextElement.cloneNode(false));
179+
p.innerHTML = html;
180+
var df = unwrap(document.createDocumentFragment());
181+
var c;
182+
while (c = p.firstChild) {
183+
df.appendChild(c);
184+
}
185+
return wrap(df);
186+
}
187+
148188
function getter(name) {
149189
return function() {
150190
scope.renderAllPending();

test/js/MutationObserver/childList.js

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,118 @@ suite('MutationObserver', function() {
646646
});
647647
});
648648

649+
test('insertAdjacentHTML beforebegin', function() {
650+
var a = document.createElement('a');
651+
a.innerHTML = '<b></b><c></c>';
652+
var b = a.firstChild;
653+
var c = a.lastChild;
654+
655+
var observer = new MutationObserver(function() {});
656+
observer.observe(a, {
657+
childList: true
658+
});
659+
660+
c.insertAdjacentHTML('beforebegin', '<d></d><e></e>');
661+
662+
assert.equal(a.innerHTML, '<b></b><d></d><e></e><c></c>');
663+
var d = b.nextSibling;
664+
var e = d.nextSibling;
665+
666+
var records = observer.takeRecords();
667+
assert.equal(records.length, 1);
668+
expectMutationRecord(records[0], {
669+
type: 'childList',
670+
target: a,
671+
addedNodes: [d, e],
672+
previousSibling: b,
673+
nextSibling: c
674+
});
675+
});
676+
677+
test('insertAdjacentHTML afterbegin', function() {
678+
var a = document.createElement('a');
679+
a.innerHTML = '<b></b><c></c>';
680+
var b = a.firstChild;
681+
var c = a.lastChild;
682+
683+
var observer = new MutationObserver(function() {});
684+
observer.observe(a, {
685+
childList: true
686+
});
687+
688+
a.insertAdjacentHTML('afterbegin', '<d></d><e></e>');
689+
690+
assert.equal(a.innerHTML, '<d></d><e></e><b></b><c></c>');
691+
var d = a.firstChild;
692+
var e = d.nextSibling;
693+
694+
var records = observer.takeRecords();
695+
assert.equal(records.length, 1);
696+
expectMutationRecord(records[0], {
697+
type: 'childList',
698+
target: a,
699+
addedNodes: [d, e],
700+
previousSibling: null,
701+
nextSibling: b
702+
});
703+
});
704+
705+
test('insertAdjacentHTML beforeend', function() {
706+
var a = document.createElement('a');
707+
a.innerHTML = '<b></b><c></c>';
708+
var b = a.firstChild;
709+
var c = a.lastChild;
710+
711+
var observer = new MutationObserver(function() {});
712+
observer.observe(a, {
713+
childList: true
714+
});
715+
716+
a.insertAdjacentHTML('beforeend', '<d></d><e></e>');
717+
718+
assert.equal(a.innerHTML, '<b></b><c></c><d></d><e></e>');
719+
var d = c.nextSibling;
720+
var e = d.nextSibling;
721+
722+
var records = observer.takeRecords();
723+
assert.equal(records.length, 1);
724+
expectMutationRecord(records[0], {
725+
type: 'childList',
726+
target: a,
727+
addedNodes: [d, e],
728+
previousSibling: c,
729+
nextSibling: null
730+
});
731+
});
732+
733+
test('insertAdjacentHTML afterend', function() {
734+
var a = document.createElement('a');
735+
a.innerHTML = '<b></b><c></c>';
736+
var b = a.firstChild;
737+
var c = a.lastChild;
738+
739+
var observer = new MutationObserver(function() {});
740+
observer.observe(a, {
741+
childList: true
742+
});
743+
744+
b.insertAdjacentHTML('afterend', '<d></d><e></e>');
745+
746+
assert.equal(a.innerHTML, '<b></b><d></d><e></e><c></c>');
747+
var d = b.nextSibling;
748+
var e = d.nextSibling;
749+
750+
var records = observer.takeRecords();
751+
assert.equal(records.length, 1);
752+
expectMutationRecord(records[0], {
753+
type: 'childList',
754+
target: a,
755+
addedNodes: [d, e],
756+
previousSibling: b,
757+
nextSibling: c
758+
});
759+
});
760+
649761
});
650762

651763
});

0 commit comments

Comments
 (0)