| 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
|
|
|
|
|