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

Unified Diff: chrome/common/extensions/docs/examples/extensions/storage_api_devtools/scripts/bg.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/scripts/bg.js
===================================================================
--- chrome/common/extensions/docs/examples/extensions/storage_api_devtools/scripts/bg.js (revision 0)
+++ chrome/common/extensions/docs/examples/extensions/storage_api_devtools/scripts/bg.js (revision 0)
@@ -0,0 +1,219 @@
+// 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.
+
+var DEFAULT_CONTEXT_ID = "<main_world>";
+var registeredDevToolsPanels = {};
+var registeredInspectedWindows = {};
+var currentDevToolsId = 1;
+
+function assignDevToolsId() {
+ return (currentDevToolsId++).toString();
+}
+
+function onMessage(message, sender, sendResponse) {
+ if (message && message.name)
+ switch(message.name)
+ {
+ case 'isExtensionTab':
+ if (message.tabId)
+ {
+ chrome.tabs.get(message.tabId, function(tab) {
+ sendResponse(tab.url && /^chrome-extension:\/\//.test(tab.url));
+ });
+ return true; // chrome.tabs.get is asynchronous.
+ }
+ else
+ console.error('isExtensionTab: No tab id.');
+ break;
+
+ case 'getExtensionIds':
+ chrome.management.getAll(function(result) {
+ var response = [];
+ result.forEach(function(info) {
+ if (info.enabled && info.type == 'extension') {
+ response.push(info.id);
+ }
+ });
+ sendResponse(response);
+ });
+ return true; // chrome.management.getAll is asynchronous.
+
+ case 'registerDevTools':
+ sendResponse(assignDevToolsId());
+ break;
+
+ // Workaround of http://crbug.com/178618
+ // See also util.js.
+ case 'storageAPIWorkaround':
+ if ((message.area == 'local' || message.area == 'sync') &&
+ (message.method == 'get' || message.method == 'set')) {
+ chrome.storage[message.area][message.method](
+ message.firstArgument, function(items) {
+ sendResponse(items);
+ });
+ return true; // chrome.storage API is asynchronous.
+ } else
+ console.error('storage.get: Invalid storage area.');
+ break;
+ default:
+ console.warn('Unknown message!', message, sender);
+ }
+ else
+ console.warn('Malformed message!', message, sender);
+}
+
+function onPanelConnect(port) {
+ if (isValidPanelId(port.name)) {
+ var panelId = port.name;
+ var devtoolsId = assignDevToolsId();
+ registeredDevToolsPanels[panelId][devtoolsId] = port;
+ port.postMessage({name: '_handshake', devtoolsId: devtoolsId});
+
+ port.onMessage.addListener(function(message) {
+ var contextId = message.contextId || DEFAULT_CONTEXT_ID;
+ var other_end;
+ var contexts = registeredInspectedWindows[panelId][devtoolsId];
+ if (contexts)
+ other_end = contexts[contextId];
+ if (other_end)
+ other_end.postMessage(message);
+ });
+
+ port.onDisconnect.addListener(function() {
+ delete registeredDevToolsPanels[panelId][devtoolsId];
+ port = null;
+ var contexts = registeredInspectedWindows[panelId][devtoolsId];
+ if (contexts)
+ for (contextId in contexts)
+ contexts[contextId].postMessage({name: '_panelUnload'});
+ });
+
+ return true;
+ } else
+ return false;
+}
+
+function onInspectedWindowConnect(port) {
+ if (port.name == '_registerInspectedWindow') {
+ var panelId;
+ var devtoolsId;
+ var contextId;
+
+ port.onMessage.addListener(function(message) {
+ if (message && message.name && message.name == '_handshake' &&
+ message.devtoolsId && message.panelId &&
+ isValidPanelId(message.panelId)) {
+ panelId = message.panelId;
+ devtoolsId = message.devtoolsId;
+ contextId = message.contextId || DEFAULT_CONTEXT_ID;
+ if (!registeredInspectedWindows[panelId][devtoolsId])
+ registeredInspectedWindows[panelId][devtoolsId] = {};
+ registeredInspectedWindows[panelId][devtoolsId][contextId] = port;
+ } else if (panelId && devtoolsId && contextId) {
+ var other_end =
+ registeredDevToolsPanels[panelId][devtoolsId];
+ if (other_end)
+ other_end.postMessage(message);
+ } else
+ console.warn('Received message from inspected window before ' +
+ 'handshake', message);
+ });
+
+ port.onDisconnect.addListener(function() {
+ delete registeredInspectedWindows[panelId][devtoolsId][contextId];
+ if (Object.keys(registeredInspectedWindows[panelId][devtoolsId]).
+ length == 0)
+ delete registeredInspectedWindows[panelId][devtoolsId];
+ port = null;
+ var other_end = registeredDevToolsPanels[panelId][devtoolsId];
+ if (other_end)
+ other_end.postMessage({name: '_inspectedWindowUnload'});
+ });
+
+ return true;
+ } else
+ return false;
+}
+
+function onConnect(port, external) {
+ // onPanelConnect should not be called if the connect request is from
+ // another extension.
+ if (!onInspectedWindowConnect(port))
+ if (!external && !onPanelConnect(port))
+ console.warn('Unknown connect request. Port: ', port);
+}
+
+PANELS.forEach(function(panel) {
+ registeredDevToolsPanels[panel.id] = {};
+ registeredInspectedWindows[panel.id] = {};
+});
+
+(function() {
+ var onMessage_ = chrome.runtime.onMessage || chrome.extension.onMessage;
+ var onConnect_ = chrome.runtime.onConnect || chrome.extension.onConnect;
+ var onConnectExternal_ = chrome.runtime.onConnectExternal ||
+ chrome.extension.onConnectExternal;
+
+ onMessage_.addListener(onMessage);
+ onConnect_.addListener(function(port) {
+ onConnect(port, false);
+ });
+ onConnectExternal_.addListener(function(port) {
+ onConnect(port, true);
+ });
+})();
+
+// Used in storage/eval/initStorage.js when inspecting itself because
+// chrome.runtime.connect cannot connect to itself.
+function fakeEventPageConnect(connectInfo) {
+ function fakeEvent() {
+ this.listeners_ = [];
+ this.addListener = (function(callback) {
+ this.listeners_.push(callback);
+ });
+ this.removeListener = (function(callback) {
+ var index = this.listeners_.indexOf(callback);
+ this.listeners_.splice(index, 1);
+ });
+ this.dispatchEvent_ = (function() {
+ var args = arguments;
+ this.listeners_.forEach(function(callback) {
+ callback.apply(null, args);
+ });
+ });
+ return this;
+ }
+
+ var fakePort = {
+ name: connectInfo.name,
+ onDisconnect: new fakeEvent(),
+ onMessage: new fakeEvent()
+ };
+
+ var fakePortOtherEnd = {
+ name: connectInfo.name,
+ onDisconnect: new fakeEvent(),
+ onMessage: new fakeEvent()
+ };
+
+ fakePort.postMessage = (function(message) {
+ fakePortOtherEnd.onMessage.dispatchEvent_(message);
+ });
+
+ fakePort.disconnect = (function() {
+ fakePortOtherEnd.onDisconnect.dispatchEvent_();
+ });
+
+ fakePortOtherEnd.postMessage = (function(message) {
+ fakePort.onMessage.dispatchEvent_(message);
+ });
+
+ fakePortOtherEnd.disconnect = (function() {
+ fakePort.onDisconnect.dispatchEvent_();
+ });
+
+ onInspectedWindowConnect(fakePort);
+ return fakePortOtherEnd;
+}
+
Property changes on: chrome/common/extensions/docs/examples/extensions/storage_api_devtools/scripts/bg.js
___________________________________________________________________
Added: svn:mime-type
+ text/javascript
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698