diff --git a/filenames.gypi b/filenames.gypi index af1942fc3697..2b87e36fa4d2 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -64,6 +64,7 @@ 'lib/renderer/api/screen.js', 'lib/renderer/api/web-frame.js', 'lib/renderer/extensions/i18n.js', + 'lib/renderer/extensions/storage.js', ], 'js2c_sources': [ 'lib/common/asar.js', diff --git a/lib/renderer/chrome-api.js b/lib/renderer/chrome-api.js index 4a3556c37e67..fdc16f7375d2 100644 --- a/lib/renderer/chrome-api.js +++ b/lib/renderer/chrome-api.js @@ -183,12 +183,7 @@ exports.injectTo = function (extensionId, isBackgroundPage, context) { onMessage: chrome.runtime.onMessage } - chrome.storage = { - sync: { - get () {}, - set () {} - } - } + chrome.storage = require('./extensions/storage.js') chrome.pageAction = { show () {}, diff --git a/lib/renderer/extensions/storage.js b/lib/renderer/extensions/storage.js new file mode 100644 index 000000000000..7b880f08310e --- /dev/null +++ b/lib/renderer/extensions/storage.js @@ -0,0 +1,59 @@ +const getStorage = () => { + const data = window.localStorage.getItem('__chrome.storage.sync__') + if (data != null) { + return JSON.parse(data) + } else { + return {} + } +} + +const setStorage = (storage) => { + const json = JSON.stringify(storage) + window.localStorage.setItem('__chrome.storage.sync__', json) +} + +module.exports = { + sync: { + get (keys, callback) { + const storage = getStorage() + if (keys == null) return storage + + let defaults = {} + switch (typeof keys) { + case 'string': + keys = [keys] + break + case 'object': + if (!Array.isArray(keys)) { + defaults = keys + keys = Object.keys(keys) + } + break + } + if (keys.length === 0) return {} + + let items = {} + keys.forEach(function (key) { + var value = storage[key] + if (value == null) value = defaults[key] + items[key] = value + }) + + setTimeout(function () { + callback(items) + }) + }, + + set (items, callback) { + const storage = getStorage() + + Object.keys(items).forEach(function (name) { + storage[name] = items[name] + }) + + setStorage(storage) + + setTimeout(callback) + } + } +} diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index a5a1478d6908..5048f3cd4a93 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -878,6 +878,7 @@ describe('browser-window module', function () { assert.equal(message.runtimeId, 'foo') assert.equal(message.tabId, w.webContents.id) assert.equal(message.i18nString, 'foo - bar (baz)') + assert.deepEqual(message.storageItems, {foo: 'bar'}) done() }) }) diff --git a/spec/fixtures/devtools-extensions/foo/index.html b/spec/fixtures/devtools-extensions/foo/index.html index 414370ae2c06..b10288227aca 100644 --- a/spec/fixtures/devtools-extensions/foo/index.html +++ b/spec/fixtures/devtools-extensions/foo/index.html @@ -4,13 +4,22 @@