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

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

Issue 15841013: Make miscellaneous_bindings and event_bindings Required as needed. Previously (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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
« no previous file with comments | « chrome/renderer/extensions/dispatcher.h ('k') | chrome/renderer/extensions/event_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "chrome/renderer/extensions/dispatcher.h" 5 #include "chrome/renderer/extensions/dispatcher.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/debug/alias.h" 9 #include "base/debug/alias.h"
10 #include "base/json/json_reader.h" 10 #include "base/json/json_reader.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/string_util.h" 12 #include "base/string_util.h"
13 #include "base/strings/string_piece.h" 13 #include "base/strings/string_piece.h"
14 #include "base/strings/string_split.h" 14 #include "base/strings/string_split.h"
15 #include "base/values.h"
15 #include "chrome/common/child_process_logging.h" 16 #include "chrome/common/child_process_logging.h"
16 #include "chrome/common/chrome_switches.h" 17 #include "chrome/common/chrome_switches.h"
17 #include "chrome/common/chrome_version_info.h" 18 #include "chrome/common/chrome_version_info.h"
18 #include "chrome/common/extensions/api/extension_api.h" 19 #include "chrome/common/extensions/api/extension_api.h"
19 #include "chrome/common/extensions/background_info.h" 20 #include "chrome/common/extensions/background_info.h"
20 #include "chrome/common/extensions/extension.h" 21 #include "chrome/common/extensions/extension.h"
21 #include "chrome/common/extensions/extension_messages.h" 22 #include "chrome/common/extensions/extension_messages.h"
22 #include "chrome/common/extensions/features/base_feature_provider.h" 23 #include "chrome/common/extensions/features/base_feature_provider.h"
23 #include "chrome/common/extensions/features/feature.h" 24 #include "chrome/common/extensions/features/feature.h"
24 #include "chrome/common/extensions/manifest.h" 25 #include "chrome/common/extensions/manifest.h"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 using WebKit::WebView; 93 using WebKit::WebView;
93 using content::RenderThread; 94 using content::RenderThread;
94 using content::RenderView; 95 using content::RenderView;
95 96
96 namespace extensions { 97 namespace extensions {
97 98
98 namespace { 99 namespace {
99 100
100 static const int64 kInitialExtensionIdleHandlerDelayMs = 5*1000; 101 static const int64 kInitialExtensionIdleHandlerDelayMs = 5*1000;
101 static const int64 kMaxExtensionIdleHandlerDelayMs = 5*60*1000; 102 static const int64 kMaxExtensionIdleHandlerDelayMs = 5*60*1000;
102 static const char kEventDispatchFunction[] = "Event.dispatchEvent"; 103 static const char kEventModule[] = "event_bindings";
104 static const char kEventDispatchFunction[] = "dispatchEvent";
103 static const char kOnSuspendEvent[] = "runtime.onSuspend"; 105 static const char kOnSuspendEvent[] = "runtime.onSuspend";
104 static const char kOnSuspendCanceledEvent[] = "runtime.onSuspendCanceled"; 106 static const char kOnSuspendCanceledEvent[] = "runtime.onSuspendCanceled";
105 107
106 static v8::Handle<v8::Object> GetOrCreateChrome( 108 static v8::Handle<v8::Object> GetOrCreateChrome(
107 v8::Handle<v8::Context> context) { 109 v8::Handle<v8::Context> context) {
108 v8::Handle<v8::String> chrome_string(v8::String::New("chrome")); 110 v8::Handle<v8::String> chrome_string(v8::String::New("chrome"));
109 v8::Handle<v8::Object> global(context->Global()); 111 v8::Handle<v8::Object> global(context->Global());
110 v8::Handle<v8::Value> chrome(global->Get(chrome_string)); 112 v8::Handle<v8::Value> chrome(global->Get(chrome_string));
111 if (chrome.IsEmpty() || chrome->IsUndefined()) { 113 if (chrome.IsEmpty() || chrome->IsUndefined()) {
112 v8::Handle<v8::Object> chrome_object(v8::Object::New()); 114 v8::Handle<v8::Object> chrome_object(v8::Object::New());
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 base::Unretained(this))); 323 base::Unretained(this)));
322 RouteFunction("InIncognitoContext", 324 RouteFunction("InIncognitoContext",
323 base::Bind(&ProcessInfoNativeHandler::InIncognitoContext, 325 base::Bind(&ProcessInfoNativeHandler::InIncognitoContext,
324 base::Unretained(this))); 326 base::Unretained(this)));
325 RouteFunction("GetManifestVersion", 327 RouteFunction("GetManifestVersion",
326 base::Bind(&ProcessInfoNativeHandler::GetManifestVersion, 328 base::Bind(&ProcessInfoNativeHandler::GetManifestVersion,
327 base::Unretained(this))); 329 base::Unretained(this)));
328 RouteFunction("IsSendRequestDisabled", 330 RouteFunction("IsSendRequestDisabled",
329 base::Bind(&ProcessInfoNativeHandler::IsSendRequestDisabled, 331 base::Bind(&ProcessInfoNativeHandler::IsSendRequestDisabled,
330 base::Unretained(this))); 332 base::Unretained(this)));
333 RouteFunction("Log",
334 base::Bind(&ProcessInfoNativeHandler::Log, base::Unretained(this)));
331 } 335 }
332 336
333 v8::Handle<v8::Value> GetExtensionId(const v8::Arguments& args) { 337 v8::Handle<v8::Value> GetExtensionId(const v8::Arguments& args) {
334 return v8::String::New(extension_id_.c_str()); 338 return v8::String::New(extension_id_.c_str());
335 } 339 }
336 340
337 v8::Handle<v8::Value> GetContextType(const v8::Arguments& args) { 341 v8::Handle<v8::Value> GetContextType(const v8::Arguments& args) {
338 return v8::String::New(context_type_.c_str()); 342 return v8::String::New(context_type_.c_str());
339 } 343 }
340 344
341 v8::Handle<v8::Value> InIncognitoContext(const v8::Arguments& args) { 345 v8::Handle<v8::Value> InIncognitoContext(const v8::Arguments& args) {
342 return v8::Boolean::New(is_incognito_context_); 346 return v8::Boolean::New(is_incognito_context_);
343 } 347 }
344 348
345 v8::Handle<v8::Value> GetManifestVersion(const v8::Arguments& args) { 349 v8::Handle<v8::Value> GetManifestVersion(const v8::Arguments& args) {
346 return v8::Integer::New(manifest_version_); 350 return v8::Integer::New(manifest_version_);
347 } 351 }
348 352
349 v8::Handle<v8::Value> IsSendRequestDisabled(const v8::Arguments& args) { 353 v8::Handle<v8::Value> IsSendRequestDisabled(const v8::Arguments& args) {
350 if (send_request_disabled_) { 354 if (send_request_disabled_) {
351 return v8::String::New( 355 return v8::String::New(
352 "sendRequest and onRequest are obsolete." 356 "sendRequest and onRequest are obsolete."
353 " Please use sendMessage and onMessage instead."); 357 " Please use sendMessage and onMessage instead.");
354 } 358 }
355 return v8::Undefined(); 359 return v8::Undefined();
356 } 360 }
357 361
362 v8::Handle<v8::Value> Log(const v8::Arguments& args) {
363 LOG(WARNING) << *v8::String::AsciiValue(args[0]);
364 return v8::Undefined();
365 }
366
358 private: 367 private:
359 std::string extension_id_; 368 std::string extension_id_;
360 std::string context_type_; 369 std::string context_type_;
361 bool is_incognito_context_; 370 bool is_incognito_context_;
362 int manifest_version_; 371 int manifest_version_;
363 bool send_request_disabled_; 372 bool send_request_disabled_;
364 }; 373 };
365 374
366 class LoggingNativeHandler : public ObjectBackedNativeHandler { 375 class LoggingNativeHandler : public ObjectBackedNativeHandler {
367 public: 376 public:
368 explicit LoggingNativeHandler(v8::Handle<v8::Context> context) 377 explicit LoggingNativeHandler(v8::Handle<v8::Context> context)
369 : ObjectBackedNativeHandler(context) { 378 : ObjectBackedNativeHandler(context) {
370 RouteFunction("DCHECK", 379 RouteFunction("DCHECK",
371 base::Bind(&LoggingNativeHandler::Dcheck, base::Unretained(this))); 380 base::Bind(&LoggingNativeHandler::Dcheck, base::Unretained(this)));
372 RouteFunction("CHECK", 381 RouteFunction("CHECK",
373 base::Bind(&LoggingNativeHandler::Check, base::Unretained(this))); 382 base::Bind(&LoggingNativeHandler::Check, base::Unretained(this)));
383 RouteFunction("DCHECK_IS_ON",
384 base::Bind(&LoggingNativeHandler::DcheckIsOn, base::Unretained(this)));
374 } 385 }
375 386
376 v8::Handle<v8::Value> Check(const v8::Arguments& args) { 387 v8::Handle<v8::Value> Check(const v8::Arguments& args) {
377 bool check_value; 388 bool check_value;
378 std::string error_message; 389 std::string error_message;
379 ParseArgs(args, &check_value, &error_message); 390 ParseArgs(args, &check_value, &error_message);
380 CHECK(check_value) << error_message; 391 CHECK(check_value) << error_message;
381 return v8::Undefined(); 392 return v8::Undefined();
382 } 393 }
383 394
384 v8::Handle<v8::Value> Dcheck(const v8::Arguments& args) { 395 v8::Handle<v8::Value> Dcheck(const v8::Arguments& args) {
385 bool check_value; 396 bool check_value;
386 std::string error_message; 397 std::string error_message;
387 ParseArgs(args, &check_value, &error_message); 398 ParseArgs(args, &check_value, &error_message);
388 DCHECK(check_value) << error_message; 399 DCHECK(check_value) << error_message;
389 return v8::Undefined(); 400 return v8::Undefined();
390 } 401 }
391 402
403 v8::Handle<v8::Value> DcheckIsOn(const v8::Arguments& args) {
404 return v8::Boolean::New(DCHECK_IS_ON());
405 }
406
392 private: 407 private:
393 void ParseArgs(const v8::Arguments& args, 408 void ParseArgs(const v8::Arguments& args,
394 bool* check_value, 409 bool* check_value,
395 std::string* error_message) { 410 std::string* error_message) {
396 CHECK_LE(args.Length(), 2); 411 CHECK_LE(args.Length(), 2);
397 *check_value = args[0]->BooleanValue(); 412 *check_value = args[0]->BooleanValue();
398 if (args.Length() == 2) 413 if (args.Length() == 2)
399 *error_message = "Error: " + std::string( 414 *error_message = "Error: " + std::string(
400 *v8::String::AsciiValue(args[1])); 415 *v8::String::AsciiValue(args[1]));
401 416
(...skipping 20 matching lines...) Expand all
422 return dflt; 437 return dflt;
423 std::string ascii_value = *v8::String::AsciiValue(v8_string); 438 std::string ascii_value = *v8::String::AsciiValue(v8_string);
424 return ascii_value.empty() ? dflt : ascii_value; 439 return ascii_value.empty() ? dflt : ascii_value;
425 } 440 }
426 }; 441 };
427 442
428 void InstallAppBindings(ModuleSystem* module_system, 443 void InstallAppBindings(ModuleSystem* module_system,
429 v8::Handle<v8::Object> chrome, 444 v8::Handle<v8::Object> chrome,
430 v8::Handle<v8::Object> chrome_hidden) { 445 v8::Handle<v8::Object> chrome_hidden) {
431 module_system->SetLazyField(chrome, "app", "app", "chromeApp"); 446 module_system->SetLazyField(chrome, "app", "app", "chromeApp");
432 module_system->SetLazyField(chrome_hidden, "app", "app",
433 "chromeHiddenApp");
434 } 447 }
435 448
436 void InstallWebstoreBindings(ModuleSystem* module_system, 449 void InstallWebstoreBindings(ModuleSystem* module_system,
437 v8::Handle<v8::Object> chrome, 450 v8::Handle<v8::Object> chrome,
438 v8::Handle<v8::Object> chrome_hidden) { 451 v8::Handle<v8::Object> chrome_hidden) {
439 module_system->SetLazyField(chrome, "webstore", "webstore", "chromeWebstore"); 452 module_system->SetLazyField(chrome, "webstore", "webstore", "chromeWebstore");
440 module_system->SetLazyField(chrome_hidden, "webstore", "webstore", 453 module_system->SetLazyField(chrome_hidden, "webstore", "webstore",
441 "chromeHiddenWebstore"); 454 "chromeHiddenWebstore");
442 } 455 }
443 456
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 for (size_t i = 0; i < names.size(); ++i) 556 for (size_t i = 0; i < names.size(); ++i)
544 function_names_.insert(names[i]); 557 function_names_.insert(names[i]);
545 } 558 }
546 559
547 void Dispatcher::OnSetChannel(int channel) { 560 void Dispatcher::OnSetChannel(int channel) {
548 Feature::SetCurrentChannel( 561 Feature::SetCurrentChannel(
549 static_cast<chrome::VersionInfo::Channel>(channel)); 562 static_cast<chrome::VersionInfo::Channel>(channel));
550 } 563 }
551 564
552 void Dispatcher::OnMessageInvoke(const std::string& extension_id, 565 void Dispatcher::OnMessageInvoke(const std::string& extension_id,
566 const std::string& module_name,
553 const std::string& function_name, 567 const std::string& function_name,
554 const base::ListValue& args, 568 const base::ListValue& args,
555 bool user_gesture) { 569 bool user_gesture) {
556 scoped_ptr<WebScopedUserGesture> web_user_gesture; 570 scoped_ptr<WebScopedUserGesture> web_user_gesture;
557 if (user_gesture) { 571 if (user_gesture) {
558 web_user_gesture.reset(new WebScopedUserGesture); 572 web_user_gesture.reset(new WebScopedUserGesture);
559 } 573 }
560 574
561 v8_context_set_.DispatchChromeHiddenMethod( 575 v8_context_set_.ForEach(
562 extension_id, function_name, args, NULL); 576 extension_id,
577 NULL,
578 base::Bind(&CallModuleMethod, module_name, function_name, &args));
563 579
564 // Reset the idle handler each time there's any activity like event or message 580 // Reset the idle handler each time there's any activity like event or message
565 // dispatch, for which Invoke is the chokepoint. 581 // dispatch, for which Invoke is the chokepoint.
566 if (is_extension_process_) { 582 if (is_extension_process_) {
567 RenderThread::Get()->ScheduleIdleHandler( 583 RenderThread::Get()->ScheduleIdleHandler(
568 kInitialExtensionIdleHandlerDelayMs); 584 kInitialExtensionIdleHandlerDelayMs);
569 } 585 }
570 586
571 // Tell the browser process when an event has been dispatched with a lazy 587 // Tell the browser process when an event has been dispatched with a lazy
572 // background page active. 588 // background page active.
573 const Extension* extension = extensions_.GetByID(extension_id); 589 const Extension* extension = extensions_.GetByID(extension_id);
574 if (extension && BackgroundInfo::HasLazyBackgroundPage(extension) && 590 if (extension && BackgroundInfo::HasLazyBackgroundPage(extension) &&
591 module_name == kEventModule &&
575 function_name == kEventDispatchFunction) { 592 function_name == kEventDispatchFunction) {
576 RenderView* background_view = 593 RenderView* background_view =
577 ExtensionHelper::GetBackgroundPage(extension_id); 594 ExtensionHelper::GetBackgroundPage(extension_id);
578 if (background_view) { 595 if (background_view) {
579 background_view->Send(new ExtensionHostMsg_EventAck( 596 background_view->Send(new ExtensionHostMsg_EventAck(
580 background_view->GetRoutingID())); 597 background_view->GetRoutingID()));
581 } 598 }
582 } 599 }
583 } 600 }
584 601
585 void Dispatcher::OnDispatchOnConnect( 602 void Dispatcher::OnDispatchOnConnect(
586 int target_port_id, 603 int target_port_id,
587 const std::string& channel_name, 604 const std::string& channel_name,
588 const base::DictionaryValue& source_tab, 605 const base::DictionaryValue& source_tab,
589 const ExtensionMsg_ExternalConnectionInfo& info) { 606 const ExtensionMsg_ExternalConnectionInfo& info) {
590 MiscellaneousBindings::DispatchOnConnect( 607 MiscellaneousBindings::DispatchOnConnect(
591 v8_context_set_.GetAll(), 608 v8_context_set_.GetAll(),
592 target_port_id, channel_name, source_tab, 609 target_port_id, channel_name, source_tab,
593 info.source_id, info.target_id, info.source_url, 610 info.source_id, info.target_id, info.source_url,
594 NULL); // All render views. 611 NULL); // All render views.
595 } 612 }
596 613
597 void Dispatcher::OnDeliverMessage(int target_port_id, 614 void Dispatcher::OnDeliverMessage(int target_port_id,
598 const std::string& message) { 615 const base::ListValue& message) {
599 MiscellaneousBindings::DeliverMessage( 616 MiscellaneousBindings::DeliverMessage(
600 v8_context_set_.GetAll(), 617 v8_context_set_.GetAll(),
601 target_port_id, 618 target_port_id,
602 message, 619 message,
603 NULL); // All render views. 620 NULL); // All render views.
604 } 621 }
605 622
606 void Dispatcher::OnDispatchOnDisconnect(int port_id, 623 void Dispatcher::OnDispatchOnDisconnect(int port_id,
607 const std::string& error_message) { 624 const std::string& error_message) {
608 MiscellaneousBindings::DispatchOnDisconnect( 625 MiscellaneousBindings::DispatchOnDisconnect(
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
784 api_name, 801 api_name,
785 "binding"); 802 "binding");
786 } 803 }
787 } 804 }
788 } 805 }
789 806
790 void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system, 807 void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system,
791 ChromeV8Context* context) { 808 ChromeV8Context* context) {
792 v8::Handle<v8::Context> v8_context = context->v8_context(); 809 v8::Handle<v8::Context> v8_context = context->v8_context();
793 810
794 module_system->RegisterNativeHandler("event_bindings", 811 module_system->RegisterNativeHandler("event_natives",
795 scoped_ptr<NativeHandler>(EventBindings::Create(this, v8_context))); 812 scoped_ptr<NativeHandler>(EventBindings::Create(this, v8_context)));
796 module_system->RegisterNativeHandler("miscellaneous_bindings", 813 module_system->RegisterNativeHandler("miscellaneous_bindings_natives",
797 scoped_ptr<NativeHandler>(MiscellaneousBindings::Get(this, v8_context))); 814 scoped_ptr<NativeHandler>(MiscellaneousBindings::Get(this, v8_context)));
798 module_system->RegisterNativeHandler("apiDefinitions", 815 module_system->RegisterNativeHandler("apiDefinitions",
799 scoped_ptr<NativeHandler>(new ApiDefinitionsNatives(this, context))); 816 scoped_ptr<NativeHandler>(new ApiDefinitionsNatives(this, context)));
800 module_system->RegisterNativeHandler("sendRequest", 817 module_system->RegisterNativeHandler("sendRequest",
801 scoped_ptr<NativeHandler>( 818 scoped_ptr<NativeHandler>(
802 new SendRequestNatives(this, request_sender_.get(), context))); 819 new SendRequestNatives(this, request_sender_.get(), context)));
803 module_system->RegisterNativeHandler("setIcon", 820 module_system->RegisterNativeHandler("setIcon",
804 scoped_ptr<NativeHandler>( 821 scoped_ptr<NativeHandler>(
805 new SetIconNatives(this, request_sender_.get(), context))); 822 new SetIconNatives(this, request_sender_.get(), context)));
806 module_system->RegisterNativeHandler( 823 module_system->RegisterNativeHandler(
807 "contentWatcherNative", 824 "contentWatcherNative",
808 content_watcher_->MakeNatives(v8_context)); 825 content_watcher_->MakeNatives(v8_context));
809 module_system->RegisterNativeHandler("activityLogger", 826 module_system->RegisterNativeHandler("activityLogger",
810 scoped_ptr<NativeHandler>(new APIActivityLogger(this, v8_context))); 827 scoped_ptr<NativeHandler>(new APIActivityLogger(this, v8_context)));
811 828
812 // Natives used by multiple APIs. 829 // Natives used by multiple APIs.
813 module_system->RegisterNativeHandler("file_system_natives", 830 module_system->RegisterNativeHandler("file_system_natives",
814 scoped_ptr<NativeHandler>(new FileSystemNatives(v8_context))); 831 scoped_ptr<NativeHandler>(new FileSystemNatives(v8_context)));
815 832
816 // Custom bindings. 833 // Custom bindings.
817 module_system->RegisterNativeHandler("app", 834 module_system->RegisterNativeHandler("app",
818 scoped_ptr<NativeHandler>(new AppBindings(this, context))); 835 scoped_ptr<NativeHandler>(new AppBindings(this, context)));
819 module_system->RegisterNativeHandler("app_runtime", 836 module_system->RegisterNativeHandler("app_runtime",
820 scoped_ptr<NativeHandler>( 837 scoped_ptr<NativeHandler>(
821 new AppRuntimeCustomBindings(this, v8_context))); 838 new AppRuntimeCustomBindings(this, v8_context)));
822 module_system->RegisterNativeHandler("app_window", 839 module_system->RegisterNativeHandler("app_window_natives",
823 scoped_ptr<NativeHandler>( 840 scoped_ptr<NativeHandler>(
824 new AppWindowCustomBindings(this, v8_context))); 841 new AppWindowCustomBindings(this, v8_context)));
825 module_system->RegisterNativeHandler("context_menus", 842 module_system->RegisterNativeHandler("context_menus",
826 scoped_ptr<NativeHandler>( 843 scoped_ptr<NativeHandler>(
827 new ContextMenusCustomBindings(this, v8_context))); 844 new ContextMenusCustomBindings(this, v8_context)));
828 module_system->RegisterNativeHandler("extension", 845 module_system->RegisterNativeHandler("extension",
829 scoped_ptr<NativeHandler>( 846 scoped_ptr<NativeHandler>(
830 new ExtensionCustomBindings(this, v8_context))); 847 new ExtensionCustomBindings(this, v8_context)));
831 module_system->RegisterNativeHandler("sync_file_system", 848 module_system->RegisterNativeHandler("sync_file_system",
832 scoped_ptr<NativeHandler>( 849 scoped_ptr<NativeHandler>(
(...skipping 23 matching lines...) Expand all
856 module_system->RegisterNativeHandler("tts", 873 module_system->RegisterNativeHandler("tts",
857 scoped_ptr<NativeHandler>(new TTSCustomBindings(this, v8_context))); 874 scoped_ptr<NativeHandler>(new TTSCustomBindings(this, v8_context)));
858 module_system->RegisterNativeHandler("web_request", 875 module_system->RegisterNativeHandler("web_request",
859 scoped_ptr<NativeHandler>( 876 scoped_ptr<NativeHandler>(
860 new WebRequestCustomBindings(this, v8_context))); 877 new WebRequestCustomBindings(this, v8_context)));
861 module_system->RegisterNativeHandler("webstore", 878 module_system->RegisterNativeHandler("webstore",
862 scoped_ptr<NativeHandler>(new WebstoreBindings(this, context))); 879 scoped_ptr<NativeHandler>(new WebstoreBindings(this, context)));
863 } 880 }
864 881
865 void Dispatcher::PopulateSourceMap() { 882 void Dispatcher::PopulateSourceMap() {
866 source_map_.RegisterSource("event_bindings", IDR_EVENT_BINDINGS_JS); 883 // Libraries.
867 source_map_.RegisterSource("miscellaneous_bindings", 884 source_map_.RegisterSource("contentWatcher", IDR_CONTENT_WATCHER_JS);
868 IDR_MISCELLANEOUS_BINDINGS_JS); 885 source_map_.RegisterSource("entryIdManager", IDR_ENTRY_ID_MANAGER);
886 source_map_.RegisterSource(kEventModule, IDR_EVENT_BINDINGS_JS);
887 source_map_.RegisterSource("imageUtil", IDR_IMAGE_UTIL_JS);
869 source_map_.RegisterSource("json", IDR_JSON_JS); 888 source_map_.RegisterSource("json", IDR_JSON_JS);
870 source_map_.RegisterSource("json_schema", IDR_JSON_SCHEMA_JS); 889 source_map_.RegisterSource("json_schema", IDR_JSON_SCHEMA_JS);
871 source_map_.RegisterSource("test", IDR_TEST_CUSTOM_BINDINGS_JS);
872
873 // Libraries.
874 source_map_.RegisterSource("contentWatcher", IDR_CONTENT_WATCHER_JS);
875 source_map_.RegisterSource("imageUtil", IDR_IMAGE_UTIL_JS);
876 source_map_.RegisterSource("lastError", IDR_LAST_ERROR_JS); 890 source_map_.RegisterSource("lastError", IDR_LAST_ERROR_JS);
891 source_map_.RegisterSource("miscellaneous_bindings",
892 IDR_MISCELLANEOUS_BINDINGS_JS);
893 source_map_.RegisterSource("on_unload", IDR_ON_UNLOAD_JS);
877 source_map_.RegisterSource("schemaUtils", IDR_SCHEMA_UTILS_JS); 894 source_map_.RegisterSource("schemaUtils", IDR_SCHEMA_UTILS_JS);
878 source_map_.RegisterSource("sendRequest", IDR_SEND_REQUEST_JS); 895 source_map_.RegisterSource("sendRequest", IDR_SEND_REQUEST_JS);
879 source_map_.RegisterSource("setIcon", IDR_SET_ICON_JS); 896 source_map_.RegisterSource("setIcon", IDR_SET_ICON_JS);
897 source_map_.RegisterSource("test", IDR_TEST_CUSTOM_BINDINGS_JS);
880 source_map_.RegisterSource("utils", IDR_UTILS_JS); 898 source_map_.RegisterSource("utils", IDR_UTILS_JS);
881 source_map_.RegisterSource("entryIdManager", IDR_ENTRY_ID_MANAGER);
882 899
883 // Custom bindings. 900 // Custom bindings.
884 source_map_.RegisterSource("app", IDR_APP_CUSTOM_BINDINGS_JS); 901 source_map_.RegisterSource("app", IDR_APP_CUSTOM_BINDINGS_JS);
885 source_map_.RegisterSource("app.runtime", IDR_APP_RUNTIME_CUSTOM_BINDINGS_JS); 902 source_map_.RegisterSource("app.runtime", IDR_APP_RUNTIME_CUSTOM_BINDINGS_JS);
886 source_map_.RegisterSource("app.window", IDR_APP_WINDOW_CUSTOM_BINDINGS_JS); 903 source_map_.RegisterSource("app.window", IDR_APP_WINDOW_CUSTOM_BINDINGS_JS);
887 source_map_.RegisterSource("bluetooth", IDR_BLUETOOTH_CUSTOM_BINDINGS_JS); 904 source_map_.RegisterSource("bluetooth", IDR_BLUETOOTH_CUSTOM_BINDINGS_JS);
888 source_map_.RegisterSource("browserAction", 905 source_map_.RegisterSource("browserAction",
889 IDR_BROWSER_ACTION_CUSTOM_BINDINGS_JS); 906 IDR_BROWSER_ACTION_CUSTOM_BINDINGS_JS);
890 source_map_.RegisterSource("contextMenus", 907 source_map_.RegisterSource("contextMenus",
891 IDR_CONTEXT_MENUS_CUSTOM_BINDINGS_JS); 908 IDR_CONTEXT_MENUS_CUSTOM_BINDINGS_JS);
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 ExtensionURLInfo url_info(frame->document().securityOrigin(), 1028 ExtensionURLInfo url_info(frame->document().securityOrigin(),
1012 UserScriptSlave::GetDataSourceURLForFrame(frame)); 1029 UserScriptSlave::GetDataSourceURLForFrame(frame));
1013 1030
1014 Feature::Context context_type = 1031 Feature::Context context_type =
1015 ClassifyJavaScriptContext(extension_id, extension_group, url_info); 1032 ClassifyJavaScriptContext(extension_id, extension_group, url_info);
1016 1033
1017 ChromeV8Context* context = 1034 ChromeV8Context* context =
1018 new ChromeV8Context(v8_context, frame, extension, context_type); 1035 new ChromeV8Context(v8_context, frame, extension, context_type);
1019 v8_context_set_.Add(context); 1036 v8_context_set_.Add(context);
1020 1037
1021 scoped_ptr<ModuleSystem> module_system(new ModuleSystem(v8_context, 1038 scoped_ptr<ModuleSystem> module_system(
1022 &source_map_)); 1039 new ModuleSystem(context, &source_map_));
1023 // Enable natives in startup. 1040 // Enable natives in startup.
1024 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system.get()); 1041 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system.get());
1025 1042
1026 RegisterNativeHandlers(module_system.get(), context); 1043 RegisterNativeHandlers(module_system.get(), context);
1027 1044
1028 module_system->RegisterNativeHandler("chrome", 1045 module_system->RegisterNativeHandler("chrome",
1029 scoped_ptr<NativeHandler>(new ChromeNativeHandler(v8_context))); 1046 scoped_ptr<NativeHandler>(new ChromeNativeHandler(v8_context)));
1030 module_system->RegisterNativeHandler("chrome_hidden", 1047 module_system->RegisterNativeHandler("chrome_hidden",
1031 scoped_ptr<NativeHandler>(new ChromeHiddenNativeHandler(v8_context))); 1048 scoped_ptr<NativeHandler>(new ChromeHiddenNativeHandler(v8_context)));
1032 module_system->RegisterNativeHandler("print", 1049 module_system->RegisterNativeHandler("print",
(...skipping 29 matching lines...) Expand all
1062 switch (context_type) { 1079 switch (context_type) {
1063 case Feature::UNSPECIFIED_CONTEXT: 1080 case Feature::UNSPECIFIED_CONTEXT:
1064 case Feature::WEB_PAGE_CONTEXT: 1081 case Feature::WEB_PAGE_CONTEXT:
1065 // TODO(kalman): see comment below about ExtensionAPI. 1082 // TODO(kalman): see comment below about ExtensionAPI.
1066 InstallBindings(module_system.get(), v8_context, "app"); 1083 InstallBindings(module_system.get(), v8_context, "app");
1067 InstallBindings(module_system.get(), v8_context, "webstore"); 1084 InstallBindings(module_system.get(), v8_context, "webstore");
1068 break; 1085 break;
1069 case Feature::BLESSED_EXTENSION_CONTEXT: 1086 case Feature::BLESSED_EXTENSION_CONTEXT:
1070 case Feature::UNBLESSED_EXTENSION_CONTEXT: 1087 case Feature::UNBLESSED_EXTENSION_CONTEXT:
1071 case Feature::CONTENT_SCRIPT_CONTEXT: 1088 case Feature::CONTENT_SCRIPT_CONTEXT:
1072 if (extension && !extension->is_platform_app())
1073 module_system->Require("miscellaneous_bindings");
1074 module_system->Require("json"); // see paranoid comment in json.js 1089 module_system->Require("json"); // see paranoid comment in json.js
1075 1090
1076 // TODO(kalman): move this code back out of the switch and execute it 1091 // TODO(kalman): move this code back out of the switch and execute it
1077 // regardless of |context_type|. ExtensionAPI knows how to return the 1092 // regardless of |context_type|. ExtensionAPI knows how to return the
1078 // correct APIs, however, until it doesn't have a 2MB overhead we can't 1093 // correct APIs, however, until it doesn't have a 2MB overhead we can't
1079 // load it in every process. 1094 // load it in every process.
1080 RegisterSchemaGeneratedBindings(module_system.get(), context); 1095 RegisterSchemaGeneratedBindings(module_system.get(), context);
1081 break; 1096 break;
1082 } 1097 }
1083 1098
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 1365
1351 void Dispatcher::OnSuspend(const std::string& extension_id) { 1366 void Dispatcher::OnSuspend(const std::string& extension_id) {
1352 // Dispatch the suspend event. This doesn't go through the standard event 1367 // Dispatch the suspend event. This doesn't go through the standard event
1353 // dispatch machinery because it requires special handling. We need to let 1368 // dispatch machinery because it requires special handling. We need to let
1354 // the browser know when we are starting and stopping the event dispatch, so 1369 // the browser know when we are starting and stopping the event dispatch, so
1355 // that it still considers the extension idle despite any activity the suspend 1370 // that it still considers the extension idle despite any activity the suspend
1356 // event creates. 1371 // event creates.
1357 base::ListValue args; 1372 base::ListValue args;
1358 args.Set(0, new base::StringValue(kOnSuspendEvent)); 1373 args.Set(0, new base::StringValue(kOnSuspendEvent));
1359 args.Set(1, new base::ListValue()); 1374 args.Set(1, new base::ListValue());
1360 v8_context_set_.DispatchChromeHiddenMethod( 1375 v8_context_set_.ForEach(
1361 extension_id, kEventDispatchFunction, args, NULL); 1376 extension_id,
1362 1377 NULL,
1378 base::Bind(&CallModuleMethod,
1379 kEventModule,
1380 kEventDispatchFunction,
1381 &args));
1363 RenderThread::Get()->Send(new ExtensionHostMsg_SuspendAck(extension_id)); 1382 RenderThread::Get()->Send(new ExtensionHostMsg_SuspendAck(extension_id));
1364 } 1383 }
1365 1384
1366 void Dispatcher::OnCancelSuspend(const std::string& extension_id) { 1385 void Dispatcher::OnCancelSuspend(const std::string& extension_id) {
1367 base::ListValue args; 1386 base::ListValue args;
1368 args.Set(0, new base::StringValue(kOnSuspendCanceledEvent)); 1387 args.Set(0, new base::StringValue(kOnSuspendCanceledEvent));
1369 args.Set(1, new base::ListValue()); 1388 args.Set(1, new base::ListValue());
1370 v8_context_set_.DispatchChromeHiddenMethod( 1389 v8_context_set_.ForEach(
1371 extension_id, kEventDispatchFunction, args, NULL); 1390 extension_id,
1391 NULL,
1392 base::Bind(&CallModuleMethod,
1393 kEventModule,
1394 kEventDispatchFunction,
1395 &args));
1372 } 1396 }
1373 1397
1374 Feature::Context Dispatcher::ClassifyJavaScriptContext( 1398 Feature::Context Dispatcher::ClassifyJavaScriptContext(
1375 const std::string& extension_id, 1399 const std::string& extension_id,
1376 int extension_group, 1400 int extension_group,
1377 const ExtensionURLInfo& url_info) { 1401 const ExtensionURLInfo& url_info) {
1378 if (extension_group == EXTENSION_GROUP_CONTENT_SCRIPTS) { 1402 if (extension_group == EXTENSION_GROUP_CONTENT_SCRIPTS) {
1379 return extensions_.Contains(extension_id) ? 1403 return extensions_.Contains(extension_id) ?
1380 Feature::CONTENT_SCRIPT_CONTEXT : Feature::UNSPECIFIED_CONTEXT; 1404 Feature::CONTENT_SCRIPT_CONTEXT : Feature::UNSPECIFIED_CONTEXT;
1381 } 1405 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1457 "%s cannot be used within a sandboxed frame."; 1481 "%s cannot be used within a sandboxed frame.";
1458 std::string error_msg = base::StringPrintf(kMessage, function_name.c_str()); 1482 std::string error_msg = base::StringPrintf(kMessage, function_name.c_str());
1459 v8::ThrowException( 1483 v8::ThrowException(
1460 v8::Exception::Error(v8::String::New(error_msg.c_str()))); 1484 v8::Exception::Error(v8::String::New(error_msg.c_str())));
1461 return false; 1485 return false;
1462 } 1486 }
1463 1487
1464 return true; 1488 return true;
1465 } 1489 }
1466 1490
1491 // static
1492 void Dispatcher::CallModuleMethod(const std::string& module_name,
1493 const std::string& method_name,
1494 const base::ListValue* args,
1495 ChromeV8Context* context) {
1496 v8::HandleScope handle_scope;
1497 v8::Context::Scope context_scope(context->v8_context());
1498
1499 scoped_ptr<content::V8ValueConverter> converter(
1500 content::V8ValueConverter::create());
1501
1502 std::vector<v8::Handle<v8::Value> > arguments;
1503 for (base::ListValue::const_iterator it = args->begin(); it != args->end();
1504 ++it) {
1505 arguments.push_back(converter->ToV8Value(*it, context->v8_context()));
1506 }
1507
1508 context->module_system()->CallModuleMethod(
1509 module_name, method_name, &arguments);
1510 }
1511
1467 } // namespace extensions 1512 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/renderer/extensions/dispatcher.h ('k') | chrome/renderer/extensions/event_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698