Как убрать всплывающее окно «покинуть сайт» при обновлении URL текущей активной страницы в расширении chrome - PullRequest
0 голосов
/ 02 марта 2020

Я разрабатываю расширение chrome для календаря Google. После события мне нужно перейти к определенному URL-адресу. Поэтому я использую chrome .tabs.update (tabId, {url: 'myurl'}) для обновления URL-адреса текущей страницы. Но при обновлении URL, оставьте сайт всплывающим, который по умолчанию открывается для браузера. Пожалуйста, предложите способ удалить его при обновлении URL в chrome расширение

1 Ответ

0 голосов
/ 02 марта 2020

В идеале это то, что должно обрабатываться 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/'});
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...