Impossible de passer des arguments à chrome.declarativeContent.SetIcon

J'essaie de développer une extension chrome simple. Il existe une icône par défaut d'une page qui doit apparaître sur les pages avec une URL spécifique ( http://www.example.com/* ).

Il y a deux fichiers

manifest.json

 { "manifest_version": 2, "name": "name", "description": "description", "version": "1.0", "background": { "scripts": [ "background.js" ], "persistent": false }, "page_action": { "default_icon" : "images/icons/19.png" }, "permissions": [ "declarativeContent" ] } 

background.js

 chrome.runtime.onInstalled.addListener(function () { chrome.declarativeContent.onPageChanged.removeRules(undefined, function () { chrome.declarativeContent.onPageChanged.addRules([ { // rule1 conditions : [ new chrome.declarativeContent.PageStateMatcher({ pageUrl : {urlPrefix : 'http://www.example.com/'} }) ], actions : [ new chrome.declarativeContent.ShowPageAction() ] }, { // rule2 conditions : [ new chrome.declarativeContent.PageStateMatcher({ pageUrl : {queryContains : 'q1=green'} }) ], actions : [ new chrome.declarativeContent.SetIcon({ path : {"19" : "images/icons/green.png"} }) ] } ]); }); }); 

rule1 devrait montrer que l'icône et la rule2 changent l'icône en version verte sur les pages avec une URL qui ressemble à http://www.example.com/?q1=green

Mais lors de l'installation de l'extension, les choses viennent à:

 Error in response to events.removeRules: Error: Invalid value for argument 1. Property '.0': Value does not match any valid type choices. 

J'ai creusé profondément dans cette erreur, et il semble que la documentation ne reflète pas bien le fait que l'utilisation du paramètre path n'est pas implémentée. C'est certainement un bug, suivi ici .

Pour l'instant, pour réparer cela, vous devez charger l'image et la convertir au format ImageData avant d'appeler SetIcon .

 // Takes a local path to intended 19x19 icon // and passes a correct SetIcon action to the callback function createSetIconAction(path, callback) { var canvas = document.createElement("canvas"); var ctx = canvas.getContext("2d"); var image = new Image(); image.onload = function() { ctx.drawImage(image,0,0,19,19); var imageData = ctx.getImageData(0,0,19,19); var action = new chrome.declarativeContent.SetIcon({imageData: imageData}); callback(action); } image.src = chrome.runtime.getURL(path); } chrome.declarativeContent.onPageChanged.removeRules(undefined, function () { createSetIconAction("images/icons/green.png", function(setIconAction) { chrome.declarativeContent.onPageChanged.addRules([ /* rule1, */ { conditions : [ new chrome.declarativeContent.PageStateMatcher({ pageUrl : {queryContains : 'q1=green'} }) ], actions : [ setIconAction ] } ]); }); }); 

Si nécessaire, cela peut être généralisé pour prendre en charge l'icône haute-DPI (19 + 38):

 function createSetIconAction(path19, path38, callback) { var canvas = document.createElement("canvas"); var ctx = canvas.getContext("2d"); var image19 = new Image(); image19.onload = function() { ctx.drawImage(image,0,0,19,19); var imageData19 = ctx.getImageData(0,0,19,19); var image38 = new Image(); image38.onload = function() { ctx.drawImage(image,0,0,38,38); var imageData38 = ctx.getImageData(0,0,38,38); var action = new chrome.declarativeContent.SetIcon({ imageData: {19: imageData19, 38: imageData38} }); callback(action); } image38.src = chrome.runtime.getURL(path38); } image19.src = chrome.runtime.getURL(path19); }