@@ -24,17 +24,25 @@ describe('setInnerHTML', () => {
2424 } ) ;
2525
2626 describe ( 'when the node does not have an innerHTML property' , ( ) => {
27- // Disabled. JSDOM doesn't seem to remove nodes when using appendChild to
28- // move existing nodes.
29- xit ( 'sets innerHTML on it' , ( ) => {
27+ var node ;
28+ var nodeProxy ;
29+ beforeEach ( ( ) => {
3030 // Create a mock node that looks like an SVG in IE (without innerHTML)
31- var node = {
32- namespaceURI : Namespaces . svg ,
33- appendChild : jasmine . createSpy ( ) ,
34- } ;
31+ node = document . createElementNS ( Namespaces . svg , 'svg' ) ;
3532
33+ nodeProxy = new Proxy ( node , {
34+ has : ( target , prop ) => {
35+ return prop === 'innerHTML' ? false : prop in target ;
36+ } ,
37+ } ) ;
38+
39+ spyOn ( node , 'appendChild' ) . and . callThrough ( ) ;
40+ spyOn ( node , 'removeChild' ) . and . callThrough ( ) ;
41+ } ) ;
42+
43+ it ( 'sets innerHTML on it' , ( ) => {
3644 var html = '<circle></circle><rect></rect>' ;
37- setInnerHTML ( node , html ) ;
45+ setInnerHTML ( nodeProxy , html ) ;
3846
3947 expect ( node . appendChild . calls . argsFor ( 0 ) [ 0 ] . outerHTML ) . toBe (
4048 '<circle></circle>' ,
@@ -43,5 +51,18 @@ describe('setInnerHTML', () => {
4351 '<rect></rect>' ,
4452 ) ;
4553 } ) ;
54+
55+ it ( 'clears previous children' , ( ) => {
56+ var firstHtml = '<rect></rect>' ;
57+ var secondHtml = '<circle></circle>' ;
58+ setInnerHTML ( nodeProxy , firstHtml ) ;
59+
60+ setInnerHTML ( nodeProxy , secondHtml ) ;
61+
62+ expect ( node . removeChild . calls . argsFor ( 0 ) [ 0 ] . outerHTML ) . toBe (
63+ '<rect></rect>' ,
64+ ) ;
65+ expect ( node . innerHTML ) . toBe ( '<circle></circle>' ) ;
66+ } ) ;
4667 } ) ;
4768} ) ;
0 commit comments