Fix preloading stylesheets in view transitions (#8707)
* Fix preload of stylesheets (VT) * Fix preload of stylesheets (VT)
This commit is contained in:
parent
345808170f
commit
148b5b8769
6 changed files with 29 additions and 2 deletions
|
@ -0,0 +1,3 @@
|
||||||
|
#one {
|
||||||
|
background-color: whitesmoke;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
h1 {
|
||||||
|
color: blue
|
||||||
|
}
|
|
@ -18,6 +18,7 @@ const { link } = Astro.props as Props;
|
||||||
margin: auto;
|
margin: auto;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
<link rel="stylesheet" href="/style.css">
|
||||||
<ViewTransitions />
|
<ViewTransitions />
|
||||||
<DarkMode />
|
<DarkMode />
|
||||||
<meta name="script-executions" content="0">
|
<meta name="script-executions" content="0">
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
import Layout from '../components/Layout.astro';
|
import Layout from '../components/Layout.astro';
|
||||||
---
|
---
|
||||||
<Layout>
|
<Layout link="/one.css">
|
||||||
<p id="one">Page 1</p>
|
<p id="one">Page 1</p>
|
||||||
<a id="click-one" href="#test">test</a>
|
<a id="click-one" href="#test">test</a>
|
||||||
<a id="click-two" href="/two">go to 2</a>
|
<a id="click-two" href="/two">go to 2</a>
|
||||||
|
|
|
@ -20,6 +20,20 @@ function scrollToBottom(page) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function collectPreloads(page) {
|
||||||
|
return page.evaluate(() => {
|
||||||
|
window.preloads = [];
|
||||||
|
const observer = new MutationObserver((mutations) => {
|
||||||
|
mutations.forEach((mutation) =>
|
||||||
|
mutation.addedNodes.forEach((node) => {
|
||||||
|
if (node.nodeName === 'LINK' && node.rel === 'preload') preloads.push(node.href);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
observer.observe(document.head, { childList: true });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
test.describe('View Transitions', () => {
|
test.describe('View Transitions', () => {
|
||||||
test('Moving from page 1 to page 2', async ({ page, astro }) => {
|
test('Moving from page 1 to page 2', async ({ page, astro }) => {
|
||||||
const loads = [];
|
const loads = [];
|
||||||
|
@ -170,11 +184,15 @@ test.describe('View Transitions', () => {
|
||||||
let p = page.locator('#one');
|
let p = page.locator('#one');
|
||||||
await expect(p, 'should have content').toHaveText('Page 1');
|
await expect(p, 'should have content').toHaveText('Page 1');
|
||||||
|
|
||||||
|
await collectPreloads(page);
|
||||||
|
|
||||||
// Go to page 2
|
// Go to page 2
|
||||||
await page.click('#click-two');
|
await page.click('#click-two');
|
||||||
p = page.locator('#two');
|
p = page.locator('#two');
|
||||||
await expect(p, 'should have content').toHaveText('Page 2');
|
await expect(p, 'should have content').toHaveText('Page 2');
|
||||||
await expect(p, 'imported CSS updated').toHaveCSS('font-size', '24px');
|
await expect(p, 'imported CSS updated').toHaveCSS('font-size', '24px');
|
||||||
|
const preloads = await page.evaluate(() => window.preloads);
|
||||||
|
expect(preloads.length === 1 && preloads[0].endsWith('/two.css')).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('astro:page-load event fires when navigating to new page', async ({ page, astro }) => {
|
test('astro:page-load event fires when navigating to new page', async ({ page, astro }) => {
|
||||||
|
|
|
@ -292,7 +292,9 @@ async function updateDOM(
|
||||||
// Do not preload links that are already on the page.
|
// Do not preload links that are already on the page.
|
||||||
if (
|
if (
|
||||||
!document.querySelector(
|
!document.querySelector(
|
||||||
`[${PERSIST_ATTR}="${el.getAttribute(PERSIST_ATTR)}"], link[rel=stylesheet]`
|
`[${PERSIST_ATTR}="${el.getAttribute(
|
||||||
|
PERSIST_ATTR
|
||||||
|
)}"], link[rel=stylesheet][href="${el.getAttribute('href')}"]`
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
const c = document.createElement('link');
|
const c = document.createElement('link');
|
||||||
|
|
Loading…
Reference in a new issue