Эквиваленты Scriptish/Greasmonkey GM_setValue и GM_getValue для расширений Google Chrome

Я разрабатываю расширение Google Chrome, в котором в основном есть два разных сценария содержимого для двух разных доменов (скажем, google.com и yahoo.com):

manifest.json

...
"content_scripts" : [{
        "matches" : ["https://*google.com/*"],
        "js": ["my_google.js"],
        "run_at":"document_end"  
}, {
        "matches" : ["https://*yahoo.com/*"],
        "js": ["my_yahoo.js"],
        "run_at":"document_end"  
}],

"permissions": ["storage"],  
...

Мне нужно постоянное (не только для одного сеанса) хранилище, где оба этих скрипта могли бы обновлять и извлекать некоторые часто используемые данные. Я знаю, что это можно сделать с помощью chrome.storage API следующим образом:

chrome.storage.local.set( { 'string1' : 'value1'}, function(){ 
    console.log("string1 with value = value1 has been added to the chrome.storage");  
    // continue with script code...
});

chrome.storage.local.get( 'string1', function (data){ 
    console.log("string1 with value = " + data['string1'] + " has been retrieved from the chrome.storage" );
    // continue with script code... 
});

chrome.storage.local.remove( 'string1', function () {
    console.log("string1 has been removed from chrome.storage") ;
    // continue with script code... 
});

Теперь самое смешное...

Есть ли замена этому API, которая будет работать как междоменное chrome.storage, но с синхронными вызовами? Чего я на самом деле пытаюсь добиться, так это воспроизвести поведение API-интерфейсов Scriptish/Greasemonkey GM_setValue и GM_getValue без необходимости изменять весь код обоих сценариев, ранее использовавшихся в Mozilla Firefox, а теперь перенесенных в Google Chrome.

необязательно:
также было бы неплохо иметь возможность удалить строку1 (или, возможно, очистить все хранилище) из всплывающей страницы значка действия браузера - popup.html (popup.js) .

Любые идеи?


person escudero380    schedule 20.01.2014    source источник


Ответы (1)


Механизм синхронного междоменного хранения для сценариев контента отсутствует.

Однако, если вы действительно хотите получить такую ​​функцию, вы можете реализовать такое хранилище самостоятельно, поддерживая локальную копию хранилища, поддерживаемую chrome.storage.

  1. Инициализация: используйте chrome.storage.local.get(null, callback), чтобы получить все сохраненные данные и сохранить их в локальная переменная.
  2. Maintenance:
    • Use the chrome.storage.onChanged event to watch for changes and update the local copy when needed.
    • Всякий раз, когда используется GM_setValue (и т. д.), немедленно обновляйте локальную копию, чтобы вызов GM_getValue сразу после GM_setValue давал ожидаемый результат.

В идеале следует отложить выполнение других скриптов до инициализации хранилища. Если это невозможно, создайте отдельный скрипт и пусть он "run_at": "document_start". При использовании этого метода вполне вероятно (хотя и не гарантировано), что хранилище будет готово, когда остальная часть вашего кода запустится в "document_end"`.


Существует еще один способ синхронного получения/установки значений хранилища. Я настоятельно не рекомендую вам использовать этот метод. Синхронный XMLHttpRequest вместе с API webRequest (chrome.webRequest.onBeforeRequest) можно использовать для связи данные с фоновой страницы в скрипт содержимого и наоборот.
Отправить данные несложно (например, установить значение в URL),
получить данные обратно немного сложнее. Вы можете использовать URL.createObjectURL, чтобы получить blob: URL-адрес ваших данных, и вернуть {redirectUrl: ...}, чтобы ответить на только что созданный URL-адрес в сценарии контента.

person Rob W    schedule 20.01.2014