В идеале это то, что должно обрабатываться API расширений, поэтому, пожалуйста, отметьте crbug / 1031791 . Между тем мы можем использовать обходные пути, перечисленные ниже.
Simplisti c Подход заключается в очистке window.onbeforeunload
Работает только для некоторых сайтов.
Сценарий расширения (всплывающее окно или фон):
function clearUnloadPrompt() {
return new Promise(resolve => {
chrome.tabs.executeScript({
code: `(${() => {
const script = document.createElement('script');
script.textContent = 'window.onbeforeunload = null';
document.documentElement.appendChild(script).remove();
}})()`,
runAt: 'document_start',
}, () => {
chrome.runtime.lastError;
resolve();
});
});
}
clearUnloadPrompt().then(() => {
chrome.tabs.update({url: 'https://www.example.org/'});
});
Полный подход exterminatus заключается в регистрации beforeunload
до того, как страница выполняет
Должно работать везде, но недостатком является то, что для всех URL-адресов требуется скрипт содержимого, для которого вашему расширению необходимо обновить URL-адрес. Хотя это не проблема, если вы уже запрашиваете эти разрешения хоста в манифесте. json для основной функциональности вашего расширения.
манифест. json выдержка:
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["content.js"],
"run_at": "document_start"
}],
(не забудьте использовать шаблоны URL, которые вам действительно нужны, вместо <all_urls>
)
содержимого. js:
const pageEventId = chrome.runtime.id + Math.random;
runInPage(suppressor, pageEventId);
chrome.runtime.onMessage.addListener(msg => {
if (msg === 'suppressBeforeUnload') {
window.dispatchEvent(new Event(pageEventId));
}
});
function runInPage(fn, ...args) {
const script = document.createElement('script');
script.textContent = `(${fn})(${JSON.stringify(args).slice(1, -1)})`;
document.documentElement.appendChild(script);
script.remove();
}
function suppressor(pageEventId) {
let suppressBeforeUnload;
window.addEventListener(pageEventId, () => {
window.onbeforeunload = null;
suppressBeforeUnload = true;
});
window.addEventListener('beforeunload', e => {
if (suppressBeforeUnload) {
e.stopImmediatePropagation();
}
});
}
сценарий расширения (всплывающее окно или фон):
chrome.tabs.sendMessage(tab.id, 'suppressBeforeUnload', () => {
chrome.runtime.lastError;
chrome.tabs.update({url: 'https://www.example.org/'});
});