2010-12-16 114 views
3

Dans une extension Chrome, un script peut être inclus en tant que script de contenu ou script d'arrière-plan. La plupart des choses qu'il fait est la même chose, mais il y en a qui varient selon le contexte. La question est: comment un script peut-il dire dans quel contexte il est exécuté? Merci.Comment savoir si un script est exécuté en tant que script de contenu ou script d'arrière-plan?

+0

Si vous développez l'extension, vous pouvez sûrement charger le script dans le contexte préféré? –

+0

@Anon. Oui, je peux, mais comme je l'ai dit dans le sujet, j'ai besoin d'une implémentation différente selon la plate-forme et je ne veux pas casser mon code à cause de ces restrictions. –

+0

Je suis d'accord avec Anon. C'est quelque chose qui devrait être manipulé au moment du build/deploy, pour ainsi dire. Vous pouvez écrire un script de build pour déployer deux versions différentes selon les besoins. Vérification à l'exécution à chaque fois est très inefficace. –

Répondre

3

Eh bien, je réussi à travailler ce.

var scriptContext = function() { 
    try { 
     if (chrome.bookmarks) { 
      return "background"; 
     } 
     else { 
      return "content"; 
     } 
    } 
    catch (e) { 
     return "content"; 
    } 
} 

C'est parce qu'une exception serait levée si le script de contenu tente d'accéder au chrome * sauf pièces chrome.extension.

Référence: http://code.google.com/chrome/extensions/content_scripts.html

+0

cette approche a deux problèmes, l'un, il repose sur try catch qui est vraiment lent. deux, il existe trois contextes dans une extension de chrome; des pages d'extension, des scripts d'arrière-plan et des scripts de contenu. cela ne détecte que les états plutôt que les trois. –

3

Je pense que c'est une version assez robuste qui a travaillé dans mes tests initiaux et ne nécessite pas une prise d'essai plus lent, et il identifie au moins les trois contextes principaux d'une extension de chrome et devrait faites-vous savoir si vous êtes sur la page de base aussi bien.

av = {}; 
av.Env = { 
    isChromeExt: function(){ 
     return !!(window['chrome'] && window['chrome']['extension']) 
    }, 
    getContext: function(){ 
     var loc = window.location.href; 
     if(!!(window['chrome'] && window['chrome']['extension'])){ 
      if(/^chrome/.test(loc)){ 
       if(window == chrome.extension.getBackgroundPage()){ 
        return 'background'; 
       }else{ 
        return 'extension'; 
       } 
      }else if(/^https?/.test(loc)){ 
       return 'content'; 
      } 
     }else{ 
      return window.location.protocol.replace(':',''); 
     } 
    } 
};