изменение pushState - эквивалент расширения Chrome onHistoryStateUpdated
Я портирую расширение Chrome на расширение Firefox, и из-за характера веб-сайта, на котором оно работает, мне нужно отслеживатьpushState
.
У Chrome Extensions есть удобный способ справиться с этим:chrome.webNavigation.onHistoryStateUpdated
, Я использую его в расширении Chrome следующим образом:
chrome.webNavigation.onHistoryStateUpdated.addListener(function(details) {
var tabUrl = details.url;
if (isTabUrlValid(tabUrl)) {
$.get(tabUrl, function(data) {
var videoUrl = $(data).find('meta[itemprop=contentURL]').prop('content');
videoUrl = validateUrl(videoUrl);
videoUrl5k = make5kUrl(videoUrl);
});
}
});
Мне нужно сделать то же самое для расширения Firefox, но я не нашел хороших ответов. Я попытался сделать ответ, упомянутый здесь:Как получать уведомления об изменениях истории через history.pushState?
(function(history) {
var pushState = history.pushState;
history.pushState = function(state) {
if (typeof history.onpushstate == "function") {
history.onpushstate({state: state});
}
var tabUrl = tabs.activeTab.url;
console.log("UPDATED TAB URL: " + tabUrl);
if (isTabUrlValid(tabUrl)) {
$.get(tabUrl, function(data) {
var videoUrl = $(data).find('meta[itemprop=contentURL]').prop('content');
videoUrl = validateUrl(videoUrl);
videoUrl5k = make5kUrl(videoUrl);
});
}
return pushState.apply(history, arguments);
};
})(window.history);
Проблема в том, что когда я делаюcfx run
жалуется чтоhistory/window is undefined
и, следовательно, никогда не обнаруживается. Я думаю, это связано с тем, что он находится в SDK, но я не знаю хорошего обходного пути.
Какие-нибудь мысли?
Edit: я посмотрел на ответ @ willma ниже, и я не думаю, что это будет работать для меня. Проблема в том, что URL обновляется черезpushState
а DOM нет ... Есть ли хороший способ повторить то, что я делаю в расширении Chrome?
Редактировать: вотpageMod
часть
pageMod.PageMod({
attachTo: 'top', // Don't attach to iFrames --> http://goo.gl/b6b1Iv
include: [URLs],
contentScriptFile: [data.url("jquery-2.1.1.min.js"),
data.url("csScript.js")],
onAttach: function(worker) {
worker.port.on('url', function(url) {
var videoUrl = validateUrl(url);
videoUrl5k = make5kUrl(videoUrl);
console.log("--5K URL--: " + videoUrl5k);
});
}
});