OLD | NEW |
---|---|
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 27 matching lines...) Expand all Loading... | |
38 #include "chrome/browser/extensions/crx_installer.h" | 38 #include "chrome/browser/extensions/crx_installer.h" |
39 #include "chrome/browser/extensions/default_apps_trial.h" | 39 #include "chrome/browser/extensions/default_apps_trial.h" |
40 #include "chrome/browser/extensions/extension_browser_event_router.h" | 40 #include "chrome/browser/extensions/extension_browser_event_router.h" |
41 #include "chrome/browser/extensions/extension_cookies_api.h" | 41 #include "chrome/browser/extensions/extension_cookies_api.h" |
42 #include "chrome/browser/extensions/extension_data_deleter.h" | 42 #include "chrome/browser/extensions/extension_data_deleter.h" |
43 #include "chrome/browser/extensions/extension_error_reporter.h" | 43 #include "chrome/browser/extensions/extension_error_reporter.h" |
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_pref_value_map.h" | |
48 #include "chrome/browser/extensions/extension_preference_api.h" | 49 #include "chrome/browser/extensions/extension_preference_api.h" |
49 #include "chrome/browser/extensions/extension_process_manager.h" | 50 #include "chrome/browser/extensions/extension_process_manager.h" |
50 #include "chrome/browser/extensions/extension_processes_api.h" | 51 #include "chrome/browser/extensions/extension_processes_api.h" |
51 #include "chrome/browser/extensions/extension_sorting.h" | 52 #include "chrome/browser/extensions/extension_sorting.h" |
52 #include "chrome/browser/extensions/extension_special_storage_policy.h" | 53 #include "chrome/browser/extensions/extension_special_storage_policy.h" |
53 #include "chrome/browser/extensions/extension_sync_data.h" | 54 #include "chrome/browser/extensions/extension_sync_data.h" |
54 #include "chrome/browser/extensions/extension_updater.h" | 55 #include "chrome/browser/extensions/extension_updater.h" |
55 #include "chrome/browser/extensions/extension_web_ui.h" | 56 #include "chrome/browser/extensions/extension_web_ui.h" |
56 #include "chrome/browser/extensions/extension_webnavigation_api.h" | 57 #include "chrome/browser/extensions/extension_webnavigation_api.h" |
57 #include "chrome/browser/extensions/external_extension_provider_impl.h" | 58 #include "chrome/browser/extensions/external_extension_provider_impl.h" |
(...skipping 13 matching lines...) Expand all Loading... | |
71 #include "chrome/browser/sync/api/sync_change.h" | 72 #include "chrome/browser/sync/api/sync_change.h" |
72 #include "chrome/browser/themes/theme_service.h" | 73 #include "chrome/browser/themes/theme_service.h" |
73 #include "chrome/browser/themes/theme_service_factory.h" | 74 #include "chrome/browser/themes/theme_service_factory.h" |
74 #include "chrome/browser/ui/browser.h" | 75 #include "chrome/browser/ui/browser.h" |
75 #include "chrome/browser/ui/browser_list.h" | 76 #include "chrome/browser/ui/browser_list.h" |
76 #include "chrome/browser/ui/global_error_service.h" | 77 #include "chrome/browser/ui/global_error_service.h" |
77 #include "chrome/browser/ui/global_error_service_factory.h" | 78 #include "chrome/browser/ui/global_error_service_factory.h" |
78 #include "chrome/browser/ui/webui/chrome_url_data_manager.h" | 79 #include "chrome/browser/ui/webui/chrome_url_data_manager.h" |
79 #include "chrome/browser/ui/webui/favicon_source.h" | 80 #include "chrome/browser/ui/webui/favicon_source.h" |
80 #include "chrome/browser/ui/webui/ntp/thumbnail_source.h" | 81 #include "chrome/browser/ui/webui/ntp/thumbnail_source.h" |
82 #include "chrome/browser/web_applications/web_app.h" | |
81 #include "chrome/common/child_process_logging.h" | 83 #include "chrome/common/child_process_logging.h" |
84 #include "chrome/common/chrome_constants.h" | |
82 #include "chrome/common/chrome_notification_types.h" | 85 #include "chrome/common/chrome_notification_types.h" |
83 #include "chrome/common/chrome_paths.h" | 86 #include "chrome/common/chrome_paths.h" |
84 #include "chrome/common/chrome_switches.h" | 87 #include "chrome/common/chrome_switches.h" |
85 #include "chrome/common/extensions/extension.h" | 88 #include "chrome/common/extensions/extension.h" |
86 #include "chrome/common/extensions/extension_constants.h" | 89 #include "chrome/common/extensions/extension_constants.h" |
87 #include "chrome/common/extensions/extension_error_utils.h" | 90 #include "chrome/common/extensions/extension_error_utils.h" |
88 #include "chrome/common/extensions/extension_file_util.h" | 91 #include "chrome/common/extensions/extension_file_util.h" |
89 #include "chrome/common/extensions/extension_messages.h" | 92 #include "chrome/common/extensions/extension_messages.h" |
90 #include "chrome/common/extensions/extension_resource.h" | 93 #include "chrome/common/extensions/extension_resource.h" |
91 #include "chrome/common/pref_names.h" | 94 #include "chrome/common/pref_names.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
144 static bool IsSyncableExtension(const Extension& extension) { | 147 static bool IsSyncableExtension(const Extension& extension) { |
145 return extension.GetSyncType() == Extension::SYNC_TYPE_EXTENSION; | 148 return extension.GetSyncType() == Extension::SYNC_TYPE_EXTENSION; |
146 } | 149 } |
147 | 150 |
148 static bool IsSyncableApp(const Extension& extension) { | 151 static bool IsSyncableApp(const Extension& extension) { |
149 return extension.GetSyncType() == Extension::SYNC_TYPE_APP; | 152 return extension.GetSyncType() == Extension::SYNC_TYPE_APP; |
150 } | 153 } |
151 | 154 |
152 } // namespace | 155 } // namespace |
153 | 156 |
157 // static | |
158 bool ExtensionService::PlatformAppRequiresSeparateDataDirectory() { | |
Aaron Boodman
2012/02/10 20:09:46
I think this would make more sense as a member of
sail
2012/02/11 23:15:11
Done.
| |
159 // Currently separate data directories are only supported on Mac OSX. | |
160 #if defined(OS_MACOSX) | |
161 return true; | |
162 #else | |
163 return false; | |
164 #endif | |
165 } | |
166 | |
154 ExtensionService::ExtensionRuntimeData::ExtensionRuntimeData() | 167 ExtensionService::ExtensionRuntimeData::ExtensionRuntimeData() |
155 : background_page_ready(false), | 168 : background_page_ready(false), |
156 being_upgraded(false), | 169 being_upgraded(false), |
157 has_used_webrequest(false) { | 170 has_used_webrequest(false) { |
158 } | 171 } |
159 | 172 |
160 ExtensionService::ExtensionRuntimeData::~ExtensionRuntimeData() { | 173 ExtensionService::ExtensionRuntimeData::~ExtensionRuntimeData() { |
161 } | 174 } |
162 | 175 |
163 ExtensionService::NaClModuleInfo::NaClModuleInfo() { | 176 ExtensionService::NaClModuleInfo::NaClModuleInfo() { |
(...skipping 2054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2218 } | 2231 } |
2219 | 2232 |
2220 // Do not record the install histograms for upgrades. | 2233 // Do not record the install histograms for upgrades. |
2221 if (!GetExtensionByIdInternal(extension->id(), true, true, false)) { | 2234 if (!GetExtensionByIdInternal(extension->id(), true, true, false)) { |
2222 UMA_HISTOGRAM_ENUMERATION("Extensions.InstallType", | 2235 UMA_HISTOGRAM_ENUMERATION("Extensions.InstallType", |
2223 extension->GetType(), 100); | 2236 extension->GetType(), 100); |
2224 RecordPermissionMessagesHistogram( | 2237 RecordPermissionMessagesHistogram( |
2225 extension, "Extensions.Permissions_Install"); | 2238 extension, "Extensions.Permissions_Install"); |
2226 } | 2239 } |
2227 | 2240 |
2228 extension_prefs_->OnExtensionInstalled( | 2241 SetupExtensionPrefs( |
2229 extension, | 2242 extension_prefs_, extension, from_webstore, page_ordinal, initial_enable); |
2230 initial_enable ? Extension::ENABLED : Extension::DISABLED, | 2243 if (initial_enable && PlatformAppRequiresSeparateDataDirectory()) { |
2231 from_webstore, | 2244 SetupExtensionPrefsInSeparateDataDirectory( |
2232 page_ordinal); | 2245 extension, from_webstore, page_ordinal); |
2233 | |
2234 // Unpacked extensions default to allowing file access, but if that has been | |
2235 // overridden, don't reset the value. | |
Aaron Boodman
2012/02/10 20:09:46
Seems like these could also be moved into Extensio
sail
2012/02/11 23:15:11
Done.
| |
2236 if (Extension::ShouldAlwaysAllowFileAccess(extension->location()) && | |
2237 !extension_prefs_->HasAllowFileAccessSetting(id)) { | |
2238 extension_prefs_->SetAllowFileAccess(id, true); | |
2239 } | 2246 } |
2240 | 2247 |
2241 // If the extension should automatically block network startup (e.g., it uses | |
2242 // the webRequest API), set the preference. Otherwise clear it, in case the | |
2243 // extension stopped using a relevant API. | |
2244 extension_prefs_->SetDelaysNetworkRequests( | |
2245 extension->id(), extension->ImplicitlyDelaysNetworkStartup()); | |
2246 | |
2247 content::NotificationService::current()->Notify( | 2248 content::NotificationService::current()->Notify( |
2248 chrome::NOTIFICATION_EXTENSION_INSTALLED, | 2249 chrome::NOTIFICATION_EXTENSION_INSTALLED, |
2249 content::Source<Profile>(profile_), | 2250 content::Source<Profile>(profile_), |
2250 content::Details<const Extension>(extension)); | 2251 content::Details<const Extension>(extension)); |
2251 | 2252 |
2252 // Transfer ownership of |extension| to AddExtension. | 2253 // Transfer ownership of |extension| to AddExtension. |
2253 AddExtension(scoped_extension); | 2254 AddExtension(scoped_extension); |
2254 } | 2255 } |
2255 | 2256 |
2256 const Extension* ExtensionService::GetExtensionByIdInternal( | 2257 const Extension* ExtensionService::GetExtensionByIdInternal( |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2629 // | 2630 // |
2630 // To coexist with certain unit tests that don't have an IO thread message | 2631 // To coexist with certain unit tests that don't have an IO thread message |
2631 // loop available at ExtensionService shutdown, we lazy-initialize this | 2632 // loop available at ExtensionService shutdown, we lazy-initialize this |
2632 // object so that those cases neither create nor destroy a SocketController. | 2633 // object so that those cases neither create nor destroy a SocketController. |
2633 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 2634 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
2634 if (!socket_controller_) { | 2635 if (!socket_controller_) { |
2635 socket_controller_ = new extensions::SocketController(); | 2636 socket_controller_ = new extensions::SocketController(); |
2636 } | 2637 } |
2637 return socket_controller_; | 2638 return socket_controller_; |
2638 } | 2639 } |
2640 | |
2641 void ExtensionService::SetupExtensionPrefs(ExtensionPrefs* prefs, | |
2642 const Extension* extension, | |
2643 bool from_webstore, | |
2644 const StringOrdinal& page_ordinal, | |
2645 bool initial_enable) { | |
2646 const std::string& id = extension->id(); | |
2647 prefs->OnExtensionInstalled( | |
2648 extension, | |
2649 initial_enable ? Extension::ENABLED : Extension::DISABLED, | |
2650 from_webstore, | |
2651 page_ordinal); | |
2652 | |
2653 // Unpacked extensions default to allowing file access, but if that has been | |
2654 // overridden, don't reset the value. | |
2655 if (Extension::ShouldAlwaysAllowFileAccess(extension->location()) && | |
2656 !prefs->HasAllowFileAccessSetting(id)) { | |
2657 prefs->SetAllowFileAccess(id, true); | |
2658 } | |
2659 | |
2660 // If the extension should automatically block network startup (e.g., it uses | |
2661 // the webRequest API), set the preference. Otherwise clear it, in case the | |
2662 // extension stopped using a relevant API. | |
2663 prefs->SetDelaysNetworkRequests( | |
2664 id, extension->ImplicitlyDelaysNetworkStartup()); | |
2665 } | |
2666 | |
2667 void ExtensionService::SetupExtensionPrefsInSeparateDataDirectory( | |
2668 const Extension* extension, | |
2669 bool from_webstore, | |
2670 const StringOrdinal& page_ordinal) { | |
2671 const std::string& id = extension->id(); | |
2672 FilePath data_dir = web_app::GetWebAppDataDirectory( | |
Aaron Boodman
2012/02/10 20:09:46
These few lines of code shows up in a couple place
sail
2012/02/11 23:15:11
This would involve moving several functions from w
| |
2673 profile_->GetPath(), id, GURL(extension->launch_web_url())); | |
2674 FilePath profile_path = data_dir.AppendASCII(chrome::kInitialProfile); | |
2675 FilePath pref_path = profile_path.Append(chrome::kPreferencesFilename); | |
2676 scoped_ptr<PrefService> prefs_service(PrefService::CreatePrefService( | |
2677 pref_path, NULL, false)); | |
2678 | |
2679 ExtensionPrefValueMap map; | |
2680 ExtensionPrefs::RegisterUserPrefs(prefs_service.get()); | |
2681 ExtensionPrefs extension_prefs(prefs_service.get(), install_directory_, &map); | |
2682 extension_prefs.Init(false); | |
2683 | |
2684 SetupExtensionPrefs( | |
2685 &extension_prefs, extension, from_webstore, page_ordinal, true); | |
2686 extension_prefs.AddGrantedPermissions(id, extension->GetActivePermissions()); | |
2687 extension_prefs.SetExtensionState(id, Extension::ENABLED); | |
2688 | |
2689 prefs_service->CommitPendingWrite(); | |
2690 } | |
OLD | NEW |