@@ -260,4 +260,91 @@ describe('hx-swap-oob attribute', function() {
260260 byId ( 'td1' ) . innerHTML . should . equal ( 'hey' )
261261 } )
262262 }
263+ for ( const config of [ { allowNestedOobSwaps : true } , { allowNestedOobSwaps : false } ] ) {
264+ it ( 'handles oob target in web components with both inside shadow root and config ' + JSON . stringify ( config ) , function ( ) {
265+ this . server . respondWith ( 'GET' , '/test' , '<div hx-swap-oob="innerHTML:#oob-swap-target">new contents</div>Clicked' )
266+ class TestElement extends HTMLElement {
267+ connectedCallback ( ) {
268+ const root = this . attachShadow ( { mode : 'open' } )
269+ root . innerHTML = `
270+ <button hx-get="/test" hx-target="next div">Click me!</button>
271+ <div id="main-target"></div>
272+ <div id="oob-swap-target">this should get swapped</div>
273+ `
274+ htmx . process ( root ) // Tell HTMX about this component's shadow DOM
275+ }
276+ }
277+ var elementName = 'test-oobswap-inside-' + config . allowNestedOobSwaps
278+ customElements . define ( elementName , TestElement )
279+ var div = make ( `<div><div id="oob-swap-target">this should not get swapped</div><${ elementName } /></div>` )
280+ var badTarget = div . querySelector ( '#oob-swap-target' )
281+ var webComponent = div . querySelector ( elementName )
282+ var btn = webComponent . shadowRoot . querySelector ( 'button' )
283+ var goodTarget = webComponent . shadowRoot . querySelector ( '#oob-swap-target' )
284+ var mainTarget = webComponent . shadowRoot . querySelector ( '#main-target' )
285+ btn . click ( )
286+ this . server . respond ( )
287+ should . equal ( mainTarget . textContent , 'Clicked' )
288+ should . equal ( goodTarget . textContent , 'new contents' )
289+ should . equal ( badTarget . textContent , 'this should not get swapped' )
290+ } )
291+ }
292+ for ( const config of [ { allowNestedOobSwaps : true } , { allowNestedOobSwaps : false } ] ) {
293+ it ( 'handles oob target in web components with main target outside web component config ' + JSON . stringify ( config ) , function ( ) {
294+ this . server . respondWith ( 'GET' , '/test' , '<div hx-swap-oob="innerHTML:#oob-swap-target">new contents</div>Clicked' )
295+ class TestElement extends HTMLElement {
296+ connectedCallback ( ) {
297+ const root = this . attachShadow ( { mode : 'open' } )
298+ root . innerHTML = `
299+ <button hx-get="/test" hx-target="global #main-target">Click me!</button>
300+ <div id="main-target"></div>
301+ <div id="oob-swap-target">this should get swapped</div>
302+ `
303+ htmx . process ( root ) // Tell HTMX about this component's shadow DOM
304+ }
305+ }
306+ var elementName = 'test-oobswap-global-main-' + config . allowNestedOobSwaps
307+ customElements . define ( elementName , TestElement )
308+ var div = make ( `<div><div id="main-target"></div><div id="oob-swap-target">this should not get swapped</div><${ elementName } /></div>` )
309+ var badTarget = div . querySelector ( '#oob-swap-target' )
310+ var webComponent = div . querySelector ( elementName )
311+ var btn = webComponent . shadowRoot . querySelector ( 'button' )
312+ var goodTarget = webComponent . shadowRoot . querySelector ( '#oob-swap-target' )
313+ var mainTarget = div . querySelector ( '#main-target' )
314+ btn . click ( )
315+ this . server . respond ( )
316+ should . equal ( mainTarget . textContent , 'Clicked' )
317+ should . equal ( goodTarget . textContent , 'new contents' )
318+ should . equal ( badTarget . textContent , 'this should not get swapped' )
319+ } )
320+ }
321+ for ( const config of [ { allowNestedOobSwaps : true } , { allowNestedOobSwaps : false } ] ) {
322+ it ( 'handles global oob target in web components with main target inside web component config ' + JSON . stringify ( config ) , function ( ) {
323+ this . server . respondWith ( 'GET' , '/test' , '<div hx-swap-oob="innerHTML:global #oob-swap-target">new contents</div>Clicked' )
324+ class TestElement extends HTMLElement {
325+ connectedCallback ( ) {
326+ const root = this . attachShadow ( { mode : 'open' } )
327+ root . innerHTML = `
328+ <button hx-get="/test" hx-target="next div">Click me!</button>
329+ <div id="main-target"></div>
330+ <div id="oob-swap-target">this should not get swapped</div>
331+ `
332+ htmx . process ( root ) // Tell HTMX about this component's shadow DOM
333+ }
334+ }
335+ var elementName = 'test-oobswap-global-oob-' + config . allowNestedOobSwaps
336+ customElements . define ( elementName , TestElement )
337+ var div = make ( `<div><div id="main-target"></div><div id="oob-swap-target">this should get swapped</div><${ elementName } /></div>` )
338+ var webComponent = div . querySelector ( elementName )
339+ var badTarget = webComponent . shadowRoot . querySelector ( '#oob-swap-target' )
340+ var btn = webComponent . shadowRoot . querySelector ( 'button' )
341+ var goodTarget = div . querySelector ( '#oob-swap-target' )
342+ var mainTarget = webComponent . shadowRoot . querySelector ( '#main-target' )
343+ btn . click ( )
344+ this . server . respond ( )
345+ should . equal ( mainTarget . textContent , 'Clicked' )
346+ should . equal ( goodTarget . textContent , 'new contents' )
347+ should . equal ( badTarget . textContent , 'this should not get swapped' )
348+ } )
349+ }
263350} )
0 commit comments