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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/extension_event_router_forwarder.h" 6 7 #include "chrome/browser/browser_process.h" 8 #include "chrome/browser/extensions/extension_event_router.h" 9 #include "chrome/browser/profiles/profile_manager.h" 10 #include "googleurl/src/gurl.h" 11 12 ExtensionEventRouterForwarder::ExtensionEventRouterForwarder() { 13 } 14 15 ExtensionEventRouterForwarder::~ExtensionEventRouterForwarder() { 16 } 17 18 void ExtensionEventRouterForwarder::BroadcastEventToRenderers( 19 const std::string& event_name, const std::string& event_args, 20 const GURL& event_url) { 21 HandleEvent("", event_name, event_args, 0, true, event_url); 22 } 23 24 void ExtensionEventRouterForwarder::DispatchEventToRenderers( 25 const std::string& event_name, const std::string& event_args, 26 ProfileId profile_id, bool use_profile_to_restrict_events, 27 const GURL& event_url) { 28 if (profile_id == Profile::kInvalidProfileId) 29 return; 30 HandleEvent("", event_name, event_args, profile_id, 31 use_profile_to_restrict_events, event_url); 32 } 33 34 void ExtensionEventRouterForwarder::BroadcastEventToExtension( 35 const std::string& extension_id, 36 const std::string& event_name, const std::string& event_args, 37 const GURL& event_url) { 38 HandleEvent(extension_id, event_name, event_args, 0, true, event_url); 39 } 40 41 void ExtensionEventRouterForwarder::DispatchEventToExtension( 42 const std::string& extension_id, 43 const std::string& event_name, const std::string& event_args, 44 ProfileId profile_id, bool use_profile_to_restrict_events, 45 const GURL& event_url) { 46 if (profile_id == Profile::kInvalidProfileId) 47 return; 48 HandleEvent(extension_id, event_name, event_args, profile_id, 49 use_profile_to_restrict_events, event_url); 50 } 51 52 void ExtensionEventRouterForwarder::HandleEvent( 53 const std::string& extension_id, 54 const std::string& event_name, const std::string& event_args, 55 ProfileId profile_id, bool use_profile_to_restrict_events, 56 const GURL& event_url) { 57 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 58 BrowserThread::PostTask( 59 BrowserThread::UI, FROM_HERE, 60 NewRunnableMethod( 61 this, 62 &ExtensionEventRouterForwarder::HandleEvent, 63 extension_id, event_name, event_args, profile_id, 64 use_profile_to_restrict_events, event_url)); 65 return; 66 } 67 68 if (!g_browser_process || !g_browser_process->profile_manager()) 69 return; 70 71 ProfileManager* profile_manager = g_browser_process->profile_manager(); 72 Profile* profile = NULL; 73 if (profile_id != Profile::kInvalidProfileId) { 74 profile = profile_manager->GetProfileWithId(profile_id); 75 if (!profile) 76 return; 77 } 78 if (profile) { 79 CallExtensionEventRouter( 80 profile, extension_id, event_name, event_args, 81 use_profile_to_restrict_events ? profile : NULL, event_url); 82 } else { 83 std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles()); 84 for (size_t i = 0; i < profiles.size(); ++i) { 85 CallExtensionEventRouter( 86 profiles[i], extension_id, event_name, event_args, 87 use_profile_to_restrict_events ? profiles[i] : NULL, event_url); 88 } 89 } 90 } 91 92 void ExtensionEventRouterForwarder::CallExtensionEventRouter( 93 Profile* profile, const std::string& extension_id, 94 const std::string& event_name, const std::string& event_args, 95 Profile* restrict_to_profile, const GURL& event_url) { 96 #if defined(OS_CHROMEOS) 97 // Extension does not exist for chromeos login. This needs to be 98 // removed once we have an extension service for login screen. 99 // crosbug.com/12856. 100 if (!profile->GetExtensionEventRouter()) 101 return; 102 #endif 103 104 if (extension_id.empty()) { 105 profile->GetExtensionEventRouter()-> 106 DispatchEventToRenderers( 107 event_name, event_args, restrict_to_profile, event_url); 108 } else { 109 profile->GetExtensionEventRouter()-> 110 DispatchEventToExtension( 111 extension_id, 112 event_name, event_args, restrict_to_profile, event_url); 113 } 114 } 115