From c3462ac58096a8e164923a301e2730500bd7c9ad Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Fri, 26 Jan 2024 17:05:49 +0100 Subject: [PATCH 1/2] Pass preloaded url into preload hook --- src/index.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/index.ts b/src/index.ts index 6621913..2cde3ad 100755 --- a/src/index.ts +++ b/src/index.ts @@ -26,7 +26,7 @@ declare module 'swup' { } export interface HookDefinitions { 'link:hover': { el: HTMLAnchorElement; event: DelegateEvent }; - 'page:preload': { page?: PageData }; + 'page:preload': { url: string, page?: PageData }; } export interface HookReturnValues { 'page:preload': Promise; @@ -393,9 +393,10 @@ export default class SwupPreloadPlugin extends Plugin { /** * Perform the actual preload fetch and trigger the preload hook. */ - protected async performPreload(url: string): Promise { - const page = await this.swup.hooks.call('page:preload', undefined, {}, async (visit, args) => { - args.page = await this.swup.fetchPage(url); + protected async performPreload(href: string): Promise { + const { url } = Location.fromUrl(href); + const page = await this.swup.hooks.call('page:preload', undefined, { url }, async (visit, args) => { + args.page = await this.swup.fetchPage(href); return args.page; }); return page; From aeb3e58df15eac8184bcdb7fb1c97d94a3e02c3a Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Fri, 26 Jan 2024 17:06:07 +0100 Subject: [PATCH 2/2] Add tests for ignoring external origins --- tests/fixtures/origins.html | 27 +++++++++++++++++++++++++ tests/functional/preload-plugin.spec.ts | 25 +++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 tests/fixtures/origins.html diff --git a/tests/fixtures/origins.html b/tests/fixtures/origins.html new file mode 100644 index 0000000..0d4e6f6 --- /dev/null +++ b/tests/fixtures/origins.html @@ -0,0 +1,27 @@ + + + + + + Origins + + + +
+

Origins

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

+ +
+ + + + + diff --git a/tests/functional/preload-plugin.spec.ts b/tests/functional/preload-plugin.spec.ts index 01786bb..dc1a9c6 100644 --- a/tests/functional/preload-plugin.spec.ts +++ b/tests/functional/preload-plugin.spec.ts @@ -199,3 +199,28 @@ test.describe('hooks', () => { await expect(async () => expect(await triggered()).toBe(true)).toPass(); }); }); + +test.describe('ignores external origins', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/origins.html'); + await waitForSwup(page); + await page.evaluate(() => { + window.data = []; + window._swup.hooks.before('page:preload', (visit, { url }) => (window.data.push(url))); + }); + }); + test('ignores link elements with external origin', async ({ page }) => { + await page.focus('a[href$="/page-1.html"]'); + await page.focus('a[href$="/page-2.html"]'); + await page.focus('a[href$="/page-3.html"]'); + const urls = await page.evaluate(() => window.data); + expect(urls).toEqual(['/page-1.html', '/page-2.html']); + }); + test('ignores preload requests with external origin', async ({ page }) => { + await page.evaluate(() => { + window._swup.preload!(['https://example.net/page-3.html', '/page-1.html', 'page-2.html']); + }); + const urls = await page.evaluate(() => window.data); + expect(urls).toEqual(['/page-1.html', '/page-2.html']); + }); +});