common.js (2131B)
1 function assertViewTransitionOnNavigationImplemented() { 2 assert_implements( 3 window.CSSViewTransitionRule, "ViewTransition-on-navigation not implemented."); 4 } 5 6 const render_blocking_url = `resources/render-blocking-stylesheet.py`; 7 let render_block_uuid = null; 8 let render_block_reject = null; 9 let render_block_resolve = null; 10 11 function renderBlockingOnError() { 12 render_block_reject('Error while loading render blocking stylesheet.'); 13 } 14 function renderBlockingOnLoad() { 15 render_block_resolve(); 16 } 17 18 function blockRendering() { 19 if (document.body) 20 throw new Error('Cannot block rendering after body has been parsed.'); 21 22 if (render_block_uuid) 23 throw new Error('Rendering already blocked.'); 24 25 return new Promise((resolve, reject) => { 26 render_block_reject = reject; 27 render_block_resolve = resolve; 28 render_block_uuid = token(); 29 const href = `${render_blocking_url}?key=${render_block_uuid}`; 30 // Need to use document.write since only parser-encountered stylesheets 31 // cause render blocking. 32 document.write(`<link rel="stylesheet" onerror="renderBlockingOnError()" onload="renderBlockingOnLoad()" href="${href}">`); 33 document.close(); 34 }); 35 } 36 37 function unblockRendering() { 38 if (!render_block_uuid) 39 throw new Error('Rendering not blocked.'); 40 41 const url = `${render_blocking_url}?key=${render_block_uuid}`; 42 return fetch(url, { method: 'POST' }).then(response => { 43 if (response.status != 200) { 44 return response.text().then((body) => { 45 throw new Error('Failed to unblock rendering: ' + body); 46 }); 47 } 48 }); 49 } 50 51 // Use external/wpt/html/browsers/browsing-the-web/back-forward-cache/resources/executor.js 52 // when migrating to external WPTs. 53 window.disableBFCache = () => { 54 return new Promise(resolve => { 55 // Use page's UUID as a unique lock name. 56 navigator.locks.request("test", () => { 57 resolve(); 58 return new Promise(() => {}); 59 }); 60 }); 61 }; 62 63 function waitForMessage(msg) { 64 return new Promise(resolve => { 65 window.addEventListener( 66 "message", (e) => { 67 if (e.data === msg) 68 resolve(); 69 } 70 )}); 71 }