describe('hx-ext attribute', function() { var ext1Calls, ext2Calls, ext3Calls, ext4Calls, ext5Calls beforeEach(function() { ext1Calls = ext2Calls = ext3Calls = ext4Calls = ext5Calls = 0 this.server = makeServer() clearWorkArea() htmx.defineExtension('ext-1', { onEvent: function(name, evt) { if (name === 'htmx:afterRequest') { ext1Calls++ } } }) htmx.defineExtension('ext-2', { onEvent: function(name, evt) { if (name === 'htmx:afterRequest') { ext2Calls++ } } }) htmx.defineExtension('ext-3', { onEvent: function(name, evt) { if (name === 'htmx:afterRequest') { ext3Calls++ } }, isInlineSwap: function(swapStyle) { if (swapStyle === 'invalid') throw new Error('simulate exception handling in isInlineSwap') }, handleSwap: function(swapStyle) { if (swapStyle === 'invalid') throw new Error('simulate exception handling in handleSwap') } }) htmx.defineExtension('ext-4', { onEvent: function(name, evt) { if (name === 'namespace:example') { ext4Calls++ } }, isInlineSwap: function(swapStyle) { return swapStyle === 'inline' }, handleSwap: function(swapStyle, target, fragment, settleInfo) { if (swapStyle === 'inline') { const swapOuterHTML = htmx._('swapOuterHTML') swapOuterHTML(target, fragment, settleInfo) } } }) htmx.defineExtension('ext-5', { getSelectors: function() { return ['[foo]'] }, onEvent: function(name, evt) { if (name === 'htmx:beforeProcessNode' && evt.target.getAttribute('foo')) { ext5Calls++ } } }) }) afterEach(function() { this.server.restore() clearWorkArea() htmx.removeExtension('ext-1') htmx.removeExtension('ext-2') htmx.removeExtension('ext-3') htmx.removeExtension('ext-4') htmx.removeExtension('ext-5') }) it('A simple extension is invoked properly', function() { this.server.respondWith('GET', '/test', 'Clicked!') var btn = make('') btn.click() this.server.respond() ext1Calls.should.equal(1) ext2Calls.should.equal(0) ext3Calls.should.equal(0) }) it('Extensions are merged properly', function() { this.server.respondWith('GET', '/test', 'Clicked!') make('
' + '
') var btn1 = byId('btn-1') var btn2 = byId('btn-2') btn1.click() this.server.respond() ext1Calls.should.equal(1) ext2Calls.should.equal(1) ext3Calls.should.equal(0) btn2.click() this.server.respond() ext1Calls.should.equal(2) ext2Calls.should.equal(1) ext3Calls.should.equal(1) }) it('supports comma separated lists', function() { this.server.respondWith('GET', '/test', 'Clicked!') make('
') var btn1 = byId('btn-1') var btn2 = byId('btn-2') btn1.click() this.server.respond() ext1Calls.should.equal(1) ext2Calls.should.equal(1) ext3Calls.should.equal(1) }) it('A simple extension is invoked properly w/ data-* prefix', function() { this.server.respondWith('GET', '/test', 'Clicked!') var btn = make('') btn.click() this.server.respond() ext1Calls.should.equal(1) ext2Calls.should.equal(0) ext3Calls.should.equal(0) }) it('A simple extension is invoked properly when an HX-Trigger event w/ a namespace fires', function() { this.server.respondWith('GET', '/test', [200, { 'HX-Trigger': 'namespace:example' }, '']) var btn = make('') btn.click() this.server.respond() ext1Calls.should.equal(0) ext2Calls.should.equal(0) ext3Calls.should.equal(0) ext4Calls.should.equal(1) }) it('A simple extension is invoked properly for elements it specified in getSelectors', function() { this.server.respondWith('GET', '/test', [200, { 'HX-Trigger': 'namespace:example' }, '']) var btn = make('
test
') btn.click() this.server.respond() ext1Calls.should.equal(0) ext2Calls.should.equal(0) ext3Calls.should.equal(0) ext4Calls.should.equal(0) ext5Calls.should.equal(1) }) it('Extensions are ignored properly', function() { this.server.respondWith('GET', '/test', 'Clicked!') make('
' + '
') var btn1 = byId('btn-AA') var btn2 = byId('btn-BB') btn1.click() this.server.respond() ext1Calls.should.equal(1) ext2Calls.should.equal(1) ext3Calls.should.equal(0) btn2.click() this.server.respond() ext1Calls.should.equal(1) ext2Calls.should.equal(2) ext3Calls.should.equal(0) ext5Calls.should.equal(1) }) it('oob swap via swap extension uses isInlineSwap correctly', function() { this.server.respondWith( 'GET', '/test', '
Bar
' ) var btn = make('
Foo
') btn.click() this.server.respond() byId('b1').innerHTML.should.equal('Bar') }) it('isInlineSwap/handleSwap handling catches, logs and ignores exceptions in extension code', function() { this.server.respondWith( 'GET', '/test', '
Bar
' ) var btn = make('
Foo
') btn.click() this.server.respond() byId('b1').innerHTML.should.equal('Bar') }) })