2017-09-15 4 views
0

J'essaye de faire une extension qui nécessite de sauvegarder du texte (URL). Le réglage des données semble correct, mais essayer de récupérer les données est le problème.chrome.storage.local.get ne pas obtenir de données

Le manifeste d'extension comporte à la fois le JavaScript contextuel et le contenu JavaScript dans la zone des scripts de contenu.

{ 
    "manifest_version": 2, 
    "name": "Extension_Name", 
    "version": "0.0.1", 
    "browser_action": { 
     "default_title": "Extension_title", 
     "default_icon": "icon.png", 
     "default_popup": "popup.html" 
    }, 
    "permissions": ["storage"], 
    "content_scripts": [ 
     { 
      "matches": [ 
       "<all_urls>" 
      ], 
      "js": ["content.js","popup.js"] 
     } 
    ] 
} 

Les URL sont stockées dans la zone de stockage local Chrome:

var b = document.getElementById("l"); //l is a button 
b.onmouseup = function() { 
    var r = prompt("Please enter the website to add."); 
    var g = []; 
    chrome.storage.local.get("whitelist", function (i) { 
     if (i['whitelist'] !== undefined) { 
      var g = i['whitelist']; 
     } 
    }); 
    g.push(r); 
    chrome.storage.local.set({ 
     "whitelist": g 
    }, function() { 
     console.log("done") 
    }); 
} 

Cela semble fonctionner, et je peux saisir manuellement la fonction get pour les données. Cependant, je ne peux pas trouver un moyen pour les données à utiliser dans le content.js

//getting website whitelist 
d = null; 
var inw = false; 
chrome.storage.local.get("whitelist", function (p) { 
    d = p['whitelist']; 
}); //why doesnt this work??? 
console.log(d); //testing (returns null in the console...) 
for (var j in d) { //this script doesnt run because d is not set to an array 
    alert(window.location.host.replace(/\./g, "")); 
    if (d[j].replace(/\./g, "").replace(/:\/\//g, ".") 
           .split(".")[1] === window.location.host.replace(/\./g, "")) { 
     inw = true; 
     alert("true"); 
    } 
} 
+2

related: [Comment renvoyer la réponse d'un appel asynchrone?] (Https://stackoverflow.com/q/14220321) – Makyen

Répondre

0

Je vois quelques problèmes possibles:

Dans votre deuxième extrait, le var g = i['whitelist'] est déclaré dans un nouveau champ d'application plus étroite , et l'original g n'est pas utilisé. En outre, le g dans g.push(r) est toujours [], car il est exécuté avant que chrome.storage.local.get() appelle sa fonction de rappel avec la liste blanche existante à utiliser.

// edited version 
var g = []; 
chrome.storage.local.get("whitelist", function(i) { 
    if (i['whitelist'] !== undefined) { 
     g = i['whitelist']; 
    } 
    g.push(r); 
    chrome.storage.local.set({"whitelist": g}, function(){console.log("done")}); 
}); 

Dans le troisième extrait, vous n'utilisez pas la valeur retournée dans le rappel, et votre console.log(d) est nulle parce qu'elle est en cours d'exécution avant d est modifié par le rappel.

// edited version 
chrome.storage.local.get("whitelist", function(p) { 
    d = p['whitelist']; 
    console.log(d); 
    for (var j in d) ... 
});