0

Mon extension doit utiliser les options de l'utilisateur pour créer des sous-menus dans l'entrée du menu contextuel de l'extension principale. Les options sont stockées dans une table, où chaque ligne définit un sous-menu. La table entière est stockée en tant que chaîne json dans chrome.local.storage avec la clé jsondata.Utilisation de données stockées pour définir des entrées de sous-menus

Le manifeste est:

"background": { 
    "persistent": true, 
    "scripts": [ "js/storage.js", "js/backgroundlib.js", "js/background.js" ] 
}, 
... 
"permissions": [ "storage", "contextMenus", "http://*/*", "https://*/*", "tabs", "clipboardRead", "clipboardWrite" ], 
... 

Dans le script d'arrière-plan, je suis en train d'obtenir les données à l'aide:

window.addEventListener('load', function() { 
var key = 'jsondata'; 

storage.area.get(key, function (items){ 
    console.log(items[key]); 
    build_submenu(items[key]);}); 
}); 

function build_submenu(json) { 
    console.log("build_submenu: " + json); 
} 

et build_submenu doit alors appeler plusieurs chrome.contextMenus.create({... }) pour ajouter les sous-menus. Pour l'instant, je ne peux pas appeler build_submenu. Est-ce que j'essaie de faire quelque chose qui n'est pas possible ou est-ce que je manque quelque chose d'évident?

Merci, F.

Répondre

0

Remplacer storage.area.get avec chrome.storage.local.get. Une autre suggestion serait de supprimer l'écouteur window.onload externe, puisque vous utilisez des scripts d'arrière-plan et window.onload n'a aucun sens.

+0

'storage.area' est défini dans js/storage.js à' chrome.storage.local' donc je dirais que ce n'est pas le problème ici – fraz

+0

@fraz, qu'est-ce que j'ai maintenant? Est-ce que 'console.log (items [key])' a sorti quelque chose? –

0

fait quelques progrès: dans background.js, j'accéder à la chaîne JSON dans le stockage avec

var key = 'jsondata'; 
var data; 
storage.area.get(key, function (items){ get_jsondata(items[key]);}); 

et la fonction de rappel construire l'entrée de menu et il est sous-menu.

function get_jsondata(value){ 
    console.log("get_jsondata " + value); 
    data = JSON.parse(value); 
var fcb =[ {fcb_context: "fcb_copy", title:"Copy filtered", context: ["selection", "link"]}, {fcb_context:"fcb_paste", context:["editable"], title:"Paste filtered"}]; 
for (var i=0; i<fcb.length; i++) { 
    var menu = fcb[i]; 
    chrome.contextMenus.create({ 
    title: menu.title, 
    id: menu.fcb_context, 
    contexts: menu.context, 
    }); 
    var last = data.length; 
    for (var j=0; j<last; j++){ 
     chrome.contextMenus.create({ 
      title: data[j].name, 
      contexts: menu.context, 
      parentId: menu.fcb_context, 
      onclick: function(info, tab){ run_cmd(data[j].regex, info, menu.fcb_context); } 
     }); 
    }// for j 
    } // for i 
}//get_jsondata 

function run_cmd(regex, info, fcb_context){ 
    var sel = info.selectionText; 
    console.log("run_cmd regex " + regex + " sel " + (sel ? sel : "")); 
} 

Maintenant, j'ai eu le problème que les données, bien défini comme une variable de haut niveau, semble être indéfini lorsque l'un des sous-menu est cliqué.

J'ai reçu le message d'erreur "ne peut pas lire regex propriété undefined"

+0

Je pense que vous êtes hors de portée ... essayez d'extraire des données [j] à l'intérieur de * chrome.contextMenus.create * comme une variable, puis utilisez cette variable comme argument passant dans la fonction ** run_cmd ** ... pour les données [j] .regex –

0

OK, j'ai finalement obtenu ce qui fonctionne: manifest.json

"background": { 
    "persistent": false, 
    "scripts": [ "js/storage.js", "js/backgroundlib.js", "js/background.js" ] 
    }, 

dans background.js, le menu contextuel est construit dans la fonction de rappel lors de la lecture du stockage. Cette lecture est appelée lorsque onInstalled est déclenché. J'utilise une var globale qui est sauvegardée sur Suspend et relance onStartup. et qui associe l'identifiant du sous-menu et la ligne correspondante de l'option de l'utilisateur. Le test d'écoute onClick si la variable globale est définie. Sinon, il est à nouveau lu depuis le stockage.

var regex = new Object(); 

chrome.runtime.onInstalled.addListener(function() {  
    console.log("onInstalled called"); 
    var key = 'jsondata'; 
    storage.area.get(key, function (items){ get_jsondata(items[key]);}); 
     function get_jsondata(value){ 
     var data = JSON.parse(value); 

     var fcb =[ {fcb_context: "fcb_copy", title:"Copy filtered", context: ["selection", "link"]}, {fcb_context:"fcb_paste", context:["editable"], title:"Paste filtered"}]; 
    for (var i=0; i<fcb.length; i++) { 
     var menu = fcb[i]; 
     chrome.contextMenus.create({ 
    //title: "Look up: %s", 
     title: menu.title, 
     id: menu.fcb_context, 
     contexts: menu.context, 

     }); 
     var last = data.length; 
    //var sel = info.selectionText; 
     for (var j=0; j<last; j++){ 
      chrome.contextMenus.create({ 
      title: data[j].name, 
      contexts: menu.context, 
      id: menu.fcb_context + "_" + j, 
      parentId: menu.fcb_context, 
        //onclick: function(info, tab){ run_cmd(data[j].regex, info, menu.fcb_context); } 
      }); 
      regex[ menu.fcb_context + "_" + j] = data[j]; 
      //console.log(regex[menu.fcb_context + "_" + j]); 
     }// for j 

    } // for i 
    }//get_jsondata 

}); //add listener 


chrome.contextMenus.onClicked.addListener(function(info, tabs){ 
       var id = info.menuItemId; 
       if (typeof regex === "undefined"){ 
        storage.area.get("regex", function(items){ 
         regex = JSON.parse(items["regex"]); 
         console.log("get " + items["regex"] + " from storage"); 
          run_cmd(regex, info); 
        }); 
       } else { 
        console.log("regex was defined... " + JSON.stringify(regex)); 
         run_cmd(regex, info); 
       } 
    }); 

chrome.runtime.onSuspend.addListener(function() { 
    // Do some simple clean-up tasks. 
    console.log("onSuspend called saving " + JSON.stringify(regex)); 
    storage.area.set({ "regex" : JSON.stringify(regex)}, function(){console.log("regex saved");}); 
}); 

chrome.runtime.onStartup.addListener(function() { 
    console.log("onStartup called"); 
    storage.area.get("regex", function(items){ 
     regex = JSON.parse(items["regex"]); 
     console.log("get " + items["regex"] + " from storage"); 
    }); 
}); 



function getSelectedText(info){ 
    var sel = info.selectionText; 
    chrome.tabs.executeScript(null, {file:"js/script.js"}); 
} 

function pasteFilteredText(info){ 
    chrome.tabs.executeScript(null, {file:"js/script.js"}); 
} 




function run_cmd(regex, info){ 
    var id = info.menuItemId; 
    var data = regex[id]; 

     var sel = info.selectionText; 
    var fcb_context = info.parentMenuItemId; 
    //console.log("run_cmd regex " + data.regex + " sel " + (sel ? sel : "")); 
    alert("run_cmd regex " + data.regex + " sel " + (sel ? sel : "") + " fcb_context: " + fcb_context); 

} 

Merci de me signaler ce qui est superflu ou manquant.