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

Unified Diff: chrome/renderer/resources/extension_process_bindings.js

Issue 7024056: Handle extension webrequest API on the IO thread. This speeds up blocking event (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review Created 9 years, 6 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
« no previous file with comments | « chrome/renderer/extensions/extension_process_bindings.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/resources/extension_process_bindings.js
diff --git a/chrome/renderer/resources/extension_process_bindings.js b/chrome/renderer/resources/extension_process_bindings.js
index 57fadc19c8474e0bfb00e4ce1ae7902b19269837..1c6f5d5532cc85b3e9f1b19a99687ae5ced910b0 100644
--- a/chrome/renderer/resources/extension_process_bindings.js
+++ b/chrome/renderer/resources/extension_process_bindings.js
@@ -183,31 +183,35 @@ var chrome = chrome || {};
}
// Send an API request and optionally register a callback.
- function sendRequest(functionName, args, argSchemas, customCallback) {
+ // |opt_args| is an object with optional parameters as follows:
+ // - noStringify: true if we should not stringify the request arguments.
+ // - customCallback: a callback that should be called instead of the standard
+ // callback.
+ // - nativeFunction: the v8 native function to handle the request, or
+ // StartRequest if missing.
+ // - forIOThread: true if this function should be handled on the browser IO
+ // thread.
+ function sendRequest(functionName, args, argSchemas, opt_args) {
+ if (!opt_args)
+ opt_args = {};
var request = prepareRequest(args, argSchemas);
- if (customCallback) {
- request.customCallback = customCallback;
+ if (opt_args.customCallback) {
+ request.customCallback = opt_args.customCallback;
}
// JSON.stringify doesn't support a root object which is undefined.
if (request.args === undefined)
request.args = null;
- var sargs = chromeHidden.JSON.stringify(request.args);
+ var sargs = opt_args.noStringify ?
+ request.args : chromeHidden.JSON.stringify(request.args);
+ var nativeFunction = opt_args.nativeFunction || StartRequest;
var requestId = GetNextRequestId();
requests[requestId] = request;
- var hasCallback = (request.callback || customCallback) ? true : false;
- return StartRequest(functionName, sargs, requestId, hasCallback);
- }
-
- // Send a special API request that is not JSON stringifiable, and optionally
- // register a callback.
- function sendCustomRequest(nativeFunction, functionName, args, argSchemas) {
- var request = prepareRequest(args, argSchemas);
- var requestId = GetNextRequestId();
- requests[requestId] = request;
- return nativeFunction(functionName, request.args, requestId,
- request.callback ? true : false);
+ var hasCallback =
+ (request.callback || opt_args.customCallback) ? true : false;
+ return nativeFunction(functionName, sargs, requestId, hasCallback,
+ opt_args.forIOThread);
}
// Helper function for positioning pop-up windows relative to DOM objects.
@@ -625,7 +629,7 @@ var chrome = chrome || {};
} else {
retval = sendRequest(this.name, args,
this.definition.parameters,
- this.customCallback);
+ {customCallback: this.customCallback});
}
// Validate return value if defined - only in debug.
@@ -816,7 +820,8 @@ var chrome = chrome || {};
"is no larger than " + iconSize + " pixels square.");
}
- sendCustomRequest(nativeFunction, name, [details], parameters);
+ sendRequest(name, [details], parameters,
+ {noStringify: true, nativeFunction: nativeFunction});
} else if ("path" in details) {
var img = new Image();
img.onerror = function() {
@@ -834,7 +839,8 @@ var chrome = chrome || {};
delete details.path;
details.imageData = canvas_context.getImageData(0, 0, canvas.width,
canvas.height);
- sendCustomRequest(nativeFunction, name, [details], parameters);
+ sendRequest(name, [details], parameters,
+ {noStringify: true, nativeFunction: nativeFunction});
};
img.src = details.path;
} else {
@@ -874,7 +880,7 @@ var chrome = chrome || {};
var id = GetNextContextMenuId();
args[0].generatedId = id;
sendRequest(this.name, args, this.definition.parameters,
- this.customCallback);
+ {customCallback: this.customCallback});
return id;
};
@@ -884,6 +890,20 @@ var chrome = chrome || {};
sendRequest(this.name, [parseResult], this.definition.parameters);
};
+ apiFunctions["experimental.webRequest.addEventListener"].handleRequest =
+ function() {
+ var args = Array.prototype.slice.call(arguments);
+ sendRequest(this.name, args, this.definition.parameters,
+ {forIOThread: true});
+ };
+
+ apiFunctions["experimental.webRequest.eventHandled"].handleRequest =
+ function() {
+ var args = Array.prototype.slice.call(arguments);
+ sendRequest(this.name, args, this.definition.parameters,
+ {forIOThread: true});
+ };
+
apiFunctions["contextMenus.create"].customCallback =
function(name, request, response) {
if (chrome.extension.lastError) {
« no previous file with comments | « chrome/renderer/extensions/extension_process_bindings.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698