Pourquoi chrome.tabs.query () ne retourne-t-il pas l'URL de l'onglet lorsqu'il est appelé en utilisant RequireJS dans une extension Chrome?
J'ai une simple extension Chrome qui ajoute un navigateur d'action. Lorsque l'extension de la popup est ouvert, il doit accéder à l'onglet actuel de l'adresse URL. Comme il n'a pas besoin d'avoir accès à tous les onglets, je viens de le activeTab
autorisation spécifiée dans le manifeste:
{
"manifest_version": 2,
"name": "RequireJS Test",
"version": "0.0.1",
"description": "Test RequireJS and the activeTab permission.",
"permissions": [
"activeTab"
],
"browser_action": {
"default_popup": "popup.html"
},
"web_accessible_resources": [
"js/*",
"html/*",
"css/*",
"img/*"
]
}
En théorie, cela devrait vous donner la popup d'accès à l'onglet actif de l'URL, mais l'URL n'est pas retourné quand j'ai une requête à la liste des onglets au sein d'un require()
appel dans la fenêtre du main.js
fichier:
require([], function() {
chrome.tabs.query({"active": true, "lastFocusedWindow": true}, function (tabs) {
var url = tabs[0].url;
console.log("URL from main.js", url);
});
console.log("URL from global var accessed in main.js", tabURL);
});
La console affiche undefined
pour l'URL. Cependant, si je fais le même appel à partir d'une plaine .fichier js qui n'utilise pas require()
il fonctionne très bien:
chrome.tabs.query({"active": true, "lastFocusedWindow": true}, function (tabs) {
tabURL = tabs[0].url;
console.log("URL from get-url.js", tabURL);
});
Qui affiche l'URL est correcte, et je peux accéder qu'mondiale tabURL
à l'intérieur de la require()
appel de l'amende juste. Quand je clic droit-cliquez sur le bouton de navigation et d'inspecter le popup, la sortie de la console ressemble à ceci:
URL from get-url.js http://stackoverflow.com/questions/ask
URL from global var accessed in main.js http://stackoverflow.com/questions/ask
URL from main.js undefined
Encore plus étrange, c'est que j'ai parfois vu l'URL est disponible depuis cet appel à chrome.tabs.query()
à l'intérieur de la require()
appel. Mais surtout, il ne fonctionne pas. Quelque chose à propos de la façon dont RequireJS charge des scripts semble confondre Chrome et emporter l'URL d'accès pour le chargement du script. C'est en Chrome 40 sur Windows.
Évidemment, la solution de contournement est de saisir l'URL dans un script séparé et de le stocker dans une variable, mais qui se sent un peu encombrants. J'aimerais voir si il y a une bonne façon de faire ce travail avec RequireJS.
Le plein de plugin source est ici, si quelqu'un veut le tester sur leur machine: https://github.com/fwextensions/requirejs-url-test
Modifier
De Rob W. explique ci-dessous, cela n'a rien à voir avec RequireJS. La seule raison que le code dans mon get-url.js
fichier ci-dessus retourné la bonne URL est qu'il s'est passé à courir avant la devtools fenêtre ouverte. Si je modifie ce fichier:
setTimeout(function() {
chrome.tabs.query({"active": true, "lastFocusedWindow": true}, function (tabs) {
tabURL = tabs[0].url;
console.log("URL from get-url.js", tabURL);
});
}, 5000);
Puis il court après les devtools de fenêtre ouverte et échoue. RequireJS n'est pas le coupable.
source d'informationauteur jdunning
Vous devez vous connecter pour publier un commentaire.
Vous ne voyez pas une URL, car vous n'avez qu'à définir la
activeTab
autorisation (pas letabs
) l'autorisation ET la dernière fenêtre active est le développeur d'outils (pour lequel vous n'avez pasactiveTab
accès) (et depuis Chrome 41, devtools onglets/fenêtres sont invisibles pour les extensionsdonctabs
sera un tableau vide).La bonne nouvelle, c'est que ce problème est spécifique à la devtools fenêtre d'ouverture de votre page d'extension, de sorte que le problème ne se produit au cours du développement et non pas lors de l'utilisation réelle par les utilisateurs.
Extension popups sont associés à une fenêtre, de sorte que vous pouvez utiliser
chrome.tabs.query
aveccurrentWindow:true
pour obtenir la réponse correcte:À surmonter les devTools bug que Rob W. a rapporté dans son poste, à la suite de
getActiveTab
solution de contournement semble travailler pour moi (même lorsqu'il y a plusieurs devTools fenêtres ouvertes). Il fonctionne toujours à économie d'une référence à laactiveTabId
dans la page d'arrière-plan, chaque fois que letabs.onActivated
événement se déclenche.