describe('security options', function() { beforeEach(function() { this.server = makeServer() clearWorkArea() }) afterEach(function() { this.server.restore() clearWorkArea() }) it('can disable a single elt', function() { this.server.respondWith('GET', '/test', 'Clicked!') var btn = make('') btn.click() this.server.respond() btn.innerHTML.should.equal('Initial') }) it('can disable a parent elt', function() { this.server.respondWith('GET', '/test', 'Clicked!') var div = make('
') var btn = byId('b1') btn.click() this.server.respond() btn.innerHTML.should.equal('Initial') }) it('can disable a single elt dynamically', function() { this.server.respondWith('GET', '/test', 'Clicked!') var btn = make('') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') this.server.respondWith('GET', '/test', 'Clicked a second time') btn.setAttribute('hx-disable', '') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') }) it('can disable a single elt dynamically & enable it back', function() { this.server.respondWith('GET', '/test', 'Clicked!') var btn = make('') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') this.server.respondWith('GET', '/test', 'Clicked a second time') btn.setAttribute('hx-disable', '') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') btn.removeAttribute('hx-disable') htmx.process(btn) btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked a second time') }) it('can disable a single parent elt dynamically', function() { this.server.respondWith('GET', '/test', 'Clicked!') var div = make('') var btn = byId('b1') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') this.server.respondWith('GET', '/test', 'Clicked a second time') div.setAttribute('hx-disable', '') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') }) it('can disable a single parent elt dynamically & enable it back', function() { this.server.respondWith('GET', '/test', 'Clicked!') var div = make('') var btn = byId('b1') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') this.server.respondWith('GET', '/test', 'Clicked a second time') div.setAttribute('hx-disable', '') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') div.removeAttribute('hx-disable') htmx.process(div) btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked a second time') }) it('can make egress cross site requests when htmx.config.selfRequestsOnly is disabled', function(done) { this.timeout(4000) htmx.config.selfRequestsOnly = false // should trigger send error, rather than reject var listener = htmx.on('htmx:sendError', function() { htmx.config.selfRequestsOnly = true htmx.off('htmx:sendError', listener) done() }) this.server.restore() // use real xhrs // will 404, but should respond var btn = make('') btn.click() }) it("can't make egress cross site requests when htmx.config.selfRequestsOnly is enabled", function(done) { this.timeout(4000) // should trigger send error, rather than reject var listener = htmx.on('htmx:invalidPath', function() { htmx.off('htmx:invalidPath', listener) done() }) this.server.restore() // use real xhrs // will 404, but should respond var btn = make('') btn.click() }) it('can cancel egress request based on htmx:validateUrl event', function(done) { this.timeout(4000) // should trigger send error, rather than reject var pathVerifier = htmx.on('htmx:validateUrl', function(evt) { evt.preventDefault() htmx.off('htmx:validateUrl', pathVerifier) }) var listener = htmx.on('htmx:invalidPath', function() { htmx.off('htmx:invalidPath', listener) done() }) this.server.restore() // use real xhrs // will 404, but should respond var btn = make('') btn.click() }) it('can cancel egress request based on htmx:validateUrl event, sameHost is false', function(done) { this.timeout(4000) // should trigger send error, rather than reject var pathVerifier = htmx.on('htmx:validateUrl', function(evt) { if (evt.detail.sameHost === false) { evt.preventDefault() } htmx.off('htmx:validateUrl', pathVerifier) }) var listener = htmx.on('htmx:invalidPath', function() { htmx.off('htmx:invalidPath', listener) done() }) this.server.restore() // use real xhrs // will 404, but should respond var btn = make('') btn.click() }) it('can disable script tag support with htmx.config.allowScriptTags', function() { var globalWasCalled = false window.callGlobal = function() { globalWasCalled = true } try { htmx.config.allowScriptTags = false this.server.respondWith('GET', '/test', '') var div = make("") div.click() this.server.respond() globalWasCalled.should.equal(false) } finally { htmx.config.allowScriptTags = true delete window.callGlobal } }) })