The original goal here is to remove the warning of the google page speed but it actually is really better to use 'pagehide' as it is fired more reliably than the 'unload' event and does not prevent Chrome and Firefox to use the bfcache (browser optimization that enables instant back and forward navigation). The persisted property of the pagehide event is checked before disconnecting from the worker. As for the presence/multi_tab case, it was chosen to also consider page freezing as it seems more accurate that what was done before (the main tab could be throttled/frozen which was an issue). Some resources to explain why this is better: - https://web.dev/bfcache/#never-use-the-unload-event - https://developer.mozilla.org/en-US/docs/Web/API/Window/pagehide_event closes odoo/odoo#101309 X-original-commit: e043891d5074ca04ee1bbed421ae5efe5f2f8b88 Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com> Co-authored-by: qsm-odoo <qsm@odoo.com>
108 lines
4.1 KiB
JavaScript
108 lines
4.1 KiB
JavaScript
/** @odoo-module **/
|
|
|
|
import { multiTabService } from '../src/multi_tab_service';
|
|
|
|
import { browser } from '@web/core/browser/browser';
|
|
import { registry } from '@web/core/registry';
|
|
import { makeTestEnv } from '@web/../tests/helpers/mock_env';
|
|
import { patchWithCleanup, nextTick } from '@web/../tests/helpers/utils';
|
|
|
|
QUnit.module('bus', function () {
|
|
QUnit.module('multi_tab_service_tests.js');
|
|
|
|
QUnit.test('multi tab service elects new master on pagehide', async function (assert) {
|
|
assert.expect(5);
|
|
|
|
registry.category('services').add('multi_tab', multiTabService);
|
|
|
|
const firstTabEnv = await makeTestEnv();
|
|
assert.ok(firstTabEnv.services['multi_tab'].isOnMainTab(), 'only tab should be the main one');
|
|
|
|
// prevent second tab from receiving pagehide event.
|
|
patchWithCleanup(browser, {
|
|
addEventListener(eventName, callback) {
|
|
if (eventName === 'pagehide') {
|
|
return;
|
|
}
|
|
this._super(eventName, callback);
|
|
},
|
|
});
|
|
const secondTabEnv = await makeTestEnv();
|
|
firstTabEnv.services["multi_tab"].bus.addEventListener("no_longer_main_tab", () =>
|
|
assert.step("tab1 no_longer_main_tab")
|
|
);
|
|
secondTabEnv.services["multi_tab"].bus.addEventListener("no_longer_main_tab", () =>
|
|
assert.step("tab2 no_longer_main_tab")
|
|
);
|
|
window.dispatchEvent(new Event('pagehide'));
|
|
|
|
// Let the multi tab elect a new main.
|
|
await nextTick();
|
|
assert.notOk(firstTabEnv.services['multi_tab'].isOnMainTab());
|
|
assert.ok(secondTabEnv.services['multi_tab'].isOnMainTab());
|
|
assert.verifySteps(['tab1 no_longer_main_tab']);
|
|
});
|
|
|
|
QUnit.test('multi tab allow to share values between tabs', async function (assert) {
|
|
assert.expect(3);
|
|
|
|
registry.category('services').add('multi_tab', multiTabService);
|
|
|
|
const firstTabEnv = await makeTestEnv();
|
|
const secondTabEnv = await makeTestEnv();
|
|
|
|
firstTabEnv.services['multi_tab'].setSharedValue('foo', 1);
|
|
assert.deepEqual(secondTabEnv.services['multi_tab'].getSharedValue('foo'), 1);
|
|
firstTabEnv.services['multi_tab'].setSharedValue('foo', 2);
|
|
assert.deepEqual(secondTabEnv.services['multi_tab'].getSharedValue('foo'), 2);
|
|
|
|
firstTabEnv.services['multi_tab'].removeSharedValue('foo');
|
|
assert.notOk(secondTabEnv.services['multi_tab'].getSharedValue('foo'));
|
|
});
|
|
|
|
QUnit.test('multi tab triggers shared_value_updated', async function (assert) {
|
|
assert.expect(4);
|
|
|
|
registry.category('services').add('multi_tab', multiTabService);
|
|
|
|
const firstTabEnv = await makeTestEnv();
|
|
const secondTabEnv = await makeTestEnv();
|
|
|
|
secondTabEnv.services['multi_tab'].bus.addEventListener('shared_value_updated', ({ detail }) => {
|
|
assert.step(`${detail.key} - ${JSON.parse(detail.newValue)}`);
|
|
});
|
|
firstTabEnv.services['multi_tab'].setSharedValue('foo', 'bar');
|
|
firstTabEnv.services['multi_tab'].setSharedValue('foo', 'foo');
|
|
firstTabEnv.services['multi_tab'].removeSharedValue('foo');
|
|
|
|
await nextTick();
|
|
assert.verifySteps([
|
|
'foo - bar',
|
|
'foo - foo',
|
|
'foo - null',
|
|
]);
|
|
});
|
|
|
|
QUnit.test('multi tab triggers become_master', async function (assert) {
|
|
registry.category('services').add('multi_tab', multiTabService);
|
|
|
|
await makeTestEnv();
|
|
// prevent second tab from receiving pagehide event.
|
|
patchWithCleanup(browser, {
|
|
addEventListener(eventName, callback) {
|
|
if (eventName === 'pagehide') {
|
|
return;
|
|
}
|
|
this._super(eventName, callback);
|
|
},
|
|
});
|
|
const secondTabEnv = await makeTestEnv();
|
|
secondTabEnv.services['multi_tab'].bus.addEventListener('become_main_tab', () => assert.step('become_main_tab'));
|
|
window.dispatchEvent(new Event('pagehide'));
|
|
|
|
// Let the multi tab elect a new main.
|
|
await nextTick();
|
|
assert.verifySteps(['become_main_tab']);
|
|
});
|
|
});
|