2016-08-28 1 views
0

Ich fange an zu lernen, Erweiterung in Chrome zu debuggen. Ich habe dieses Problem in Chrome, aber in Firefox Webextensions gibt es kein Problem. Das Problem ist, dass ich in Chrome nicht die Daten erhalten kann, die im Speicher gespeichert wurden.Warum kann storage.set/storage.get Daten in Chrome nicht festlegen/abrufen?

Ich habe diese Funktion im Hintergrund Skript. Ich füge einen Haltepunkt zur Zeile mit storage.set hinzu. Ich starte Addon neu und ich kann auf alle Daten in MyNamespace.data zugreifen ... Das Addon gibt die Benachrichtigung aus, dass die Installation erfolgreich war, aber das Protokoll zeigt ein leeres Objekt, wenn ich versuche Daten zu bekommen.

MyNamespace.checkIfExists = function (item) { 
    if (chrome.runtime.lastError) { 
    MyNamespace.notify("check-fail"); 
    console.log("error:" + chrome.runtime.lastError); 
    console.log(chrome.runtime.lastError); 
    } else { 
    if (! ("initiated" in item)) 
     { 
     console.log("I'm initiating .. item:"); 
     console.log(item); 
     /* Insert new data object */ 
     /* This saves default values into storage */  
     chrome.storage.local.set({ 
     easy:  MyNamespace.data.easy, 
     advanced: MyNamespace.data.advanced, 
     images: MyNamespace.data.images, 
     inspector:MyNamespace.data.inspector, 
     extractor:MyNamespace.data.extractor, 
     profiles: MyNamespace.data.profiles, 
     default_profiles: MyNamespace.data.default_profiles   
     }, 
     () => { 
      if (chrome.runtime.lastError) 
      { 
      MyNamespace.notify("write-fail");    
      console.log("local.set Error: " + chrome.runtime.lastError); } 
      else 
      {       
      MyNamespace.notify("write-succeess"); 
      chrome.storage.local.get({initiated: undefined, easy:undefined}, 
       (result) => { 
       if (typeof result === undefined) 
        MyNamespace.notify("write-fail"); 
       console.log("found:"); 
       console.log(result); 
       console.log("/end"); 
       } 
      ) 
      chrome.storage.local.set({initiated:true});    
      MyNamespace.initiated = true; 
      } 
     }); 
     } 
    else 
     MyNamespace.initiated = true; 
    } 
}; 

Ergebnis in der Konsole:

I'm initiating .. item: 
namespace.js:125 Object {} 
namespace.js:149 found: 
namespace.js:150 Object {} 
namespace.js:151 /end 

kein Fehler in der Konsole. In Chrome ist das Objekt leer. In Firefox sehe ich ein Objekt gespeichert werden, eine Eigenschaft zu undefiniert.

manifest.json

{ 
    "applications": { 
    "gecko": { 
    "id": "[email protected]", 
    "strict_min_version": "48.0a1" 
    } 
    }, 
"description": "An example options ui", 
"homepage_url": "https://github.com/mdn/webextensions-examples/tree/master/favourite-colour", 
"manifest_version": 2, 
"name": "Favourite colour", 
"version": "1.0", 
"icons": { 
    "48": "icons/eye-icon-colored-48.png"  
}, 
"options_ui": { 
    "page": "options.html", 
    "open_in_tab": true 
    }, 
"browser_action": { 
    "default_title": "Adapt page", 
    "browser_style": true, 
    "default_popup": "popup/settings.html", 
    "default_icon": { 
    "48": "icons/eye-icon-48.png" 
    } 
}, 
"web_accessible_resources": [ 
    "icons/hotkeys-icon-32.png" 
    ], 
"permissions": ["storage", "tabs", "activeTab", "notifications"], 
"background": { 
    "page": "background_scripts/background_scripts_bug_fix.html" 
}, 
"content_scripts": [ 
    { 
    "matches": ["<all_urls>" ], 
    "run_at": "document_start", 
    "js": [ 
     "content_scripts/jquery-3.0.0.js", 
     "content_scripts/namespace.js", 
     "content_scripts/easy.js", 
     "content_scripts/addListeners.js" 
     ] 
    } 
    ], 
"commands": { 
    "easy": { 
    "suggested_key": { 
     "default": "Ctrl+Shift+U"  
    }, 
    "description": "" 
    } 
} 
} 

ich diesen Hörer hinzugefügt haben, die entlassen werden, wenn die Speicherdaten gespeichert werden:

