OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |