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

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

Issue 9374009: Install platform apps into a separate data directory (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase, address review comments 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 27 matching lines...) Expand all
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698