2011-01-07 3 views
1

Je tente de remplacer la fonctionnalité par défaut pour webkitNotifications.createNotification et via une extension Chrome, je suis capable d'injecter un script dans les pages DOM qui le fait. Le problème que je rencontre maintenant est que j'ai besoin d'accéder aux pages à partir des pages DOM afin de pousser ma demande vers le NPAPI que j'ai intégré dans la page d'arrière-plan. J'avais précédemment l'objet incorporé rendu sur chaque page pendant l'exécution du script de contenu - mais je crois qu'il est plus efficace (et sûr) si le NPAPI est incorporé dans l'extension non injectée sur chaque page.Accès NPAPI à partir des pages DOM

if (window.webkitNotifications) 
{ 
    (function() 
    { 
     window.webkitNotifications.originalCreateNotification = window.webkitNotifications.createNotification; 
     window.webkitNotifications.createNotification = function (iconUrl, title, body) { 
      var n = window.webkitNotifications.originalCreateNotification(iconUrl, title, body); 
      n.original_show = n.show; 
      n.show = function() 
      { 
       console.log("Chrome object", chrome); 
       console.log("Chrome.extension object", chrome.extension); 
       chrome.extension.sendRequest({'title' : title, 'body' : body, 'icon' : iconUrl}); 
      } 
      return n; 
     } 
    })(); 
} 

C'est ce qui est injecté dans le DOM en tant qu'élément de script. La page de fond est la suivante:

<embed type="application/x-npapiplugz" id="plugz"> 
<script> 
var osd = document.getElementById('plugz'); 

function processReq(req, sender, callback) 
{ 
    osd.notify(req.title, req.body, req.image); 

    console.log("NOTIFY!", req.title, req.body, req.image); 
}; 

chrome.extension.onRequest.addListener(processReq); 
</script> 

Répondre

1

Une fois que votre extension comprend un plugin NPAPI, il est plus sûr :) Mais votre correcte, au lieu de permettre à chaque page ont accès au plug-in, il est préférable de laisser votre extension l'a. Je suppose que vous connaissez la propriété "public" qui spécifie si votre plugin peut être consulté par des pages Web normales, la valeur par défaut est false. Ci-dessous, je vais vous expliquer quel est votre problème, ce n'est pas un accès NPAPI à partir de pages DOM problème, c'est essentiellement pourquoi vos notifications ne peuvent pas accéder à votre script de contenu ou des pages d'extension.

Comme vous l'avez remarqué, l'accès aux scripts de contenu et aux pages DOM sont isolés les uns des autres. La seule chose qu'ils partagent est le DOM. Si vous souhaitez que vos notifications soient écrasées pour communiquer avec votre script de contenu, vous devez le faire dans un DOM partagé. Cela est expliqué dans Communication with the embedding page dans la documentation Scripts de contenu.

Vous pouvez faire le chemin de l'événement, où votre script de contenu écoute sur cet événement pour les données provenant de votre DOM, quelque chose comme ce qui suit:

var exportEvent = document.createEvent('Event'); 
exportEvent.initEvent('notificationCallback', true, true); 
window.webkitNotifications.createNotification = function (iconUrl, title, body) { 
    var n = window.webkitNotifications.createNotification(iconUrl, title, body); 
    n.show = function() { 
    var data = JSON.stringify({title: title, body: body, icon: iconUrl}); 
    document.getElementById('transfer-dom-area').innerText = data; 
    window.dispatchEvent(exportEvent); 
    }; 
    return n; 
} 
window.webkitNotifications.createHTMLNotification = function (url) { 
    var n = window.webkitNotifications.createHTMLNotification(url); 
    n.show = function() { 
    var data = JSON.stringify({'url' : url}); 
    document.getElementById('transfer-dom-area').innerText = data; 
    window.dispatchEvent(exportEvent); 
    }; 
    return n; 
}; 

Ensuite, votre écouteur d'événement peut envoyer que sur la page d'arrière-plan :

// Listen for that notification callback from your content script. 
window.addEventListener('notificationCallback', function(e) { 
    var transferObject = JSON.parse(transferDOM.innerText); 
    chrome.extension.sendRequest({NotificationCallback: transferObject}); 
}); 

J'ai ajouté que à mon point essentiel sur GitHub pour toute l'étendue (https://gist.github.com/771033), Dans votre page d'arrière-plan, vous pouvez appeler votre plugin NPAPI.

J'espère que vous dépanne, je sens une belle idée de ce :)

+0

j'ai pu obtenir de l'aide de ce gars vraiment génial sur elle. Cependant, c'est essentiellement comment cela a été accompli. Merci pour votre temps! [Chromify-osd] (http://launchpad.net/chromify-osd) –

+0

Je viens de regarder votre code, il semble que vous intégrez le plugin dans chaque page. Ne serait-il pas plus agréable si votre page d'arrière-plan était le seul plugin intégré et que les autres pages n'envoyaient que des requêtes? Une autre chose que j'ai vu, vous n'utilisez pas le support NPAPI dans les extensions. Si vous avez inclus le plugin dans l'extension, via le manifeste, le plugin sera automatiquement enregistré dans le navigateur. La dernière chose, vous avez inclus des "notifications" comme une autorisation dans votre manifeste, vous n'avez pas besoin de cela, votre remplaçant les notifications de pages (scripts de contenu). Cela semble bon :) –

Questions connexes