Я делаю расширение для Android-браузера Firefox, и когда я его тестирую, он работает нормально, тогда, если я выключу firefox или не буду использовать его какое-то время, расширение не будет работать, если оно не будет повторно активировано. Дело в том, что меню добавленных элементов есть, но расширение не работает (предполагается, что некоторые свойства проверяются в документе страницы при загрузке или выборе, а затем отправляют запрос на мой localhost). Вы не знаете, почему это происходит?Почему мой firefox для расширения Android отключен самостоятельно?
Вот код, где я добавить пункты меню и слушателей:
function loadIntoWindow(window) {
if (!window)
return;
if (isNativeUI()) {
//adding the items to the menu
icoUrl = gAddonData.resourceURI.spec + "iconMenu.png"; //the icon uri
var tabAddr=gAddonData.resourceURI.spec+"/content/t.html"; // the uri of a page about the extension
//the item opens the page and displays a toast
menuIdInfo = window.NativeWindow.menu.add("About TrackDetect",icoUrl, function({
window.BrowserApp.addTab(tabAddr);
showToast(window); });
// This menu item shows the details collected about the docHTML of currently visited page, these details are brought by the listeners ("TabSelect" and "pageshow")
gDoorhangerMenuId = window.NativeWindow.menu.add("Show details ", icoUrl,
function(){ //doc is global variable
if (doc==null) {window.NativeWindow.toast.show("Please REACTIVATE TrackDetect extension.", "long");}
else {showDoorhanger(window, trackersSum);}});
}
//adding the listeners
window.BrowserApp.deck.addEventListener("TabSelect", function(){ watchTab(window);}, false);
let addListener = function() {
window.BrowserApp.deck.addEventListener("pageshow", function(){ watchTab(window);}, false);
window.NativeWindow.toast.show("Starting to detect trackers.", "long");
};
if(window.BrowserApp.deck) {
// BrowserApp.deck has been initialized
addListener();
}
else {
// use the chrome window to wait for BrowserApp to initialize
window.addEventListener("UIReady", addListener);
}
}
На самом деле ошибка, что я получаю:
Error: "TypeError: window.BrowserApp.deck is null"
и мне нужно, чтобы добавить window.BrowserApp.deck событие Слушатели, как показано в приведенном выше коде. Затем я вызываю метод в запуске:
var windowListener = {
onOpenWindow: function(aWindow) {
// Wait for the window to finish loading
let domWindow = aWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
domWindow.addEventListener("load", function() {
domWindow.removeEventListener("load", arguments.callee, false);
loadIntoWindow(domWindow);
}, false);
},
onCloseWindow: function(aWindow) {
},
onWindowTitleChange: function(aWindow, aTitle) {
}
};
function startup(aData, aReason) {
gAddonData = aData;
setDefaultPrefs();
// Load into any existing windows
let windows = Services.wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
loadIntoWindow(domWindow);
}
Services.scriptloader.loadSubScript(aData.resourceURI.spec + "content/scanner.js", TrackScanner);
Services.scriptloader.loadSubScript(aData.resourceURI.spec + "content/storageReq.js", TrackReq);
Services.wm.addListener(windowListener);
obs.addObserver(httpRequestObserver, "http-on-modify-request", false);
obs.addObserver(httpResponseObserver, "http-on-examine-response", false);
try {
alertsService.showAlertNotification(gAddonData.resourceURI.spec+"skin/oeil1.png",
"TrackDetect activated", "Detecting web Tracking.",
false, "", null, "");
} catch (e) {
// if the extension fail to start
alertsService.showAlertNotification("",
"Please REACTIVATE Trackdetet", "Please REACTIVATE Trackdetet.",
false, "", null, "");
}
if (aReason== ADDON_INSTALL) {
//some code to set a cookie
}
if ((aReason== APP_STARTUP)||(aReason== ADDON_ENABLE)||(aReason== ADDON_UPGRADE)) {
//some code to get a cookie
}
}
Тогда в завершении работы:
function shutdown(aData, aReason) {
if ((aReason == APP_SHUTDOWN) || (aReason == ADDON_DISABLE) || (aReason == ADDON_DOWNGRADE) || (aReason == ADDON_UNINSTALL))
{ // code to make sure that the cookie I set is there
}
//cleaning up (removing observers and the window listener)
// Stop listening for new windows
Services.wm.removeListener(windowListener);
obs.addObserver(httpRequestObserver, "http-on-modify-request", false);
obs.removeObserver(httpResponseObserver, "http-on-examine-response", false);
// Unload from any existing windows
let windows = Services.wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
unloadFromWindow(domWindow);
}
}
Я надеюсь, что теперь, вы можете помочь мне больше, потому что я не знаю, почему окно. BrowserApp.deck становится null, когда я закрываю браузер или не использую его некоторое время. Спасибо.
Без кода и более подробной информации нет возможности ответить на этот вопрос, не задав волшебный шарик 8 ... Пожалуйста, внесите изменения в свой вопрос. – nmaier
Вышеуказанная функция будет вызвана функцией запуска в bootstrap.js расширения. Надеюсь, поможет. – user2102196
Недостаточно. Вопросы, связанные с проблемами с написанным кодом, должны описывать конкретную проблему - и включать действительный код для ее воспроизведения - в самом вопросе. См. Http://sscce.org/ для руководства. Есть ли ошибка в консоли. – nmaier