2014-06-27 88 views
0

我正在嘗試編寫一個允許用戶輕鬆登錄到內部網頁的Chrome擴展。該擴展將顯示一個包含預定義憑據的菜單,用戶可以從該菜單中選擇一個並立即將其登錄到相應的網頁中(想想書籤++)。chrome.storage.sync.get不返回完整的JS對象

作爲第一步,我想寫一個接受'名稱','網址','用戶名'和'密碼'信息的功能,並且使用chrome.storage.sync.set。用戶可以使用chrome.storage保存多組此類信息(例如,針對同一網站的不同用戶名)。我能夠成功地完成此操作,並且選項頁面也能夠列出所有保存的信息。目前,請忽略與客戶端密碼加密相關的安全問題。

這是我的manifest.json

{ 
    "name": "My Chrome Extension", 
    "version": "1.0", 
    "manifest_version": 2, 
    "description": "Easy login to My Webapp", 

    "browser_action": { 
     "default_icon": "images/Cloud16.png", 
     "default_popup": "html/popup.html" 
    }, 
    "options_page": "html/options.html", 
    "permissions": ["<all_urls>", "storage", "unlimitedStorage"]  
} 

這是保存處理程序選項頁(在options.js):

function saveHandler() { 
    var name = $("#name").val(), 
     url = $("#url").val(), 
     password = $("#password").val(), 
     key = Date.now() + "", //key based on currentTimeInMillis 
     obj = { 
      "id": key, 
      "name": name, 
      "url": url, 
      "password": password 
     }; 
    chrome.storage.sync.get('LOGIN_COLLECTION', function(items) { 
      //Create a new collection if not exists 
     if(items && !items['LOGIN_COLLECTION']) { 
      items['LOGIN_COLLECTION'] = {};   
     } 
     items['LOGIN_COLLECTION'][obj.id] = obj; 
     chrome.storage.sync.set(items, function() { 
      // Notify that we saved. 
      console.log('Settings saved'); 
      chrome.storage.sync.get('LOGIN_COLLECTION', function(data) {    
       console.dir(data); 
      }); 
     }); 
     $("#addUrlDialog").slideUp(); 
     loadExistingInfo(); //Read persisted data, and show. This works fine!! 
    }); 
} 

當工具欄上的圖標分機用戶點擊,我顯示一個彈出的html,它有一個腳本來獲取在選項頁面中保存的數據(使用chrome.storage.get)。在彈出來獲取數據的代碼如下所示:

chrome.storage.sync.get('LOGIN_COLLECTION', function(items) { 
    var container = $("#listContainer"), 
    data = items['LOGIN_COLLECTION']; 
    for(item in data) {   
     console.dir(item); //**Outputs empty object** 
     $("<div></div>").text(item.name).appendTo(container); 
    } 
}); 

Screenshot of the js console for popup page

正如你所看到的,抓取是就能得到的只有頂層對象的信息,但沒有它的屬性。我應該使用內容腳本還是後臺頁面來讀取由chrome.storage.sync.set設置的數據?任何幫助,將不勝感激。

回答

1

您沒有正確使用for ... in循環。他們的關鍵在於迭代,而不是價值。

for(key in data) { 
    var item = data[key]; 
    console.dir(item); 
    $("<div></div>").text(item.name).appendTo(container); 
} 
+0

非常感謝。我會測試這個以確保它能正常工作。 – sathishpaul

+0

確實是問題的關鍵。修復它使擴展工作。謝謝 :) – sathishpaul