chrome.storage.onChanged.addListener(function(changes, namespace) { 
    for (key in changes) { 
    var storageChange = changes[key]; 
    console.log('Storage key "%s" in namespace "%s" changed. ' + 
       'Old value was "%s", new value is "%s".', 
       key, 
       namespace, 
       storageChange.oldValue, 
       storageChange.newValue); 
    } 
}); 

Und ich habe dieses Protokoll:

namespace.js:241 Storage key "default_profiles" in namespace "local" changed. Old value was "Object", new value is "undefined". 
    namespace.js:241 Storage key "easy" in namespace "local" changed. Old value was "Object", new value is "undefined". 
    namespace.js:241 Storage key "extractor" in namespace "local" changed. Old value was "Object", new value is "undefined". 
    namespace.js:241 Storage key "images" in namespace "local" changed. Old value was "Object", new value is "undefined". 
    namespace.js:241 Storage key "initiated" in namespace "local" changed. Old value was "true", new value is "undefined". 
    namespace.js:241 Storage key "inspector" in namespace "local" changed. Old value was "Object", new value is "undefined". 
    namespace.js:241 Storage key "profiles" in namespace "local" changed. Old value was "Object", new value is "undefined". 
    namespace.js:124 I'm initiating .. item: 
    namespace.js:125 Object {} 
    namespace.js:241 Storage key "advanced" in namespace "local" changed. Old value was "undefined", new value is "Object". 
    namespace.js:241 Storage key "default_profiles" in namespace "local" changed. Old value was "undefined", new value is "Object". 
    namespace.js:241 Storage key "easy" in namespace "local" changed. Old value was "undefined", new value is "Object". 
    namespace.js:241 Storage key "extractor" in namespace "local" changed. Old value was "undefined", new value is "Object". 
    namespace.js:241 Storage key "images" in namespace "local" changed. Old value was "undefined", new value is "Object". 
    namespace.js:241 Storage key "inspector" in namespace "local" changed. Old value was "undefined", new value is "Object". 
    namespace.js:241 Storage key "profiles" in namespace "local" changed. Old value was "undefined", new value is "Object". 
    namespace.js:152 found: 
    namespace.js:153 Object {} 
namespace.js:154 /end 
namespace.js:241 Storage key "initiated" in namespace "local" changed. Old value was "undefined", new value is "true". 

Was heißt das? Ich sehe Wort Object() in Chrome, weiße Buchstaben (Dark Theme), aber es ist nicht wie Link, wo ich klicken und das Objekt sehen konnte. Dies zeigt an, dass die Daten geladen sind. Aber wieso kann ich die Daten im Objekt nicht anschauen?

  1. ich nicht in die Callback-Schritt kann, so kann ich die Daten nicht sehen
  2. Ich sehe nicht, was in dem Objekt ist {} in Console .... es sieht aus wie es ist leer, aber in Zuhörer bekam ich Nachrichten Speicher wurde geändert.
  3. Ergebnis in storage.get Rückruf Ergebnis ist leer ... keine Eigenschaften enthält

ich es mit diesem Code überprüft haben: für (var Schlüssel in Folge) if (hasOwnProperty.call (Ergebnis Schlüssel)) console.log ("key:" + key);

In Chrome sind keine Eigenschaften aufgeführt, in Firefox Toolbox/Console sind sie aufgeführt.

Soweit ich den storage.set Callback verstehe, sollte es ausgelöst werden, nachdem die Änderungen gespeichert wurden und die db-Datei für den Schreibvorgang geschlossen ist. Also erwarte ich, dass es kein Problem in storage.get gefeuert von innerhalb von storage.set geben sollte

Kann jemand klären, was hier passiert? Warum in Firefox funktioniert das, aber in Chrome nicht? Wie behebe ich das Problem?

Antwort

1

chrome.storage.local.get ({initiiert: undefined, einfach: undefined},

Wird nichts bekommen, weil nur definierte Tasten abgerufen werden (1, 2) Zwischen stringification der Parameter mit Objekt: JSON.stringify({a:undefined,b:undefined}) produziert '{}' - es ist leer.

Statt eine Reihe von Schlüsselnamen verwenden, wenn Sie die Standardwerte nicht bieten:

chrome.storage.local.get(['initiated', 'easy'], 

P. S. Verwenden Sie %o oder %O in console.log format string, um den tatsächlichen Inhalt von Objekten anzuzeigen.

+0

Vielen Dank. Du hast mich gerettet. IDK warum ich es vorher nicht versucht habe. Ich habe eine Woche damit verbracht, dieses Problem zu lösen. – user1141649

Verwandte Themen