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

Side by Side Diff: chrome/browser/extensions/extension_service.cc

Issue 9369013: Take extensions out of Profile into a profile-keyed service, ExtensionSystem. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 10 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) 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/browser/extensions/extension_service.h" 5 #include "chrome/browser/extensions/extension_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 #include "chrome/browser/extensions/extension_global_error.h" 44 #include "chrome/browser/extensions/extension_global_error.h"
45 #include "chrome/browser/extensions/extension_host.h" 45 #include "chrome/browser/extensions/extension_host.h"
46 #include "chrome/browser/extensions/extension_input_ime_api.h" 46 #include "chrome/browser/extensions/extension_input_ime_api.h"
47 #include "chrome/browser/extensions/extension_management_api.h" 47 #include "chrome/browser/extensions/extension_management_api.h"
48 #include "chrome/browser/extensions/extension_preference_api.h" 48 #include "chrome/browser/extensions/extension_preference_api.h"
49 #include "chrome/browser/extensions/extension_process_manager.h" 49 #include "chrome/browser/extensions/extension_process_manager.h"
50 #include "chrome/browser/extensions/extension_processes_api.h" 50 #include "chrome/browser/extensions/extension_processes_api.h"
51 #include "chrome/browser/extensions/extension_sorting.h" 51 #include "chrome/browser/extensions/extension_sorting.h"
52 #include "chrome/browser/extensions/extension_special_storage_policy.h" 52 #include "chrome/browser/extensions/extension_special_storage_policy.h"
53 #include "chrome/browser/extensions/extension_sync_data.h" 53 #include "chrome/browser/extensions/extension_sync_data.h"
54 #include "chrome/browser/extensions/extension_system.h"
55 #include "chrome/browser/extensions/extension_system_factory.h"
54 #include "chrome/browser/extensions/extension_updater.h" 56 #include "chrome/browser/extensions/extension_updater.h"
55 #include "chrome/browser/extensions/extension_web_ui.h" 57 #include "chrome/browser/extensions/extension_web_ui.h"
56 #include "chrome/browser/extensions/extension_webnavigation_api.h" 58 #include "chrome/browser/extensions/extension_webnavigation_api.h"
57 #include "chrome/browser/extensions/external_extension_provider_impl.h" 59 #include "chrome/browser/extensions/external_extension_provider_impl.h"
58 #include "chrome/browser/extensions/external_extension_provider_interface.h" 60 #include "chrome/browser/extensions/external_extension_provider_interface.h"
59 #include "chrome/browser/extensions/installed_loader.h" 61 #include "chrome/browser/extensions/installed_loader.h"
60 #include "chrome/browser/extensions/pending_extension_manager.h" 62 #include "chrome/browser/extensions/pending_extension_manager.h"
61 #include "chrome/browser/extensions/permissions_updater.h" 63 #include "chrome/browser/extensions/permissions_updater.h"
62 #include "chrome/browser/extensions/settings/settings_frontend.h" 64 #include "chrome/browser/extensions/settings/settings_frontend.h"
63 #include "chrome/browser/extensions/unpacked_installer.h" 65 #include "chrome/browser/extensions/unpacked_installer.h"
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 return true; 371 return true;
370 } 372 }
371 373
372 ExtensionService::ExtensionService(Profile* profile, 374 ExtensionService::ExtensionService(Profile* profile,
373 const CommandLine* command_line, 375 const CommandLine* command_line,
374 const FilePath& install_directory, 376 const FilePath& install_directory,
375 ExtensionPrefs* extension_prefs, 377 ExtensionPrefs* extension_prefs,
376 bool autoupdate_enabled, 378 bool autoupdate_enabled,
377 bool extensions_enabled) 379 bool extensions_enabled)
378 : profile_(profile), 380 : profile_(profile),
381 system_(ExtensionSystemFactory::GetForProfile(profile)),
379 extension_prefs_(extension_prefs), 382 extension_prefs_(extension_prefs),
380 settings_frontend_(extensions::SettingsFrontend::Create(profile)), 383 settings_frontend_(extensions::SettingsFrontend::Create(profile)),
381 pending_extension_manager_(*ALLOW_THIS_IN_INITIALIZER_LIST(this)), 384 pending_extension_manager_(*ALLOW_THIS_IN_INITIALIZER_LIST(this)),
382 install_directory_(install_directory), 385 install_directory_(install_directory),
383 extensions_enabled_(extensions_enabled), 386 extensions_enabled_(extensions_enabled),
384 show_extensions_prompts_(true), 387 show_extensions_prompts_(true),
385 ready_(false), 388 ready_(false),
386 toolbar_model_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 389 toolbar_model_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
387 menu_manager_(profile), 390 menu_manager_(profile),
388 app_notification_manager_(new AppNotificationManager(profile)), 391 app_notification_manager_(new AppNotificationManager(profile)),
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 void ExtensionService::ReloadExtension(const std::string& extension_id) { 691 void ExtensionService::ReloadExtension(const std::string& extension_id) {
689 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 692 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
690 FilePath path; 693 FilePath path;
691 const Extension* current_extension = GetExtensionById(extension_id, false); 694 const Extension* current_extension = GetExtensionById(extension_id, false);
692 695
693 // Disable the extension if it's loaded. It might not be loaded if it crashed. 696 // Disable the extension if it's loaded. It might not be loaded if it crashed.
694 if (current_extension) { 697 if (current_extension) {
695 // If the extension has an inspector open for its background page, detach 698 // If the extension has an inspector open for its background page, detach
696 // the inspector and hang onto a cookie for it, so that we can reattach 699 // the inspector and hang onto a cookie for it, so that we can reattach
697 // later. 700 // later.
698 ExtensionProcessManager* manager = profile_->GetExtensionProcessManager(); 701 // TODO(yoz): this is not incognito-safe!
702 ExtensionProcessManager* manager = system_->process_manager();
699 ExtensionHost* host = manager->GetBackgroundHostForExtension(extension_id); 703 ExtensionHost* host = manager->GetBackgroundHostForExtension(extension_id);
700 if (host && DevToolsAgentHostRegistry::HasDevToolsAgentHost( 704 if (host && DevToolsAgentHostRegistry::HasDevToolsAgentHost(
701 host->render_view_host())) { 705 host->render_view_host())) {
702 // Look for an open inspector for the background page. 706 // Look for an open inspector for the background page.
703 DevToolsAgentHost* agent = 707 DevToolsAgentHost* agent =
704 DevToolsAgentHostRegistry::GetDevToolsAgentHost( 708 DevToolsAgentHostRegistry::GetDevToolsAgentHost(
705 host->render_view_host()); 709 host->render_view_host());
706 int devtools_cookie = 710 int devtools_cookie =
707 content::DevToolsManager::GetInstance()->DetachClientHost(agent); 711 content::DevToolsManager::GetInstance()->DetachClientHost(agent);
708 if (devtools_cookie >= 0) 712 if (devtools_cookie >= 0)
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 } 974 }
971 } 975 }
972 976
973 void ExtensionService::NotifyExtensionLoaded(const Extension* extension) { 977 void ExtensionService::NotifyExtensionLoaded(const Extension* extension) {
974 // The ChromeURLRequestContexts need to be first to know that the extension 978 // The ChromeURLRequestContexts need to be first to know that the extension
975 // was loaded, otherwise a race can arise where a renderer that is created 979 // was loaded, otherwise a race can arise where a renderer that is created
976 // for the extension may try to load an extension URL with an extension id 980 // for the extension may try to load an extension URL with an extension id
977 // that the request context doesn't yet know about. The profile is responsible 981 // that the request context doesn't yet know about. The profile is responsible
978 // for ensuring its URLRequestContexts appropriately discover the loaded 982 // for ensuring its URLRequestContexts appropriately discover the loaded
979 // extension. 983 // extension.
980 profile_->RegisterExtensionWithRequestContexts(extension); 984 system_->RegisterExtensionWithRequestContexts(extension);
981 985
982 // Tell renderers about the new extension, unless it's a theme (renderers 986 // Tell renderers about the new extension, unless it's a theme (renderers
983 // don't need to know about themes). 987 // don't need to know about themes).
984 if (!extension->is_theme()) { 988 if (!extension->is_theme()) {
985 for (content::RenderProcessHost::iterator i( 989 for (content::RenderProcessHost::iterator i(
986 content::RenderProcessHost::AllHostsIterator()); 990 content::RenderProcessHost::AllHostsIterator());
987 !i.IsAtEnd(); i.Advance()) { 991 !i.IsAtEnd(); i.Advance()) {
988 content::RenderProcessHost* host = i.GetCurrentValue(); 992 content::RenderProcessHost* host = i.GetCurrentValue();
989 Profile* host_profile = 993 Profile* host_profile =
990 Profile::FromBrowserContext(host->GetBrowserContext()); 994 Profile::FromBrowserContext(host->GetBrowserContext());
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1117 for (content::RenderProcessHost::iterator i( 1121 for (content::RenderProcessHost::iterator i(
1118 content::RenderProcessHost::AllHostsIterator()); 1122 content::RenderProcessHost::AllHostsIterator());
1119 !i.IsAtEnd(); i.Advance()) { 1123 !i.IsAtEnd(); i.Advance()) {
1120 content::RenderProcessHost* host = i.GetCurrentValue(); 1124 content::RenderProcessHost* host = i.GetCurrentValue();
1121 Profile* host_profile = 1125 Profile* host_profile =
1122 Profile::FromBrowserContext(host->GetBrowserContext()); 1126 Profile::FromBrowserContext(host->GetBrowserContext());
1123 if (host_profile->GetOriginalProfile() == profile_->GetOriginalProfile()) 1127 if (host_profile->GetOriginalProfile() == profile_->GetOriginalProfile())
1124 host->Send(new ExtensionMsg_Unloaded(extension->id())); 1128 host->Send(new ExtensionMsg_Unloaded(extension->id()));
1125 } 1129 }
1126 1130
1127 profile_->UnregisterExtensionWithRequestContexts(extension->id(), reason); 1131 system_->UnregisterExtensionWithRequestContexts(extension->id(), reason);
1128 profile_->GetExtensionSpecialStoragePolicy()-> 1132 profile_->GetExtensionSpecialStoragePolicy()->
1129 RevokeRightsForExtension(extension); 1133 RevokeRightsForExtension(extension);
1130 1134
1131 ExtensionWebUI::UnregisterChromeURLOverrides( 1135 ExtensionWebUI::UnregisterChromeURLOverrides(
1132 profile_, extension->GetChromeURLOverrides()); 1136 profile_, extension->GetChromeURLOverrides());
1133 1137
1134 #if defined(OS_CHROMEOS) 1138 #if defined(OS_CHROMEOS)
1135 // Revoke external file access to 1139 // Revoke external file access to
1136 if (profile_->GetFileSystemContext() && 1140 if (profile_->GetFileSystemContext() &&
1137 profile_->GetFileSystemContext()->external_provider()) { 1141 profile_->GetFileSystemContext()->external_provider()) {
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after
1906 extension_misc::UnloadedExtensionReason reason) { 1910 extension_misc::UnloadedExtensionReason reason) {
1907 // Make sure the extension gets deleted after we return from this function. 1911 // Make sure the extension gets deleted after we return from this function.
1908 scoped_refptr<const Extension> extension( 1912 scoped_refptr<const Extension> extension(
1909 GetExtensionByIdInternal(extension_id, true, true, false)); 1913 GetExtensionByIdInternal(extension_id, true, true, false));
1910 1914
1911 // This method can be called via PostTask, so the extension may have been 1915 // This method can be called via PostTask, so the extension may have been
1912 // unloaded by the time this runs. 1916 // unloaded by the time this runs.
1913 if (!extension) { 1917 if (!extension) {
1914 // In case the extension may have crashed/uninstalled. Allow the profile to 1918 // In case the extension may have crashed/uninstalled. Allow the profile to
1915 // clean up its RequestContexts. 1919 // clean up its RequestContexts.
1916 profile_->UnregisterExtensionWithRequestContexts(extension_id, reason); 1920 system_->UnregisterExtensionWithRequestContexts(extension_id, reason);
1917 return; 1921 return;
1918 } 1922 }
1919 1923
1920 // Keep information about the extension so that we can reload it later 1924 // Keep information about the extension so that we can reload it later
1921 // even if it's not permanently installed. 1925 // even if it's not permanently installed.
1922 unloaded_extension_paths_[extension->id()] = extension->path(); 1926 unloaded_extension_paths_[extension->id()] = extension->path();
1923 1927
1924 // Clean up if the extension is meant to be enabled after a reload. 1928 // Clean up if the extension is meant to be enabled after a reload.
1925 disabled_extension_paths_.erase(extension->id()); 1929 disabled_extension_paths_.erase(extension->id());
1926 1930
1927 // Clean up runtime data. 1931 // Clean up runtime data.
1928 extension_runtime_data_.erase(extension_id); 1932 extension_runtime_data_.erase(extension_id);
1929 1933
1930 if (disabled_extensions_.Contains(extension->id())) { 1934 if (disabled_extensions_.Contains(extension->id())) {
1931 UnloadedExtensionInfo details(extension, reason); 1935 UnloadedExtensionInfo details(extension, reason);
1932 details.already_disabled = true; 1936 details.already_disabled = true;
1933 disabled_extensions_.Remove(extension->id()); 1937 disabled_extensions_.Remove(extension->id());
1934 content::NotificationService::current()->Notify( 1938 content::NotificationService::current()->Notify(
1935 chrome::NOTIFICATION_EXTENSION_UNLOADED, 1939 chrome::NOTIFICATION_EXTENSION_UNLOADED,
1936 content::Source<Profile>(profile_), 1940 content::Source<Profile>(profile_),
1937 content::Details<UnloadedExtensionInfo>(&details)); 1941 content::Details<UnloadedExtensionInfo>(&details));
1938 // Make sure the profile cleans up its RequestContexts when an already 1942 // Make sure the profile cleans up its RequestContexts when an already
1939 // disabled extension is unloaded (since they are also tracking the disabled 1943 // disabled extension is unloaded (since they are also tracking the disabled
1940 // extensions). 1944 // extensions).
1941 profile_->UnregisterExtensionWithRequestContexts(extension_id, reason); 1945 system_->UnregisterExtensionWithRequestContexts(extension_id, reason);
1942 return; 1946 return;
1943 } 1947 }
1944 1948
1945 // Remove the extension from our list. 1949 // Remove the extension from our list.
1946 extensions_.Remove(extension->id()); 1950 extensions_.Remove(extension->id());
1947 1951
1948 NotifyExtensionUnloaded(extension.get(), reason); 1952 NotifyExtensionUnloaded(extension.get(), reason);
1949 } 1953 }
1950 1954
1951 void ExtensionService::UnloadAllExtensions() { 1955 void ExtensionService::UnloadAllExtensions() {
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
2476 Profile::FromBrowserContext(process->GetBrowserContext()); 2480 Profile::FromBrowserContext(process->GetBrowserContext());
2477 if (!profile_->IsSameProfile(host_profile->GetOriginalProfile())) 2481 if (!profile_->IsSameProfile(host_profile->GetOriginalProfile()))
2478 break; 2482 break;
2479 2483
2480 installed_app_hosts_.erase(process->GetID()); 2484 installed_app_hosts_.erase(process->GetID());
2481 2485
2482 process_map_.RemoveAllFromProcess(process->GetID()); 2486 process_map_.RemoveAllFromProcess(process->GetID());
2483 BrowserThread::PostTask( 2487 BrowserThread::PostTask(
2484 BrowserThread::IO, FROM_HERE, 2488 BrowserThread::IO, FROM_HERE,
2485 base::Bind(&ExtensionInfoMap::UnregisterAllExtensionsInProcess, 2489 base::Bind(&ExtensionInfoMap::UnregisterAllExtensionsInProcess,
2486 profile_->GetExtensionInfoMap(), 2490 system_->info_map(),
2487 process->GetID())); 2491 process->GetID()));
2488 break; 2492 break;
2489 } 2493 }
2490 case chrome::NOTIFICATION_PREF_CHANGED: { 2494 case chrome::NOTIFICATION_PREF_CHANGED: {
2491 std::string* pref_name = content::Details<std::string>(details).ptr(); 2495 std::string* pref_name = content::Details<std::string>(details).ptr();
2492 if (*pref_name == prefs::kExtensionInstallAllowList || 2496 if (*pref_name == prefs::kExtensionInstallAllowList ||
2493 *pref_name == prefs::kExtensionInstallDenyList) { 2497 *pref_name == prefs::kExtensionInstallDenyList) {
2494 CheckAdminBlacklist(); 2498 CheckAdminBlacklist();
2495 } else { 2499 } else {
2496 NOTREACHED() << "Unexpected preference name."; 2500 NOTREACHED() << "Unexpected preference name.";
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
2692 // 2696 //
2693 // To coexist with certain unit tests that don't have an IO thread message 2697 // To coexist with certain unit tests that don't have an IO thread message
2694 // loop available at ExtensionService shutdown, we lazy-initialize this 2698 // loop available at ExtensionService shutdown, we lazy-initialize this
2695 // object so that those cases neither create nor destroy a SocketController. 2699 // object so that those cases neither create nor destroy a SocketController.
2696 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 2700 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
2697 if (!socket_controller_) { 2701 if (!socket_controller_) {
2698 socket_controller_ = new extensions::SocketController(); 2702 socket_controller_ = new extensions::SocketController();
2699 } 2703 }
2700 return socket_controller_; 2704 return socket_controller_;
2701 } 2705 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698