Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4192)

Unified Diff: chrome/common/extensions/docs/examples/extensions/storage_api_devtools/storage/inspectedWindow/initStorage.js

Issue 12760009: Write a devtools extension to inspect chrome.storage data Base URL: https://src.chromium.org/svn/trunk/src/
Patch Set: small fixes Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/docs/examples/extensions/storage_api_devtools/storage/inspectedWindow/initStorage.js
===================================================================
--- chrome/common/extensions/docs/examples/extensions/storage_api_devtools/storage/inspectedWindow/initStorage.js (revision 0)
+++ chrome/common/extensions/docs/examples/extensions/storage_api_devtools/storage/inspectedWindow/initStorage.js (revision 0)
@@ -0,0 +1,210 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// initStorage.js
+// Retrieves chrome.storage data as well as usage information and pass all
+// these to panel.js.
+// |devtoolsId|: Identify different DevTools instances.
+// |contextId|: Identify different contexts within an inspected page.
+// |reportUsage|: NOT IMPLEMENTED. Allows to disable usage report.
+
+(function() {
+ var extensionId = '<REPLACE_WITH_EXTENSION_ID_BEFORE_EVAL>';
+ var devtoolsId = '<REPLACE_WITH_EXTRA_PARAMETER_BEFORE_EVAL:devtoolsId>';
+ var contextId = '<REPLACE_WITH_EXTRA_PARAMETER_BEFORE_EVAL:contextId>';
+ var reportUsage = '<REPLACE_WITH_EXTRA_PARAMETER_BEFORE_EVAL:reportUsage>';
+
+ var port;
+ var connectInfo = {name: '_registerInspectedWindow'};
+ // Event page cannot connect to itself. Use fakeEventPageConnect defined
+ // in bg.js.
+ if (chrome.i18n.getMessage('@@extension_id') == extensionId &&
+ typeof fakeEventPageConnect != 'undefined')
+ port = fakeEventPageConnect(connectInfo);
+ else
+ port = (chrome.runtime.connect || chrome.extension.connect)(extensionId,
+ connectInfo);
+
+ function onPortMessage(message) {
+ if (message && message.name) {
+ if (message.name == '_panelUnload') {
+ chrome.storage.onChanged.removeListener(onStorageChanged);
+ port.onMessage.removeListener(onPortMessage);
+ if (port.disconnect)
+ port.disconnect();
+ port = null;
+ } else if (message.areaName == 'local' || message.areaName == 'sync')
+ onPanelMessage(message);
+ }
+ }
+
+ port.onMessage.addListener(onPortMessage);
+
+ port.postMessage({
+ name: '_handshake',
+ devtoolsId: devtoolsId,
+ contextId: contextId,
+ panelId: 'storage'
+ });
+
+ port.onDisconnect.addListener(function(message) {
+ chrome.storage.onChanged.removeListener(onStorageChanged);
+ });
+
+ function sendMessageInternal(name, areaName, message) {
+ message.name = 'devtools.' + name;
+ message.areaName = areaName;
+ message.contextId = contextId;
+ port.postMessage(message);
+ }
+
+ // Send customLastError if specified. Otherwise, send
+ // chrome.runtime.lastError if available. Returns true when an error is
+ // sent.
+ function sendIfError(areaName, customLastError) {
+ var lastError;
+ if (customLastError)
+ lastError = customLastError;
+ else if (chrome.runtime && chrome.runtime.lastError)
+ lastError = chrome.runtime.lastError;
+ else if(!chrome.runtime && chrome.extension && chrome.extension.lastError)
+ lastError = chrome.extension.lastError;
+ else
+ return false;
+ sendMessageInternal('reportError', areaName, {lastError: lastError});
+ return true;
+ }
+
+ function sendInit(areaName, items) {
+ sendMessageInternal('init', areaName, {items: items});
+ }
+
+ function sendReportUsage(areaName, key, bytesInUse) {
+ sendMessageInternal('reportUsage', areaName, {
+ key: key,
+ bytesInUse: bytesInUse
+ });
+ }
+
+ function sendUpdate(areaName, changes) {
+ sendMessageInternal('update', areaName, {changes: changes});
+ }
+
+ function sendUnlimitedStorage(result) {
+ sendMessageInternal('unlimitedStorage', null,
+ {unlimitedStorage:result});
+ }
+
+ function updateBytesInUse(area, areaName, dict) {
+ if (reportUsage != 'false')
+ {
+ Object.keys(dict).forEach(function(key) {
+ area.getBytesInUse(key, function(bytesInUse) {
+ sendReportUsage(areaName, key, bytesInUse);
+ });
+ });
+ }
+ }
+
+ function initStorageArea(area, areaName) {
+ area.get(null, function(items)
+ {
+ sendInit(areaName, items);
+ updateBytesInUse(area, areaName, items);
+ });
+ }
+
+ function onStorageChanged(changes, areaName) {
+ sendUpdate(areaName, changes);
+ updateBytesInUse(chrome.storage[areaName], areaName, changes);
+ }
+
+ function updateValue(areaName, storage, key, value) {
+ var items = {};
+ try {
+ items[key] = JSON.parse(value);
+ } catch (e) {
+ sendIfError(areaName, {message: e.message});
+ return;
+ }
+ storage.set(items, function() {
+ sendIfError(areaName);
+ });
+ }
+
+ function updateKey(areaName, storage, key, newKey) {
+ storage.get(key, function(items) {
+ if(sendIfError(areaName))
+ return;
+
+ var value = items[key];
+ if (value) {
+ var items = {};
+ items[newKey] = value;
+ // First set then remove in case of quota errors
+ storage.set(items, function() {
+ if(!sendIfError(areaName)) {
+ storage.remove(key, function() {
+ sendIfError(areaName);
+ });
+ }
+ });
+ }
+ });
+ }
+
+ function removeKey(areaName, storage, key) {
+ storage.remove(key, function() {
+ sendIfError(areaName);
+ });
+ }
+
+ function clear(areaName, storage) {
+ storage.clear(function() {
+ sendIfError(areaName);
+ });
+ }
+
+ function onPanelMessage(message)
+ {
+ var areaName = message.areaName;
+ var storage = chrome.storage[areaName];
+
+ switch(message.name) {
+ case 'updateValue':
+ if (message.key && message.value)
+ updateValue(areaName, storage, message.key, message.value);
+ break;
+ case 'updateKey':
+ if (message.key && message.newKey)
+ updateKey(areaName, storage, message.key, message.newKey);
+ break;
+ case 'removeKey':
+ if (message.key)
+ removeKey(areaName, storage, message.key);
+ break;
+ case 'clear':
+ clear(areaName, storage);
+ break;
+ default:
+ break;
+ }
+ }
+
+ initStorageArea(chrome.storage.local, 'local');
+ initStorageArea(chrome.storage.sync, 'sync');
+ chrome.storage.onChanged.addListener(onStorageChanged);
+
+ // chrome.permissions is not available in content scripts.
+ if (chrome.runtime && chrome.runtime.getManifest) {
+ var permissions = chrome.runtime.getManifest().permissions || [];
+ sendUnlimitedStorage(permissions.indexOf('unlimitedStorage') != -1 ||
+ permissions.indexOf('unlimited_storage') != -1);
+ } else if (chrome.permissions)
+ chrome.permissions.contains({permissions: ['unlimitedStorage']},
+ function(result) {
+ sendUnlimitedStorage(result);
+ });
+})();
+
Property changes on: chrome/common/extensions/docs/examples/extensions/storage_api_devtools/storage/inspectedWindow/initStorage.js
___________________________________________________________________
Added: svn:eol-style
+ LF
Added: svn:mime-type
+ text/javascript

Powered by Google App Engine
This is Rietveld 408576698