Report unavailable lazy chunks without rejecting UI actions
This commit is contained in:
@@ -76,3 +76,10 @@ test('listening tracking does not pull in the lazy Stats view',()=>{
|
|||||||
assert.deepEqual(groups['feature:stats'].files,['/stats-core.js']);
|
assert.deepEqual(groups['feature:stats'].files,['/stats-core.js']);
|
||||||
assert.match(app,/Lazy\.proxy\('feature:stats-view', \['render'\], 'StatsView'\)/);
|
assert.match(app,/Lazy\.proxy\('feature:stats-view', \['render'\], 'StatsView'\)/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('an unavailable Stats chunk reports an error without rejecting the UI navigation',async()=>{
|
||||||
|
const source=app.match(/function renderStats\(\) \{[\s\S]*?\n\}/)?.[0];assert.ok(source);
|
||||||
|
const seen=[],context=require('node:vm').createContext({Lazy:{proxy:()=>({render:()=>Promise.reject(new Error('Unavailable fixture chunk'))})},toast:text=>seen.push(text)});
|
||||||
|
require('node:vm').runInContext(source+';globalThis.render=renderStats;',context);
|
||||||
|
await context.render();assert.deepEqual(seen,['Unavailable fixture chunk']);
|
||||||
|
});
|
||||||
|
|||||||
@@ -5181,7 +5181,7 @@ const StatsTrack = (() => {
|
|||||||
// Stats view
|
// Stats view
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
function renderStats() {
|
function renderStats() {
|
||||||
return Lazy.proxy('feature:stats-view', ['render'], 'StatsView').render();
|
return Lazy.proxy('feature:stats-view', ['render'], 'StatsView').render().catch(error => toast(error.message));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -7798,8 +7798,8 @@ document.querySelectorAll('.chip').forEach((c) => {
|
|||||||
$('sleepCurtain').addEventListener('click', () => $('sleepCurtain').classList.add('hidden'));
|
$('sleepCurtain').addEventListener('click', () => $('sleepCurtain').classList.add('hidden'));
|
||||||
$('sleepCancelBtn').addEventListener('click', () => { cancelSleepTimer(); toast('Sleep timer cancelled'); });
|
$('sleepCancelBtn').addEventListener('click', () => { cancelSleepTimer(); toast('Sleep timer cancelled'); });
|
||||||
$('transitionBtn').addEventListener('click', () => Transition.cycle());
|
$('transitionBtn').addEventListener('click', () => Transition.cycle());
|
||||||
$('shareMomentBtn').addEventListener('click', () => Share.open());
|
$('shareMomentBtn').addEventListener('click', () => Share.open().catch(error => toast(error.message)));
|
||||||
$('externalBtn').addEventListener('click', () => External.open());
|
$('externalBtn').addEventListener('click', () => External.open().catch(error => toast(error.message)));
|
||||||
$('pipBtn').addEventListener('click', () => PiP.toggle());
|
$('pipBtn').addEventListener('click', () => PiP.toggle());
|
||||||
$('eqBtn').addEventListener('click', () => EQ.open());
|
$('eqBtn').addEventListener('click', () => EQ.open());
|
||||||
|
|
||||||
@@ -9005,7 +9005,7 @@ async function boot() {
|
|||||||
syncOnLaunch();
|
syncOnLaunch();
|
||||||
startPlaylistInboxWatch();
|
startPlaylistInboxWatch();
|
||||||
if(LowerThird.active()) await Lazy.load('feature:lower-third');
|
if(LowerThird.active()) await Lazy.load('feature:lower-third');
|
||||||
await Presenter.boot();
|
await Presenter.boot().catch(error => toast(error.message));
|
||||||
if (LowerThird.active()) return;
|
if (LowerThird.active()) return;
|
||||||
SectionRail.boot();
|
SectionRail.boot();
|
||||||
if (isMediaId(new URLSearchParams(location.search).get('v'))) Share.bootFromUrl().catch(error => toast(error.message));
|
if (isMediaId(new URLSearchParams(location.search).get('v'))) Share.bootFromUrl().catch(error => toast(error.message));
|
||||||
|
|||||||
@@ -63,6 +63,10 @@ async function run(name){
|
|||||||
if(groups.includes('feature:stats-view')) {
|
if(groups.includes('feature:stats-view')) {
|
||||||
await page.evaluate(async()=>{view={type:'stats'};render();});await page.waitForSelector('.stats-empty');checked.push('stats');
|
await page.evaluate(async()=>{view={type:'stats'};render();});await page.waitForSelector('.stats-empty');checked.push('stats');
|
||||||
}
|
}
|
||||||
|
if(groups.includes('feature:share-external')) {
|
||||||
|
await page.evaluate(()=>{Share.open=()=>Promise.reject(new Error('Unavailable fixture chunk'));document.querySelector('#shareMomentBtn').click();});
|
||||||
|
await page.getByText('Unavailable fixture chunk',{exact:true}).waitFor();
|
||||||
|
}
|
||||||
assert.equal(proxy.getStats().requestCount,before,'all warmed seam code loads from SW without network');
|
assert.equal(proxy.getStats().requestCount,before,'all warmed seam code loads from SW without network');
|
||||||
// Ignore only verified disconnected version/recommendation API transports in WebKit.
|
// Ignore only verified disconnected version/recommendation API transports in WebKit.
|
||||||
const scriptErrors=errors.filter(e=>!(name==='webkit'&&(e==='TypeError: Load failed'||/\/api\/(?:recommendations\?[^\s]*|version)\.$/.test(e))));assert.deepEqual(scriptErrors,[]);
|
const scriptErrors=errors.filter(e=>!(name==='webkit'&&(e==='TypeError: Load failed'||/\/api\/(?:recommendations\?[^\s]*|version)\.$/.test(e))));assert.deepEqual(scriptErrors,[]);
|
||||||
|
|||||||
Reference in New Issue
Block a user