', { headers: { 'HX-Reswap': 'none' } });
+
+ htmx.__restoreHistory({htmx: true}, '/restore-test');
+ await forRequest();
+
+ // HX-Request is intentionally omitted so servers return full pages
+ assert.isUndefined(lastFetch().request.headers['HX-Request']);
+ });
+});
+
describe('history restore edge cases', function() {
- beforeEach(() => { setupTest(this.currentTest); });
- afterEach(() => { cleanupTest(); });
+ beforeEach(function() { setupTest(); });
+ afterEach(function() { cleanupTest(); });
it('a second back aborts the in-flight restore', async function() {
this.timeout(5000);
diff --git a/test/tests/unit/headers.js b/test/tests/unit/headers.js
index 6d675909f..0743d6004 100644
--- a/test/tests/unit/headers.js
+++ b/test/tests/unit/headers.js
@@ -65,39 +65,45 @@ describe('Request Headers', function() {
describe('HX-Request-Type header', function() {
it('sets to partial for regular element target', async function() {
- createProcessedHTML('');
+ mockResponse('GET', '/test', 'ok');
+ createProcessedHTML('');
let btn = document.querySelector('button');
- let ctx = htmx.__createRequestContext(btn, new Event('click'));
- await htmx.__handleTriggerEvent(ctx);
- ctx.request.headers['HX-Request-Type'].should.equal('partial');
+ btn.click();
+ await forRequest();
+ lastFetch().request.headers['HX-Request-Type'].should.equal('partial');
});
it('sets to partial when targeting self', async function() {
- let btn = createProcessedHTML('');
- let ctx = htmx.__createRequestContext(btn, new Event('click'));
- await htmx.__handleTriggerEvent(ctx);
- ctx.request.headers['HX-Request-Type'].should.equal('partial');
+ mockResponse('GET', '/test', 'ok');
+ let btn = createProcessedHTML('');
+ btn.click();
+ await forRequest();
+ lastFetch().request.headers['HX-Request-Type'].should.equal('partial');
});
it('sets to full when targeting body', async function() {
- let btn = createProcessedHTML('');
- let ctx = htmx.__createRequestContext(btn, new Event('click'));
- await htmx.__handleTriggerEvent(ctx);
- ctx.request.headers['HX-Request-Type'].should.equal('full');
+ mockResponse('GET', '/test', 'ok');
+ let btn = createProcessedHTML('');
+ btn.click();
+ await forRequest();
+ lastFetch().request.headers['HX-Request-Type'].should.equal('full');
});
it('sets to full when hx-select is present', async function() {
- let btn = createProcessedHTML('');
- let ctx = htmx.__createRequestContext(btn, new Event('click'));
- await htmx.__handleTriggerEvent(ctx);
- ctx.request.headers['HX-Request-Type'].should.equal('full');
+ mockResponse('GET', '/test', '
ok
');
+ createProcessedHTML('');
+ let btn = document.querySelector('button');
+ btn.click();
+ await forRequest();
+ lastFetch().request.headers['HX-Request-Type'].should.equal('full');
});
it('sets to full when hx-select and body target both present', async function() {
- let btn = createProcessedHTML('');
- let ctx = htmx.__createRequestContext(btn, new Event('click'));
- await htmx.__handleTriggerEvent(ctx);
- ctx.request.headers['HX-Request-Type'].should.equal('full');
+ mockResponse('GET', '/test', '
ok
');
+ let btn = createProcessedHTML('');
+ btn.click();
+ await forRequest();
+ lastFetch().request.headers['HX-Request-Type'].should.equal('full');
});
});
diff --git a/www/src/content/extensions/14-hx-csp.md b/www/src/content/extensions/14-hx-csp.md
index 4d30f56a2..35a98e273 100644
--- a/www/src/content/extensions/14-hx-csp.md
+++ b/www/src/content/extensions/14-hx-csp.md
@@ -119,6 +119,19 @@ The server cannot know the page nonce — it only knows its own per-response non
The risk: unlike `