Мониторинг history.pushstate из хромового расширения

Я разрабатываю расширение Chrome для настройки Facebook. Тем не менее, для просмотра веб-сайтов с поддержкой HTML5, таких как Facebook, требуется переопределение window.history.pushState, как описано в этом вопросе SO.

К сожалению, кажется, что Chrome изолированные миры предотвращают такое переопределение. Есть ли другой способ улавливания изменений истории (кроме опроса document.location.href)?

Ответ 1

Да,

Один из способов - создать тег script и поместить там свой код:

html = "window.history.pushState = function(a,b,c) { alert('Change !'); };";

var headID = document.getElementsByTagName("head")[0];         
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.innerHTML = html;
headID.appendChild(newScript);

Ответ 2

Не уверен, пытаетесь ли вы сделать это в background.js или content.js, но если это первый, вы можете сделать это с помощью событий webNavigation:

Вам нужно установить разрешения для webNavigation в manifest.json:

  "permissions": [
     "webNavigation"
  ],

Затем в background.js:

  chrome.webNavigation.onHistoryStateUpdated.addListener(function(details) {
        console.log('Page uses History API and we heard a pushSate/replaceState.');
        // do your thing
  });

Источник: Документы расширения Chrome для веб-навигации

Ответ 3

Чтобы продолжить действие по умолчанию, сохраните ссылку на исходную функцию pushState и затем вызовите ее:

var headID = document.getElementsByTagName("head")[0];         
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = chrome.extension.getURL('script.js');
headID.appendChild(newScript);

script.js

window.history.pushState = (function(nativePushState) {
    return function(a,b,c) {
        // Do something
        nativePushState.apply(this, arguments); //Continue by calling native history.pushState
    };
})(window.history.pushState)