chrome.storage.sync.get не возвращает полный объект JS

#javascript #google-chrome #google-chrome-extension

#javascript #google-chrome #google-chrome-расширение

Вопрос:

Я пытаюсь написать расширение Chrome, которое позволяет пользователям легко входить на внутреннюю веб-страницу. Расширение покажет меню, содержащее предопределенные учетные данные, из которых пользователь может выбрать один и немедленно войти на соответствующую веб-страницу.(подумайте о закладках ).

В качестве первого шага я хотел написать функциональность, которая принимает информацию «имя», «url», «имя пользователя» и «пароль» на странице параметров расширения и сохраняет ее с помощью 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 amp;amp; !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);
    }
});
 

Скриншот консоли js для всплывающей страницы

Как вы можете видеть, выборка может получить только информацию об объекте верхнего уровня, но ни один из его атрибутов. Должен ли я использовать сценарии содержимого или фоновые страницы для чтения данных, установленных 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);
}
 

Комментарии:

1. Большое спасибо. Я проверю это, чтобы убедиться, что это работает.

2. Это действительно был ключ, который был проблемой. Исправление этого заставляет расширение работать. Спасибо 🙂