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

Side by Side Diff: chrome/renderer/resources/extensions/binding.js

Issue 12517011: Added activity logging for ext APIs with custom bindings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 7 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium 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 require('json_schema'); 5 require('json_schema');
6 require('event_bindings'); 6 require('event_bindings');
7 var chrome = requireNative('chrome').GetChrome(); 7 var chrome = requireNative('chrome').GetChrome();
8 var chromeHidden = requireNative('chrome_hidden').GetChromeHidden(); 8 var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
9 var forEach = require('utils').forEach; 9 var forEach = require('utils').forEach;
10 var GetAvailability = requireNative('v8_context').GetAvailability; 10 var GetAvailability = requireNative('v8_context').GetAvailability;
11 var logging = requireNative('logging'); 11 var logging = requireNative('logging');
12 var process = requireNative('process'); 12 var process = requireNative('process');
13 var contextType = process.GetContextType(); 13 var contextType = process.GetContextType();
14 var extensionId = process.GetExtensionId(); 14 var extensionId = process.GetExtensionId();
15 var manifestVersion = process.GetManifestVersion(); 15 var manifestVersion = process.GetManifestVersion();
16 var schemaRegistry = requireNative('schema_registry'); 16 var schemaRegistry = requireNative('schema_registry');
17 var schemaUtils = require('schemaUtils'); 17 var schemaUtils = require('schemaUtils');
18 var sendRequest = require('sendRequest').sendRequest;
19 var utils = require('utils'); 18 var utils = require('utils');
20 var CHECK = requireNative('logging').CHECK; 19 var CHECK = requireNative('logging').CHECK;
20 var sendRequestHandler = require('sendRequest');
21 var sendRequest = sendRequestHandler.sendRequest;
22 var logActivity = requireNative('activityLogger').LogActivity;
21 23
22 // Stores the name and definition of each API function, with methods to 24 // Stores the name and definition of each API function, with methods to
23 // modify their behaviour (such as a custom way to handle requests to the 25 // modify their behaviour (such as a custom way to handle requests to the
24 // API, a custom callback, etc). 26 // API, a custom callback, etc).
25 function APIFunctions() { 27 function APIFunctions(namespace) {
26 this.apiFunctions_ = {}; 28 this.apiFunctions_ = {};
27 this.unavailableApiFunctions_ = {}; 29 this.unavailableApiFunctions_ = {};
30 this.namespace = namespace;
28 } 31 }
29 32
30 APIFunctions.prototype.register = function(apiName, apiFunction) { 33 APIFunctions.prototype.register = function(apiName, apiFunction) {
31 this.apiFunctions_[apiName] = apiFunction; 34 this.apiFunctions_[apiName] = apiFunction;
32 }; 35 };
33 36
34 // Registers a function as existing but not available, meaning that calls to 37 // Registers a function as existing but not available, meaning that calls to
35 // the set* methods that reference this function should be ignored rather 38 // the set* methods that reference this function should be ignored rather
36 // than throwing Errors. 39 // than throwing Errors.
37 APIFunctions.prototype.registerUnavailable = function(apiName) { 40 APIFunctions.prototype.registerUnavailable = function(apiName) {
38 this.unavailableApiFunctions_[apiName] = apiName; 41 this.unavailableApiFunctions_[apiName] = apiName;
39 }; 42 };
40 43
41 APIFunctions.prototype.setHook_ = 44 APIFunctions.prototype.setHook_ =
42 function(apiName, propertyName, customizedFunction) { 45 function(apiName, propertyName, customizedFunction) {
43 if (this.unavailableApiFunctions_.hasOwnProperty(apiName)) 46 if (this.unavailableApiFunctions_.hasOwnProperty(apiName))
44 return; 47 return;
45 if (!this.apiFunctions_.hasOwnProperty(apiName)) 48 if (!this.apiFunctions_.hasOwnProperty(apiName))
46 throw new Error('Tried to set hook for unknown API "' + apiName + '"'); 49 throw new Error('Tried to set hook for unknown API "' + apiName + '"');
47 this.apiFunctions_[apiName][propertyName] = customizedFunction; 50 this.apiFunctions_[apiName][propertyName] = customizedFunction;
48 }; 51 };
49 52
50 APIFunctions.prototype.setHandleRequest = 53 APIFunctions.prototype.setHandleRequest =
51 function(apiName, customizedFunction) { 54 function(apiName, customizedFunction) {
52 return this.setHook_(apiName, 'handleRequest', customizedFunction); 55 var prefix = this.namespace;
56 return this.setHook_(apiName, 'handleRequest',
57 function() {
58 var ret = customizedFunction.apply(this, arguments);
59 // Logs API calls to the Activity Log if it doesn't go through an
60 // ExtensionFunction.
61 if (!sendRequestHandler.getCalledSendRequest())
62 logActivity(extensionId, prefix + "." + apiName,
63 Array.prototype.slice.call(arguments));
64 return ret;
65 });
53 }; 66 };
54 67
55 APIFunctions.prototype.setUpdateArgumentsPostValidate = 68 APIFunctions.prototype.setUpdateArgumentsPostValidate =
56 function(apiName, customizedFunction) { 69 function(apiName, customizedFunction) {
57 return this.setHook_( 70 return this.setHook_(
58 apiName, 'updateArgumentsPostValidate', customizedFunction); 71 apiName, 'updateArgumentsPostValidate', customizedFunction);
59 }; 72 };
60 73
61 APIFunctions.prototype.setUpdateArgumentsPreValidate = 74 APIFunctions.prototype.setUpdateArgumentsPreValidate =
62 function(apiName, customizedFunction) { 75 function(apiName, customizedFunction) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 CHECK(customType, jsModuleName + ' must export itself.'); 141 CHECK(customType, jsModuleName + ' must export itself.');
129 customType.prototype = new CustomBindingsObject(); 142 customType.prototype = new CustomBindingsObject();
130 customType.prototype.setSchema(type); 143 customType.prototype.setSchema(type);
131 return customType; 144 return customType;
132 } 145 }
133 146
134 var platform = getPlatform(); 147 var platform = getPlatform();
135 148
136 function Binding(schema) { 149 function Binding(schema) {
137 this.schema_ = schema; 150 this.schema_ = schema;
138 this.apiFunctions_ = new APIFunctions(); 151 this.apiFunctions_ = new APIFunctions(schema.namespace);
139 this.customEvent_ = null; 152 this.customEvent_ = null;
140 this.customHooks_ = []; 153 this.customHooks_ = [];
141 }; 154 };
142 155
143 Binding.create = function(apiName) { 156 Binding.create = function(apiName) {
144 return new Binding(schemaRegistry.GetSchema(apiName)); 157 return new Binding(schemaRegistry.GetSchema(apiName));
145 }; 158 };
146 159
147 Binding.prototype = { 160 Binding.prototype = {
148 // The API through which the ${api_name}_custom_bindings.js files customize 161 // The API through which the ${api_name}_custom_bindings.js files customize
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 294
282 mod[functionDef.name] = (function() { 295 mod[functionDef.name] = (function() {
283 var args = Array.prototype.slice.call(arguments); 296 var args = Array.prototype.slice.call(arguments);
284 if (this.updateArgumentsPreValidate) 297 if (this.updateArgumentsPreValidate)
285 args = this.updateArgumentsPreValidate.apply(this, args); 298 args = this.updateArgumentsPreValidate.apply(this, args);
286 299
287 args = schemaUtils.normalizeArgumentsAndValidate(args, this); 300 args = schemaUtils.normalizeArgumentsAndValidate(args, this);
288 if (this.updateArgumentsPostValidate) 301 if (this.updateArgumentsPostValidate)
289 args = this.updateArgumentsPostValidate.apply(this, args); 302 args = this.updateArgumentsPostValidate.apply(this, args);
290 303
304 sendRequestHandler.clearCalledSendRequest();
305
291 var retval; 306 var retval;
292 if (this.handleRequest) { 307 if (this.handleRequest) {
293 retval = this.handleRequest.apply(this, args); 308 retval = this.handleRequest.apply(this, args);
294 } else { 309 } else {
295 var optArgs = { 310 var optArgs = {
296 customCallback: this.customCallback 311 customCallback: this.customCallback
297 }; 312 };
298 retval = sendRequest(this.name, args, 313 retval = sendRequest(this.name, args,
299 this.definition.parameters, 314 this.definition.parameters,
300 optArgs); 315 optArgs);
301 } 316 }
317 sendRequestHandler.clearCalledSendRequest();
302 318
303 // Validate return value if defined - only in debug. 319 // Validate return value if defined - only in debug.
304 if (chromeHidden.validateCallbacks && 320 if (chromeHidden.validateCallbacks &&
305 this.definition.returns) { 321 this.definition.returns) {
306 schemaUtils.validate([retval], [this.definition.returns]); 322 schemaUtils.validate([retval], [this.definition.returns]);
307 } 323 }
308 return retval; 324 return retval;
309 }).bind(apiFunction); 325 }).bind(apiFunction);
310 }, this); 326 }, this);
311 } 327 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 }); 411 });
396 }; 412 };
397 413
398 addProperties(mod, schema); 414 addProperties(mod, schema);
399 this.runHooks_(mod); 415 this.runHooks_(mod);
400 return mod; 416 return mod;
401 } 417 }
402 }; 418 };
403 419
404 exports.Binding = Binding; 420 exports.Binding = Binding;
OLDNEW
« no previous file with comments | « chrome/renderer/extensions/dom_activity_logger.h ('k') | chrome/renderer/resources/extensions/send_request.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698