2

Ich portiere eine Chrome-Erweiterung zu Firefox WebExtensions und ich suche nach einer Problemumgehung für chrome.declarativeContent.onPageChanged.Gibt es ein FF-Äquivalent zu chrome.declarativeContent.onPageChanged?

Meine FF-Webextension enthält eine Seitenaktion, die beim Navigieren auf bestimmten Websites angezeigt werden muss. Keines der Listener in der verfügbaren API scheint dies jedoch zuzulassen.

Insbesondere habe ich versucht:

chrome.runtime.onInstalled.addListener(onChange); 
chrome.tabs.onCreated.addListener(onChange); 
chrome.tabs.onActivated.addListener(onChange); 
chrome.tabs.onUpdated.addListener(onChange); 
chrome.webNavigation.onDOMContentLoaded(onChange); 
chrome.webNavigation.onCreatedNavigationTarget(onChange); 

Gibt es bekannte Abhilfen?

Antwort

2

Sie müssen die pageAction manuell anzeigen, da die deklarativeContent-API ist.

chrome.pageAction.show(tabId); 
chrome.pageAction.hide(tabId); 

Falls die Regeln für URL basieren die Umsetzung Farben ist recht einfach:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    if (changeInfo.url && changeInfo.status==='complete' && tab.url.match(/something/)) { 
     chrome.pageAction.show(tabId); 
    } else { 
     chrome.pageAction.hide(tabId); 
    } 
}); 

jedoch, falls es DOM-Element-basierten Sie eine content script verwenden müssen:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    if (changeInfo.url && changeInfo.status==='complete' && tab.url.match(/something/)) { 
     chrome.tabs.executeScript(tabId, { 
      code: 'document.querySelector(' + JSON.stringify(someSelector) + ')' 
     }, function(results) { 
      if (results[0]) { 
       chrome.pageAction.show(tabId); 
      } else { 
       chrome.pageAction.hide(tabId); 
      } 
     }); 
    } else { 
     chrome.pageAction.hide(tabId); 
    } 
}); 

Dies ist ein sehr vereinfachter Code. Es kann verbessert werden, um nach Elementen zu suchen, während eine Seite geladen wird.

+0

Im Falle eines Content-Skript basierten Ansatz 'onUpdated' Zuhörer möglicherweise nicht einmal benötigt. – Xan

+0

'chrome.tabs.onUpdated.addListener' funktioniert, wenn ich zu verschiedenen Seiten navigiere, aber nicht, wenn ich zuerst eine Registerkarte öffne. Wird meine Problemumgehung unten veröffentlichen! – ktouchie

+0

FYI: Ihr Code wird das Inhaltsskript auf den meisten Seiten mehrmals einfügen und ausführen. Das 'tabs.onUpdated' Ereignis wird oft mehrmals pro Seite mit' tab.status === 'complete' (ein Bug IMO) ausgelöst. Möglich: Suche nach 'changeInfo.url && changeInfo.status === 'complete''. Für einen detaillierteren Blick auf die verfügbaren Ereignisse siehe [changeInfo.status von [tabs.onUpdated.addListener] geht von undefined zu Complete, ohne jemals zum Laden zu gehen] (http://StackOverflow.com/a/39033812/3773011). Der Code in dieser Antwort kann helfen, die verfügbaren Ereignisse zu untersuchen und festzustellen, welche Kriterien für die Situation geeignet sind. – Makyen

-1

Die beste Äquivalent scheint so weit zu sein:

var target = "<all_urls>"; 
chrome.webRequest.onCompleted.addListener(onChange, {urls: [target]}); 

(onChange() enthält die aktuelle URL mit einem regex passend und dann chrome.pageAction.show(tabInfo.id);)

+2

Es wird auf alle Arten von Web-Anfragen, einschließlich Bilder und Skripte und Stile ausgelöst. Verwenden Sie die Filterung, um sie auf den Hauptrahmen zu beschränken: 'chrome.webRequest.onCompleted.addListener (onChange, {urls: [target], Typen: ['main_frame']};' – wOxxOm

Verwandte Themen