| OLD | NEW |
| 1 // Copyright (c) 2009 The chrome Authors. All rights reserved. | 1 // Copyright (c) 2009 The chrome Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // ----------------------------------------------------------------------------- | 5 // ----------------------------------------------------------------------------- |
| 6 // NOTE: If you change this file you need to touch renderer_resources.grd to | 6 // NOTE: If you change this file you need to touch renderer_resources.grd to |
| 7 // have your change take effect. | 7 // have your change take effect. |
| 8 // ----------------------------------------------------------------------------- | 8 // ----------------------------------------------------------------------------- |
| 9 | 9 |
| 10 // This script contains privileged chrome extension related javascript APIs. | 10 // This script contains privileged chrome extension related javascript APIs. |
| 11 // It is loaded by pages whose URL has the chrome-extension protocol. | 11 // It is loaded by pages whose URL has the chrome-extension protocol. |
| 12 | 12 |
| 13 var chrome = chrome || {}; | 13 var chrome = chrome || {}; |
| 14 (function() { | 14 (function() { |
| 15 native function GetExtensionAPIDefinition(); | 15 native function GetExtensionAPIDefinition(); |
| 16 native function StartRequest(); | 16 native function StartRequest(); |
| 17 native function GetCurrentPageActions(extensionId); | 17 native function GetCurrentPageActions(extensionId); |
| 18 native function GetViews(); | 18 native function GetExtensionViews(); |
| 19 native function GetChromeHidden(); | 19 native function GetChromeHidden(); |
| 20 native function GetNextRequestId(); | 20 native function GetNextRequestId(); |
| 21 native function OpenChannelToTab(); | 21 native function OpenChannelToTab(); |
| 22 | 22 |
| 23 if (!chrome) | 23 if (!chrome) |
| 24 chrome = {}; | 24 chrome = {}; |
| 25 | 25 |
| 26 var chromeHidden = GetChromeHidden(); | 26 var chromeHidden = GetChromeHidden(); |
| 27 | 27 |
| 28 // Validate arguments. | 28 // Validate arguments. |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 var sargs = JSON.stringify(request.args); | 115 var sargs = JSON.stringify(request.args); |
| 116 var requestId = GetNextRequestId(); | 116 var requestId = GetNextRequestId(); |
| 117 var hasCallback = false; | 117 var hasCallback = false; |
| 118 if (request.callback) { | 118 if (request.callback) { |
| 119 hasCallback = true; | 119 hasCallback = true; |
| 120 callbacks[requestId] = request.callback; | 120 callbacks[requestId] = request.callback; |
| 121 } | 121 } |
| 122 return StartRequest(functionName, sargs, requestId, hasCallback); | 122 return StartRequest(functionName, sargs, requestId, hasCallback); |
| 123 } | 123 } |
| 124 | 124 |
| 125 // Read api definitions and setup api functions in the chrome namespace. | |
| 126 // TODO(rafaelw): Consider defining a json schema for an api definition | |
| 127 // and validating either here, in a unit_test or both. | |
| 128 // TODO(rafaelw): Handle synchronous functions. | |
| 129 // TOOD(rafaelw): Consider providing some convenient override points | |
| 130 // for api functions that wish to insert themselves into the call. | |
| 131 var apiDefinitions = JSON.parse(GetExtensionAPIDefinition()); | |
| 132 | |
| 133 // |apiFunctions| is a hash of name -> object that stores the | |
| 134 // name & definition of the apiFunction. Custom handling of api functions | |
| 135 // is implemented by adding a "handleRequest" function to the object. | |
| 136 var apiFunctions = {}; | |
| 137 | |
| 138 // Using forEach for convenience, and to bind |module|s & |apiDefs|s via | 125 // Using forEach for convenience, and to bind |module|s & |apiDefs|s via |
| 139 // closures. | 126 // closures. |
| 140 function forEach(a, f) { | 127 function forEach(a, f) { |
| 141 for (var i = 0; i < a.length; i++) { | 128 for (var i = 0; i < a.length; i++) { |
| 142 f(a[i], i); | 129 f(a[i], i); |
| 143 } | 130 } |
| 144 } | 131 } |
| 145 | 132 |
| 146 function bind(obj, func) { | 133 function bind(obj, func) { |
| 147 return function() { | 134 return function() { |
| 148 return func.apply(obj, arguments); | 135 return func.apply(obj, arguments); |
| 149 }; | 136 }; |
| 150 } | 137 } |
| 151 | 138 |
| 152 forEach(apiDefinitions, function(apiDef) { | |
| 153 chrome[apiDef.namespace] = chrome[apiDef.namespace] || {}; | |
| 154 var module = chrome[apiDef.namespace]; | |
| 155 | |
| 156 // Setup Functions. | |
| 157 if (apiDef.functions) { | |
| 158 forEach(apiDef.functions, function(functionDef) { | |
| 159 // Module functions may have been defined earlier by hand. Don't clobber | |
| 160 // them. | |
| 161 if (module[functionDef.name]) | |
| 162 return; | |
| 163 | |
| 164 var apiFunction = {}; | |
| 165 apiFunction.definition = functionDef; | |
| 166 apiFunction.name = apiDef.namespace + "." + functionDef.name;; | |
| 167 apiFunctions[apiFunction.name] = apiFunction; | |
| 168 | |
| 169 module[functionDef.name] = bind(apiFunction, function() { | |
| 170 validate(arguments, this.definition.parameters); | |
| 171 | |
| 172 if (this.handleRequest) | |
| 173 return this.handleRequest.apply(this, arguments); | |
| 174 else | |
| 175 return sendRequest(this.name, arguments, | |
| 176 this.definition.parameters); | |
| 177 }); | |
| 178 }); | |
| 179 } | |
| 180 | |
| 181 // Setup Events | |
| 182 if (apiDef.events) { | |
| 183 forEach(apiDef.events, function(eventDef) { | |
| 184 // Module events may have been defined earlier by hand. Don't clobber | |
| 185 // them. | |
| 186 if (module[eventDef.name]) | |
| 187 return; | |
| 188 | |
| 189 var eventName = apiDef.namespace + "." + eventDef.name; | |
| 190 module[eventDef.name] = new chrome.Event(eventName); | |
| 191 }); | |
| 192 } | |
| 193 }); | |
| 194 | |
| 195 // --- Setup additional api's not currently handled in common/extensions/api | 139 // --- Setup additional api's not currently handled in common/extensions/api |
| 196 | 140 |
| 197 // Page action events send (pageActionId, {tabId, tabUrl}). | 141 // Page action events send (pageActionId, {tabId, tabUrl}). |
| 198 function setupPageActionEvents(extensionId) { | 142 function setupPageActionEvents(extensionId) { |
| 199 var pageActions = GetCurrentPageActions(extensionId); | 143 var pageActions = GetCurrentPageActions(extensionId); |
| 200 var eventName = ""; | 144 var eventName = ""; |
| 201 for (var i = 0; i < pageActions.length; ++i) { | 145 for (var i = 0; i < pageActions.length; ++i) { |
| 202 eventName = extensionId + "/" + pageActions[i]; | 146 eventName = extensionId + "/" + pageActions[i]; |
| 203 // Setup events for each extension_id/page_action_id string we find. | 147 // Setup events for each extension_id/page_action_id string we find. |
| 204 chrome.pageActions[pageActions[i]] = new chrome.Event(eventName); | 148 chrome.pageActions[pageActions[i]] = new chrome.Event(eventName); |
| 205 } | 149 } |
| 206 } | 150 } |
| 207 | 151 |
| 208 // Tabs connect() | |
| 209 apiFunctions["tabs.connect"].handleRequest = function(tabId, opt_name) { | |
| 210 var portId = OpenChannelToTab(tabId, chrome.extension.id_, opt_name || ""); | |
| 211 return chromeHidden.Port.createPort(portId, opt_name); | |
| 212 } | |
| 213 | |
| 214 // chrome.self / chrome.extension. | |
| 215 chrome.self = chrome.self || {}; | |
| 216 | |
| 217 chromeHidden.onLoad.addListener(function (extensionId) { | 152 chromeHidden.onLoad.addListener(function (extensionId) { |
| 218 chrome.extension = new chrome.Extension(extensionId); | 153 chrome.extension = new chrome.Extension(extensionId); |
| 219 // TODO(mpcomplete): self.onConnect is deprecated. Remove it at 1.0. | 154 |
| 155 // TODO(mpcomplete): chrome.self is deprecated. Remove it at 1.0. |
| 220 // http://code.google.com/p/chromium/issues/detail?id=16356 | 156 // http://code.google.com/p/chromium/issues/detail?id=16356 |
| 221 chrome.self.onConnect = chrome.extension.onConnect; | 157 chrome.self = chrome.extension; |
| 158 |
| 159 // |apiFunctions| is a hash of name -> object that stores the |
| 160 // name & definition of the apiFunction. Custom handling of api functions |
| 161 // is implemented by adding a "handleRequest" function to the object. |
| 162 var apiFunctions = {}; |
| 163 |
| 164 // Read api definitions and setup api functions in the chrome namespace. |
| 165 // TODO(rafaelw): Consider defining a json schema for an api definition |
| 166 // and validating either here, in a unit_test or both. |
| 167 // TODO(rafaelw): Handle synchronous functions. |
| 168 // TOOD(rafaelw): Consider providing some convenient override points |
| 169 // for api functions that wish to insert themselves into the call. |
| 170 var apiDefinitions = JSON.parse(GetExtensionAPIDefinition()); |
| 171 |
| 172 forEach(apiDefinitions, function(apiDef) { |
| 173 chrome[apiDef.namespace] = chrome[apiDef.namespace] || {}; |
| 174 var module = chrome[apiDef.namespace]; |
| 175 |
| 176 // Setup Functions. |
| 177 if (apiDef.functions) { |
| 178 forEach(apiDef.functions, function(functionDef) { |
| 179 // Module functions may have been defined earlier by hand. Don't |
| 180 // clobber them. |
| 181 if (module[functionDef.name]) |
| 182 return; |
| 183 |
| 184 var apiFunction = {}; |
| 185 apiFunction.definition = functionDef; |
| 186 apiFunction.name = apiDef.namespace + "." + functionDef.name;; |
| 187 apiFunctions[apiFunction.name] = apiFunction; |
| 188 |
| 189 module[functionDef.name] = bind(apiFunction, function() { |
| 190 validate(arguments, this.definition.parameters); |
| 191 |
| 192 if (this.handleRequest) |
| 193 return this.handleRequest.apply(this, arguments); |
| 194 else |
| 195 return sendRequest(this.name, arguments, |
| 196 this.definition.parameters); |
| 197 }); |
| 198 }); |
| 199 } |
| 200 |
| 201 // Setup Events |
| 202 if (apiDef.events) { |
| 203 forEach(apiDef.events, function(eventDef) { |
| 204 // Module events may have been defined earlier by hand. Don't clobber |
| 205 // them. |
| 206 if (module[eventDef.name]) |
| 207 return; |
| 208 |
| 209 var eventName = apiDef.namespace + "." + eventDef.name; |
| 210 module[eventDef.name] = new chrome.Event(eventName); |
| 211 }); |
| 212 } |
| 213 }); |
| 214 |
| 215 apiFunctions["tabs.connect"].handleRequest = function(tabId, opt_name) { |
| 216 var portId = OpenChannelToTab( |
| 217 tabId, chrome.extension.id_, opt_name || ""); |
| 218 return chromeHidden.Port.createPort(portId, opt_name); |
| 219 } |
| 220 |
| 221 apiFunctions["extension.getViews"].handleRequest = function() { |
| 222 return GetExtensionViews(-1, "ALL"); |
| 223 } |
| 224 |
| 225 apiFunctions["extension.getBackgroundPage"].handleRequest = function() { |
| 226 return GetExtensionViews(-1, "BACKGROUND")[0] || null; |
| 227 } |
| 228 |
| 229 apiFunctions["extension.getToolstrips"].handleRequest = |
| 230 function(windowId) { |
| 231 if (typeof(windowId) == "undefined") |
| 232 windowId = -1; |
| 233 return GetExtensionViews(windowId, "TOOLSTRIP"); |
| 234 } |
| 235 |
| 236 apiFunctions["extension.getTabContentses"].handleRequest = |
| 237 function(windowId) { |
| 238 if (typeof(windowId) == "undefined") |
| 239 windowId = -1; |
| 240 return GetExtensionViews(windowId, "TAB"); |
| 241 } |
| 222 | 242 |
| 223 setupPageActionEvents(extensionId); | 243 setupPageActionEvents(extensionId); |
| 224 }); | 244 }); |
| 225 | 245 })(); |
| 226 // Self getViews(); | |
| 227 apiFunctions["self.getViews"].handleRequest = function() { | |
| 228 return GetViews(); | |
| 229 } | |
| 230 })(); | |
| OLD | NEW |