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

Side by Side Diff: chrome/renderer/extensions/extension_process_bindings.cc

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: fix broken test 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include "chrome/renderer/extensions/extension_process_bindings.h" 5 #include "chrome/renderer/extensions/extension_process_bindings.h"
6 6
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 } else if (name->Equals(v8::String::New("OpenChannelToTab"))) { 161 } else if (name->Equals(v8::String::New("OpenChannelToTab"))) {
162 return v8::FunctionTemplate::New(OpenChannelToTab); 162 return v8::FunctionTemplate::New(OpenChannelToTab);
163 } else if (name->Equals(v8::String::New("GetNextContextMenuId"))) { 163 } else if (name->Equals(v8::String::New("GetNextContextMenuId"))) {
164 return v8::FunctionTemplate::New(GetNextContextMenuId); 164 return v8::FunctionTemplate::New(GetNextContextMenuId);
165 } else if (name->Equals(v8::String::New("GetCurrentPageActions"))) { 165 } else if (name->Equals(v8::String::New("GetCurrentPageActions"))) {
166 return v8::FunctionTemplate::New(GetCurrentPageActions, 166 return v8::FunctionTemplate::New(GetCurrentPageActions,
167 v8::External::New(this)); 167 v8::External::New(this));
168 } else if (name->Equals(v8::String::New("StartRequest"))) { 168 } else if (name->Equals(v8::String::New("StartRequest"))) {
169 return v8::FunctionTemplate::New(StartRequest, 169 return v8::FunctionTemplate::New(StartRequest,
170 v8::External::New(this)); 170 v8::External::New(this));
171 } else if (name->Equals(v8::String::New("StartRequestForIOThread"))) {
172 return v8::FunctionTemplate::New(StartRequestForIOThread,
173 v8::External::New(this));
171 } else if (name->Equals(v8::String::New("GetRenderViewId"))) { 174 } else if (name->Equals(v8::String::New("GetRenderViewId"))) {
172 return v8::FunctionTemplate::New(GetRenderViewId); 175 return v8::FunctionTemplate::New(GetRenderViewId);
173 } else if (name->Equals(v8::String::New("SetIconCommon"))) { 176 } else if (name->Equals(v8::String::New("SetIconCommon"))) {
174 return v8::FunctionTemplate::New(SetIconCommon, 177 return v8::FunctionTemplate::New(SetIconCommon,
175 v8::External::New(this)); 178 v8::External::New(this));
176 } else if (name->Equals(v8::String::New("IsExtensionProcess"))) { 179 } else if (name->Equals(v8::String::New("IsExtensionProcess"))) {
177 return v8::FunctionTemplate::New(IsExtensionProcess, 180 return v8::FunctionTemplate::New(IsExtensionProcess,
178 v8::External::New(this)); 181 v8::External::New(this));
179 } else if (name->Equals(v8::String::New("IsIncognitoProcess"))) { 182 } else if (name->Equals(v8::String::New("IsIncognitoProcess"))) {
180 return v8::FunctionTemplate::New(IsIncognitoProcess); 183 return v8::FunctionTemplate::New(IsIncognitoProcess);
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 v8::String::New(id.c_str(), id.size())); 385 v8::String::New(id.c_str(), id.size()));
383 } 386 }
384 387
385 return page_action_vector; 388 return page_action_vector;
386 } 389 }
387 390
388 // Common code for starting an API request to the browser. |value_args| 391 // Common code for starting an API request to the browser. |value_args|
389 // contains the request's arguments. 392 // contains the request's arguments.
390 // Steals value_args contents for efficiency. 393 // Steals value_args contents for efficiency.
391 static v8::Handle<v8::Value> StartRequestCommon( 394 static v8::Handle<v8::Value> StartRequestCommon(
392 const v8::Arguments& args, ListValue* value_args) { 395 const v8::Arguments& args, ListValue* value_args, bool for_io_thread) {
393 ExtensionImpl* v8_extension = GetFromArguments<ExtensionImpl>(args); 396 ExtensionImpl* v8_extension = GetFromArguments<ExtensionImpl>(args);
394 397
395 // Get the current RenderView so that we can send a routed IPC message from 398 // Get the current RenderView so that we can send a routed IPC message from
396 // the correct source. 399 // the correct source.
397 RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext(); 400 RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext();
398 if (!renderview) 401 if (!renderview)
399 return v8::Undefined(); 402 return v8::Undefined();
400 403
401 std::string name = *v8::String::AsciiValue(args[0]); 404 std::string name = *v8::String::AsciiValue(args[0]);
402 const std::set<std::string>& function_names = 405 const std::set<std::string>& function_names =
(...skipping 20 matching lines...) Expand all
423 GetPendingRequestMap()[request_id].reset(new PendingRequest( 426 GetPendingRequestMap()[request_id].reset(new PendingRequest(
424 current_context, name)); 427 current_context, name));
425 428
426 ExtensionHostMsg_Request_Params params; 429 ExtensionHostMsg_Request_Params params;
427 params.name = name; 430 params.name = name;
428 params.arguments.Swap(value_args); 431 params.arguments.Swap(value_args);
429 params.source_url = source_url; 432 params.source_url = source_url;
430 params.request_id = request_id; 433 params.request_id = request_id;
431 params.has_callback = has_callback; 434 params.has_callback = has_callback;
432 params.user_gesture = webframe->isProcessingUserGesture(); 435 params.user_gesture = webframe->isProcessingUserGesture();
433 renderview->Send(new ExtensionHostMsg_Request( 436 if (for_io_thread) {
434 renderview->routing_id(), params)); 437 renderview->Send(new ExtensionHostMsg_RequestForIOThread(
438 renderview->routing_id(), params));
439 } else {
440 renderview->Send(new ExtensionHostMsg_Request(
441 renderview->routing_id(), params));
442 }
435 443
436 return v8::Undefined(); 444 return v8::Undefined();
437 } 445 }
438 446
439 // Starts an API request to the browser, with an optional callback. The 447 // Starts an API request to the browser, with an optional callback. The
440 // callback will be dispatched to EventBindings::HandleResponse. 448 // callback will be dispatched to EventBindings::HandleResponse.
441 static v8::Handle<v8::Value> StartRequest(const v8::Arguments& args) { 449 static v8::Handle<v8::Value> StartRequest(const v8::Arguments& args) {
442 std::string str_args = *v8::String::Utf8Value(args[1]); 450 std::string str_args = *v8::String::Utf8Value(args[1]);
443 base::JSONReader reader; 451 base::JSONReader reader;
444 scoped_ptr<Value> value_args; 452 scoped_ptr<Value> value_args;
445 value_args.reset(reader.JsonToValue(str_args, false, false)); 453 value_args.reset(reader.JsonToValue(str_args, false, false));
446 454
447 // Since we do the serialization in the v8 extension, we should always get 455 // Since we do the serialization in the v8 extension, we should always get
448 // valid JSON. 456 // valid JSON.
449 if (!value_args.get() || !value_args->IsType(Value::TYPE_LIST)) { 457 if (!value_args.get() || !value_args->IsType(Value::TYPE_LIST)) {
450 NOTREACHED() << "Invalid JSON passed to StartRequest."; 458 NOTREACHED() << "Invalid JSON passed to StartRequest.";
451 return v8::Undefined(); 459 return v8::Undefined();
452 } 460 }
453 461
454 return StartRequestCommon(args, static_cast<ListValue*>(value_args.get())); 462 return StartRequestCommon(args, static_cast<ListValue*>(value_args.get()),
463 false);
464 }
465
466 // Starts an API request to the browser, with an optional callback. The
467 // callback will be dispatched to EventBindings::HandleResponse.
468 static v8::Handle<v8::Value> StartRequestForIOThread(
Mihai Parparita -not on Chrome 2011/06/08 01:11:59 This seems very similar to StartRequest. Can the f
Matt Perry 2011/06/08 20:47:00 Done.
469 const v8::Arguments& args) {
470 std::string str_args = *v8::String::Utf8Value(args[1]);
471 base::JSONReader reader;
472 scoped_ptr<Value> value_args;
473 value_args.reset(reader.JsonToValue(str_args, false, false));
474
475 // Since we do the serialization in the v8 extension, we should always get
476 // valid JSON.
477 if (!value_args.get() || !value_args->IsType(Value::TYPE_LIST)) {
478 NOTREACHED() << "Invalid JSON passed to StartRequest.";
Mihai Parparita -not on Chrome 2011/06/08 01:11:59 If you do keep this function, the message here sho
479 return v8::Undefined();
480 }
481
482 return StartRequestCommon(args, static_cast<ListValue*>(value_args.get()),
483 true);
455 } 484 }
456 485
457 static bool ConvertImageDataToBitmapValue( 486 static bool ConvertImageDataToBitmapValue(
458 const v8::Arguments& args, Value** bitmap_value) { 487 const v8::Arguments& args, Value** bitmap_value) {
459 v8::Local<v8::Object> extension_args = args[1]->ToObject(); 488 v8::Local<v8::Object> extension_args = args[1]->ToObject();
460 v8::Local<v8::Object> details = 489 v8::Local<v8::Object> details =
461 extension_args->Get(v8::String::New("0"))->ToObject(); 490 extension_args->Get(v8::String::New("0"))->ToObject();
462 v8::Local<v8::Object> image_data = 491 v8::Local<v8::Object> image_data =
463 details->Get(v8::String::New("imageData"))->ToObject(); 492 details->Get(v8::String::New("imageData"))->ToObject();
464 v8::Local<v8::Object> data = 493 v8::Local<v8::Object> data =
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 dict->Set("imageData", bitmap_value); 542 dict->Set("imageData", bitmap_value);
514 543
515 if (details->Has(v8::String::New("tabId"))) { 544 if (details->Has(v8::String::New("tabId"))) {
516 dict->SetInteger("tabId", 545 dict->SetInteger("tabId",
517 details->Get(v8::String::New("tabId"))->Int32Value()); 546 details->Get(v8::String::New("tabId"))->Int32Value());
518 } 547 }
519 548
520 ListValue list_value; 549 ListValue list_value;
521 list_value.Append(dict); 550 list_value.Append(dict);
522 551
523 return StartRequestCommon(args, &list_value); 552 return StartRequestCommon(args, &list_value, false);
524 } 553 }
525 554
526 static v8::Handle<v8::Value> GetRenderViewId(const v8::Arguments& args) { 555 static v8::Handle<v8::Value> GetRenderViewId(const v8::Arguments& args) {
527 RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext(); 556 RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext();
528 if (!renderview) 557 if (!renderview)
529 return v8::Undefined(); 558 return v8::Undefined();
530 return v8::Integer::New(renderview->routing_id()); 559 return v8::Integer::New(renderview->routing_id());
531 } 560 }
532 561
533 static v8::Handle<v8::Value> IsExtensionProcess(const v8::Arguments& args) { 562 static v8::Handle<v8::Value> IsExtensionProcess(const v8::Arguments& args) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 if (!retval.IsEmpty() && !retval->IsUndefined()) { 603 if (!retval.IsEmpty() && !retval->IsUndefined()) {
575 std::string error = *v8::String::AsciiValue(retval); 604 std::string error = *v8::String::AsciiValue(retval);
576 DCHECK(false) << error; 605 DCHECK(false) << error;
577 } 606 }
578 #endif 607 #endif
579 608
580 request->second->context.Dispose(); 609 request->second->context.Dispose();
581 request->second->context.Clear(); 610 request->second->context.Clear();
582 pending_requests.erase(request); 611 pending_requests.erase(request);
583 } 612 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698