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