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

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

Issue 11419307: Garbage Collect the Storage directory on next profile start after an extension uninstall. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: small fixes. Created 8 years 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 <iterator> 8 #include <iterator>
9 #include <set> 9 #include <set>
10 10
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 #include "chrome/common/extensions/manifest.h" 100 #include "chrome/common/extensions/manifest.h"
101 #include "chrome/common/pref_names.h" 101 #include "chrome/common/pref_names.h"
102 #include "chrome/common/url_constants.h" 102 #include "chrome/common/url_constants.h"
103 #include "content/public/browser/browser_thread.h" 103 #include "content/public/browser/browser_thread.h"
104 #include "content/public/browser/devtools_agent_host_registry.h" 104 #include "content/public/browser/devtools_agent_host_registry.h"
105 #include "content/public/browser/devtools_manager.h" 105 #include "content/public/browser/devtools_manager.h"
106 #include "content/public/browser/notification_service.h" 106 #include "content/public/browser/notification_service.h"
107 #include "content/public/browser/notification_types.h" 107 #include "content/public/browser/notification_types.h"
108 #include "content/public/browser/plugin_service.h" 108 #include "content/public/browser/plugin_service.h"
109 #include "content/public/browser/render_process_host.h" 109 #include "content/public/browser/render_process_host.h"
110 #include "content/public/browser/site_instance.h"
111 #include "content/public/browser/storage_partition.h"
110 #include "content/public/common/pepper_plugin_info.h" 112 #include "content/public/common/pepper_plugin_info.h"
111 #include "extensions/common/error_utils.h" 113 #include "extensions/common/error_utils.h"
112 #include "googleurl/src/gurl.h" 114 #include "googleurl/src/gurl.h"
113 #include "grit/generated_resources.h" 115 #include "grit/generated_resources.h"
114 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" 116 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
115 #include "sync/api/sync_change.h" 117 #include "sync/api/sync_change.h"
116 #include "sync/api/sync_error_factory.h" 118 #include "sync/api/sync_error_factory.h"
117 #include "webkit/database/database_tracker.h" 119 #include "webkit/database/database_tracker.h"
118 #include "webkit/database/database_util.h" 120 #include "webkit/database/database_util.h"
119 121
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 show_extensions_prompts_(true), 371 show_extensions_prompts_(true),
370 install_updates_when_idle_(true), 372 install_updates_when_idle_(true),
371 ready_(false), 373 ready_(false),
372 toolbar_model_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 374 toolbar_model_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
373 menu_manager_(profile), 375 menu_manager_(profile),
374 app_notification_manager_( 376 app_notification_manager_(
375 new extensions::AppNotificationManager(profile)), 377 new extensions::AppNotificationManager(profile)),
376 event_routers_initialized_(false), 378 event_routers_initialized_(false),
377 update_once_all_providers_are_ready_(false), 379 update_once_all_providers_are_ready_(false),
378 browser_terminating_(false), 380 browser_terminating_(false),
381 installs_delayed_(false),
379 app_sync_bundle_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 382 app_sync_bundle_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
380 extension_sync_bundle_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 383 extension_sync_bundle_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
381 app_shortcut_manager_(profile) { 384 app_shortcut_manager_(profile) {
382 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 385 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
383 386
384 // Figure out if extension installation should be enabled. 387 // Figure out if extension installation should be enabled.
385 if (command_line->HasSwitch(switches::kDisableExtensions) || 388 if (command_line->HasSwitch(switches::kDisableExtensions) ||
386 profile->GetPrefs()->GetBoolean(prefs::kDisableExtensions)) { 389 profile->GetPrefs()->GetBoolean(prefs::kDisableExtensions)) {
387 extensions_enabled_ = false; 390 extensions_enabled_ = false;
388 } 391 }
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 int include_mask = INCLUDE_ENABLED; 586 int include_mask = INCLUDE_ENABLED;
584 if (include_disabled) { 587 if (include_disabled) {
585 // Include blacklisted extensions here because there are hundreds of 588 // Include blacklisted extensions here because there are hundreds of
586 // callers of this function, and many might assume that this includes those 589 // callers of this function, and many might assume that this includes those
587 // that have been disabled due to blacklisting. 590 // that have been disabled due to blacklisting.
588 include_mask |= INCLUDE_DISABLED | INCLUDE_BLACKLISTED; 591 include_mask |= INCLUDE_DISABLED | INCLUDE_BLACKLISTED;
589 } 592 }
590 return GetExtensionById(id, include_mask); 593 return GetExtensionById(id, include_mask);
591 } 594 }
592 595
596 GURL ExtensionService::GetSiteForExtensionId(const std::string& extension_id) {
597 return content::SiteInstance::GetSiteForURL(
598 profile_,
599 Extension::GetBaseURLFromExtensionId(extension_id));
600 }
601
593 const Extension* ExtensionService::GetExtensionById( 602 const Extension* ExtensionService::GetExtensionById(
594 const std::string& id, int include_mask) const { 603 const std::string& id, int include_mask) const {
595 std::string lowercase_id = StringToLowerASCII(id); 604 std::string lowercase_id = StringToLowerASCII(id);
596 if (include_mask & INCLUDE_ENABLED) { 605 if (include_mask & INCLUDE_ENABLED) {
597 const Extension* extension = extensions_.GetByID(lowercase_id); 606 const Extension* extension = extensions_.GetByID(lowercase_id);
598 if (extension) 607 if (extension)
599 return extension; 608 return extension;
600 } 609 }
601 if (include_mask & INCLUDE_DISABLED) { 610 if (include_mask & INCLUDE_DISABLED) {
602 const Extension* extension = disabled_extensions_.GetByID(lowercase_id); 611 const Extension* extension = disabled_extensions_.GetByID(lowercase_id);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 RegisterForImportFinished(); 653 RegisterForImportFinished();
645 } else { 654 } else {
646 // TODO(erikkay) this should probably be deferred to a future point 655 // TODO(erikkay) this should probably be deferred to a future point
647 // rather than running immediately at startup. 656 // rather than running immediately at startup.
648 CheckForExternalUpdates(); 657 CheckForExternalUpdates();
649 658
650 // TODO(erikkay) this should probably be deferred as well. 659 // TODO(erikkay) this should probably be deferred as well.
651 GarbageCollectExtensions(); 660 GarbageCollectExtensions();
652 } 661 }
653 } 662 }
663
664 if (extension_prefs_->NeedsStorageGarbageCollection()) {
665 GarbageCollectIsolatedStorage();
666 extension_prefs_->SetNeedsStorageGarbageCollection(false);
667 }
654 } 668 }
655 669
656 bool ExtensionService::UpdateExtension(const std::string& id, 670 bool ExtensionService::UpdateExtension(const std::string& id,
657 const FilePath& extension_path, 671 const FilePath& extension_path,
658 const GURL& download_url, 672 const GURL& download_url,
659 CrxInstaller** out_crx_installer) { 673 CrxInstaller** out_crx_installer) {
660 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 674 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
661 if (browser_terminating_) { 675 if (browser_terminating_) {
662 LOG(WARNING) << "Skipping UpdateExtension due to browser shutdown"; 676 LOG(WARNING) << "Skipping UpdateExtension due to browser shutdown";
663 // Leak the temp file at extension_path. We don't want to add to the disk 677 // Leak the temp file at extension_path. We don't want to add to the disk
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 789
776 on_load_events_[extension_id] = events; 790 on_load_events_[extension_id] = events;
777 791
778 path = current_extension->path(); 792 path = current_extension->path();
779 DisableExtension(extension_id, Extension::DISABLE_RELOAD); 793 DisableExtension(extension_id, Extension::DISABLE_RELOAD);
780 disabled_extension_paths_[extension_id] = path; 794 disabled_extension_paths_[extension_id] = path;
781 } else { 795 } else {
782 path = unloaded_extension_paths_[extension_id]; 796 path = unloaded_extension_paths_[extension_id];
783 } 797 }
784 798
785 if (pending_extension_updates_.Contains(extension_id)) { 799 if (delayed_for_idle_updates_.Contains(extension_id)) {
786 FinishDelayedInstallation(extension_id); 800 FinishDelayedInstallation(extension_id);
787 return; 801 return;
788 } 802 }
789 803
790 // If we're reloading a component extension, use the component extension 804 // If we're reloading a component extension, use the component extension
791 // loader's reloader. 805 // loader's reloader.
792 if (component_loader_->Exists(extension_id)) { 806 if (component_loader_->Exists(extension_id)) {
793 component_loader_->Reload(extension_id); 807 component_loader_->Reload(extension_id);
794 return; 808 return;
795 } 809 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 &extension_file_util::UninstallExtension, 887 &extension_file_util::UninstallExtension,
874 install_directory_, 888 install_directory_,
875 extension_id))) 889 extension_id)))
876 NOTREACHED(); 890 NOTREACHED();
877 } 891 }
878 892
879 GURL launch_web_url_origin(extension->launch_web_url()); 893 GURL launch_web_url_origin(extension->launch_web_url());
880 launch_web_url_origin = launch_web_url_origin.GetOrigin(); 894 launch_web_url_origin = launch_web_url_origin.GetOrigin();
881 bool is_storage_isolated = extension->is_storage_isolated(); 895 bool is_storage_isolated = extension->is_storage_isolated();
882 896
883 if (extension->is_hosted_app() && 897 if (is_storage_isolated) {
884 !profile_->GetExtensionSpecialStoragePolicy()-> 898 BrowserContext::AsyncObliterateStoragePartition(
885 IsStorageProtected(launch_web_url_origin)) { 899 profile_,
886 extensions::DataDeleter::StartDeleting( 900 GetSiteForExtensionId(extension_id),
887 profile_, extension_id, launch_web_url_origin, is_storage_isolated); 901 base::Bind(&ExtensionService::OnNeedsToGarbageCollectedIsolatedStorage,
902 AsWeakPtr()));
903 } else {
904 if (extension->is_hosted_app() &&
905 !profile_->GetExtensionSpecialStoragePolicy()->
906 IsStorageProtected(launch_web_url_origin)) {
907 extensions::DataDeleter::StartDeleting(
908 profile_, extension_id, launch_web_url_origin);
909 }
910 extensions::DataDeleter::StartDeleting(profile_, extension_id,
911 extension->url());
888 } 912 }
889 extensions::DataDeleter::StartDeleting(
890 profile_, extension_id, extension->url(), is_storage_isolated);
891 913
892 UntrackTerminatedExtension(extension_id); 914 UntrackTerminatedExtension(extension_id);
893 915
894 // Notify interested parties that we've uninstalled this extension. 916 // Notify interested parties that we've uninstalled this extension.
895 content::NotificationService::current()->Notify( 917 content::NotificationService::current()->Notify(
896 chrome::NOTIFICATION_EXTENSION_UNINSTALLED, 918 chrome::NOTIFICATION_EXTENSION_UNINSTALLED,
897 content::Source<Profile>(profile_), 919 content::Source<Profile>(profile_),
898 content::Details<const Extension>(extension)); 920 content::Details<const Extension>(extension));
899 921
900 if (app_sync_bundle_.HasExtensionId(extension_id) && 922 if (app_sync_bundle_.HasExtensionId(extension_id) &&
901 sync_change.sync_data().GetDataType() == syncer::APPS) { 923 sync_change.sync_data().GetDataType() == syncer::APPS) {
902 app_sync_bundle_.ProcessDeletion(extension_id, sync_change); 924 app_sync_bundle_.ProcessDeletion(extension_id, sync_change);
903 } else if (extension_sync_bundle_.HasExtensionId(extension_id) && 925 } else if (extension_sync_bundle_.HasExtensionId(extension_id) &&
904 sync_change.sync_data().GetDataType() == syncer::EXTENSIONS) { 926 sync_change.sync_data().GetDataType() == syncer::EXTENSIONS) {
905 extension_sync_bundle_.ProcessDeletion(extension_id, sync_change); 927 extension_sync_bundle_.ProcessDeletion(extension_id, sync_change);
906 } 928 }
907 929
908 pending_extension_updates_.Remove(extension_id); 930 delayed_for_idle_updates_.Remove(extension_id);
931 delayed_installs_.Remove(extension_id);
909 932
910 // Track the uninstallation. 933 // Track the uninstallation.
911 UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionUninstalled", 1, 2); 934 UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionUninstalled", 1, 2);
912 935
913 return true; 936 return true;
914 } 937 }
915 938
916 bool ExtensionService::IsExtensionEnabled( 939 bool ExtensionService::IsExtensionEnabled(
917 const std::string& extension_id) const { 940 const std::string& extension_id) const {
918 if (extensions_.Contains(extension_id) || 941 if (extensions_.Contains(extension_id) ||
(...skipping 1272 matching lines...) Expand 10 before | Expand all | Expand 10 after
2191 const std::string old_version_string( 2214 const std::string old_version_string(
2192 extension_prefs_->GetVersionString(extension->id())); 2215 extension_prefs_->GetVersionString(extension->id()));
2193 const Version old_version(old_version_string); 2216 const Version old_version(old_version_string);
2194 2217
2195 if (!old_version.IsValid() || !old_version.Equals(*extension->version())) { 2218 if (!old_version.IsValid() || !old_version.Equals(*extension->version())) {
2196 VLOG(1) << "Component extension " << extension->name() << " (" 2219 VLOG(1) << "Component extension " << extension->name() << " ("
2197 << extension->id() << ") installing/upgrading from '" 2220 << extension->id() << ") installing/upgrading from '"
2198 << old_version_string << "' to " << extension->version()->GetString(); 2221 << old_version_string << "' to " << extension->version()->GetString();
2199 2222
2200 AddNewOrUpdatedExtension(extension, 2223 AddNewOrUpdatedExtension(extension,
2201 syncer::StringOrdinal(), 2224 Extension::ENABLED_COMPONENT,
2202 Extension::ENABLED_COMPONENT); 2225 syncer::StringOrdinal());
2203 return; 2226 return;
2204 } 2227 }
2205 2228
2206 AddExtension(extension); 2229 AddExtension(extension);
2207 } 2230 }
2208 2231
2209 void ExtensionService::InitializePermissions(const Extension* extension) { 2232 void ExtensionService::InitializePermissions(const Extension* extension) {
2210 // If the extension has used the optional permissions API, it will have a 2233 // If the extension has used the optional permissions API, it will have a
2211 // custom set of active permissions defined in the extension prefs. Here, 2234 // custom set of active permissions defined in the extension prefs. Here,
2212 // we update the extension's active permissions based on the prefs. 2235 // we update the extension's active permissions based on the prefs.
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
2449 UMA_HISTOGRAM_ENUMERATION("Extensions.UpdateType", 2472 UMA_HISTOGRAM_ENUMERATION("Extensions.UpdateType",
2450 extension->GetType(), 100); 2473 extension->GetType(), 100);
2451 UMA_HISTOGRAM_ENUMERATION("Extensions.UpdateSource", 2474 UMA_HISTOGRAM_ENUMERATION("Extensions.UpdateSource",
2452 extension->location(), Extension::NUM_LOCATIONS); 2475 extension->location(), Extension::NUM_LOCATIONS);
2453 } 2476 }
2454 2477
2455 // Certain extension locations are specific enough that we can 2478 // Certain extension locations are specific enough that we can
2456 // auto-acknowledge any extension that came from one of them. 2479 // auto-acknowledge any extension that came from one of them.
2457 if (extension->location() == Extension::EXTERNAL_POLICY_DOWNLOAD) 2480 if (extension->location() == Extension::EXTERNAL_POLICY_DOWNLOAD)
2458 AcknowledgeExternalExtension(extension->id()); 2481 AcknowledgeExternalExtension(extension->id());
2459 2482 const Extension::State initial_state =
2483 initial_enable ? Extension::ENABLED : Extension::DISABLED;
2460 if (ShouldDelayExtensionUpdate(id, wait_for_idle)) { 2484 if (ShouldDelayExtensionUpdate(id, wait_for_idle)) {
2461 extension_prefs_->SetIdleInstallInfo( 2485 extension_prefs_->SetIdleInstallInfo(extension, initial_state,
2462 extension, 2486 page_ordinal);
2463 initial_enable ? Extension::ENABLED : Extension::DISABLED,
2464 page_ordinal);
2465 2487
2466 // Transfer ownership of |extension|. 2488 // Transfer ownership of |extension|.
2467 pending_extension_updates_.Insert(extension); 2489 delayed_for_idle_updates_.Insert(extension);
2468 2490
2469 // Notify extension of available update. 2491 // Notify extension of available update.
2470 extensions::RuntimeEventRouter::DispatchOnUpdateAvailableEvent( 2492 extensions::RuntimeEventRouter::DispatchOnUpdateAvailableEvent(
2471 profile_, id, extension->manifest()->value()); 2493 profile_, id, extension->manifest()->value());
2472 return; 2494 return;
2473 } 2495 }
2474 2496
2475 // Transfer ownership of |extension|. 2497 if (installs_delayed()) {
2476 AddNewOrUpdatedExtension( 2498 extension_prefs_->SetIdleInstallInfo(extension, initial_state,
Matt Perry 2012/12/08 01:55:33 naming nit: this should probably be SetDelayedInst
awong 2012/12/08 02:11:09 Right...meant to do that. Done now. Also renamed
2477 extension, 2499 page_ordinal);
2478 page_ordinal, 2500 delayed_installs_.Insert(extension);
2479 initial_enable ? Extension::ENABLED : Extension::DISABLED); 2501 } else {
2502 AddNewOrUpdatedExtension(extension, initial_state, page_ordinal);
2503 }
2480 } 2504 }
2481 2505
2482 void ExtensionService::AddNewOrUpdatedExtension( 2506 void ExtensionService::AddNewOrUpdatedExtension(
2483 const Extension* extension, 2507 const Extension* extension,
2484 const syncer::StringOrdinal& page_ordinal, 2508 Extension::State initial_state,
2485 Extension::State initial_state) { 2509 const syncer::StringOrdinal& page_ordinal) {
2486 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2510 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2487 2511
2488 extension_prefs_->OnExtensionInstalled( 2512 extension_prefs_->OnExtensionInstalled(
2489 extension, 2513 extension,
2490 initial_state, 2514 initial_state,
2491 page_ordinal); 2515 page_ordinal);
2492 2516
2493 // Unpacked extensions default to allowing file access, but if that has been
2494 // overridden, don't reset the value.
2495 if (Extension::ShouldAlwaysAllowFileAccess(extension->location()) &&
2496 !extension_prefs_->HasAllowFileAccessSetting(extension->id())) {
2497 extension_prefs_->SetAllowFileAccess(extension->id(), true);
2498 }
2499
2500 FinishInstallation(extension); 2517 FinishInstallation(extension);
2501 } 2518 }
2502 2519
2503 void ExtensionService::MaybeFinishDelayedInstallation( 2520 void ExtensionService::MaybeFinishDelayedInstallation(
2504 const std::string& extension_id) { 2521 const std::string& extension_id) {
2505 // Check if the extension already got updated. 2522 // Check if the extension already got updated.
2506 if (!pending_extension_updates_.Contains(extension_id)) 2523 if (!delayed_for_idle_updates_.Contains(extension_id))
2507 return; 2524 return;
2508 // Check if the extension is idle. 2525 // Check if the extension is idle.
2509 if (!IsExtensionIdle(extension_id)) 2526 if (!IsExtensionIdle(extension_id))
2510 return; 2527 return;
2511 2528
2512 FinishDelayedInstallation(extension_id); 2529 FinishDelayedInstallation(extension_id);
2513 } 2530 }
2514 2531
2515 void ExtensionService::FinishDelayedInstallation( 2532 void ExtensionService::FinishDelayedInstallation(
2516 const std::string& extension_id) { 2533 const std::string& extension_id) {
2517 scoped_refptr<const Extension> extension( 2534 scoped_refptr<const Extension> extension(
2518 GetPendingExtensionUpdate(extension_id)); 2535 GetPendingExtensionUpdate(extension_id));
2519 CHECK(extension); 2536 CHECK(extension);
2520 pending_extension_updates_.Remove(extension_id); 2537 delayed_for_idle_updates_.Remove(extension_id);
2521 2538
2522 if (!extension_prefs_->FinishIdleInstallInfo(extension_id)) 2539 if (!extension_prefs_->FinishIdleInstallInfo(extension_id))
2523 NOTREACHED(); 2540 NOTREACHED();
2524 2541
2525 FinishInstallation(extension); 2542 FinishInstallation(extension);
2526 } 2543 }
2527 2544
2528 void ExtensionService::FinishInstallation(const Extension* extension) { 2545 void ExtensionService::FinishInstallation(const Extension* extension) {
2529 content::NotificationService::current()->Notify( 2546 content::NotificationService::current()->Notify(
2530 chrome::NOTIFICATION_EXTENSION_INSTALLED, 2547 chrome::NOTIFICATION_EXTENSION_INSTALLED,
2531 content::Source<Profile>(profile_), 2548 content::Source<Profile>(profile_),
2532 content::Details<const Extension>(extension)); 2549 content::Details<const Extension>(extension));
2533 2550
2534 bool unacknowledged_external = IsUnacknowledgedExternalExtension(extension); 2551 bool unacknowledged_external = IsUnacknowledgedExternalExtension(extension);
2535 2552
2553 // Unpacked extensions default to allowing file access, but if that has been
2554 // overridden, don't reset the value.
2555 if (Extension::ShouldAlwaysAllowFileAccess(extension->location()) &&
2556 !extension_prefs_->HasAllowFileAccessSetting(extension->id())) {
2557 extension_prefs_->SetAllowFileAccess(extension->id(), true);
2558 }
2559
2536 AddExtension(extension); 2560 AddExtension(extension);
2537 2561
2538 // If this is a new external extension that was disabled, alert the user 2562 // If this is a new external extension that was disabled, alert the user
2539 // so he can reenable it. We do this last so that it has already been 2563 // so he can reenable it. We do this last so that it has already been
2540 // added to our list of extensions. 2564 // added to our list of extensions.
2541 if (unacknowledged_external) { 2565 if (unacknowledged_external) {
2542 UpdateExternalExtensionAlert(); 2566 UpdateExternalExtensionAlert();
2543 UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEvent", 2567 UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEvent",
2544 EXTERNAL_EXTENSION_INSTALLED, 2568 EXTERNAL_EXTENSION_INSTALLED,
2545 EXTERNAL_EXTENSION_BUCKET_BOUNDARY); 2569 EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
2546 } 2570 }
2547 } 2571 }
2548 2572
2549 const Extension* ExtensionService::GetPendingExtensionUpdate( 2573 const Extension* ExtensionService::GetPendingExtensionUpdate(
2550 const std::string& id) const { 2574 const std::string& id) const {
2551 return pending_extension_updates_.GetByID(id); 2575 return delayed_for_idle_updates_.GetByID(id);
2552 } 2576 }
2553 2577
2554 void ExtensionService::TrackTerminatedExtension(const Extension* extension) { 2578 void ExtensionService::TrackTerminatedExtension(const Extension* extension) {
2555 if (!terminated_extensions_.Contains(extension->id())) 2579 if (!terminated_extensions_.Contains(extension->id()))
2556 terminated_extensions_.Insert(make_scoped_refptr(extension)); 2580 terminated_extensions_.Insert(make_scoped_refptr(extension));
2557 2581
2558 UnloadExtension(extension->id(), extension_misc::UNLOAD_REASON_TERMINATE); 2582 UnloadExtension(extension->id(), extension_misc::UNLOAD_REASON_TERMINATE);
2559 } 2583 }
2560 2584
2561 void ExtensionService::UntrackTerminatedExtension(const std::string& id) { 2585 void ExtensionService::UntrackTerminatedExtension(const std::string& id) {
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
2787 break; 2811 break;
2788 } 2812 }
2789 case chrome::NOTIFICATION_IMPORT_FINISHED: { 2813 case chrome::NOTIFICATION_IMPORT_FINISHED: {
2790 InitAfterImport(); 2814 InitAfterImport();
2791 break; 2815 break;
2792 } 2816 }
2793 case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: { 2817 case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: {
2794 extensions::ExtensionHost* host = 2818 extensions::ExtensionHost* host =
2795 content::Details<extensions::ExtensionHost>(details).ptr(); 2819 content::Details<extensions::ExtensionHost>(details).ptr();
2796 std::string extension_id = host->extension_id(); 2820 std::string extension_id = host->extension_id();
2797 if (pending_extension_updates_.Contains(extension_id)) { 2821 if (delayed_for_idle_updates_.Contains(extension_id)) {
2798 // We were waiting for this extension to become idle, it now might have, 2822 // We were waiting for this extension to become idle, it now might have,
2799 // so maybe finish installation. 2823 // so maybe finish installation.
2800 MessageLoop::current()->PostDelayedTask( 2824 MessageLoop::current()->PostDelayedTask(
2801 FROM_HERE, 2825 FROM_HERE,
2802 base::Bind(&ExtensionService::MaybeFinishDelayedInstallation, 2826 base::Bind(&ExtensionService::MaybeFinishDelayedInstallation,
2803 AsWeakPtr(), extension_id), 2827 AsWeakPtr(), extension_id),
2804 base::TimeDelta::FromSeconds(kUpdateIdleDelay)); 2828 base::TimeDelta::FromSeconds(kUpdateIdleDelay));
2805 } 2829 }
2806 break; 2830 break;
2807 } 2831 }
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
3075 // Delay installation if the extension listens for the onUpdateAvailable 3099 // Delay installation if the extension listens for the onUpdateAvailable
3076 // event. 3100 // event.
3077 return system_->event_router()->ExtensionHasEventListener( 3101 return system_->event_router()->ExtensionHasEventListener(
3078 extension_id, kOnUpdateAvailableEvent); 3102 extension_id, kOnUpdateAvailableEvent);
3079 } else { 3103 } else {
3080 // Delay installation if the extension is not idle. 3104 // Delay installation if the extension is not idle.
3081 return !IsExtensionIdle(extension_id); 3105 return !IsExtensionIdle(extension_id);
3082 } 3106 }
3083 } 3107 }
3084 3108
3109 void ExtensionService::GarbageCollectIsolatedStorage() {
3110 scoped_ptr<base::hash_set<FilePath> > active_paths(
3111 new base::hash_set<FilePath>());
3112 for (ExtensionSet::const_iterator it = extensions_.begin();
3113 it != extensions_.end(); ++it) {
3114 if ((*it)->is_storage_isolated()) {
3115 active_paths->insert(
3116 BrowserContext::GetStoragePartitionForSite(
3117 profile_,
3118 GetSiteForExtensionId((*it)->id()))->GetPath());
3119 }
3120 }
3121
3122 DCHECK(!installs_delayed());
3123 set_installs_delayed(true);
3124 BrowserContext::GarbageCollectStoragePartitions(
3125 profile_, active_paths.Pass(),
3126 base::Bind(&ExtensionService::OnGarbageCollectIsolatedStorageFinished,
3127 AsWeakPtr()));
3128 }
3129
3130 void ExtensionService::OnGarbageCollectIsolatedStorageFinished() {
3131 set_installs_delayed(false);
3132 for (ExtensionSet::const_iterator it = delayed_installs_.begin();
3133 it != delayed_installs_.end();
3134 ++it) {
3135 FinishDelayedInstallation((*it)->id());
3136 }
3137 for (ExtensionSet::const_iterator it = delayed_for_idle_updates_.begin();
3138 it != delayed_for_idle_updates_.end();
3139 ++it) {
3140 MaybeFinishDelayedInstallation((*it)->id());
3141 }
3142 delayed_installs_.Clear();
3143 }
3144
3145 void ExtensionService::OnNeedsToGarbageCollectedIsolatedStorage() {
Matt Perry 2012/12/08 01:55:33 Collected -> Collect
awong 2012/12/08 02:11:09 Done.
3146 extension_prefs_->SetNeedsStorageGarbageCollection(true);
3147 }
3148
3085 void ExtensionService::OnBlacklistUpdated() { 3149 void ExtensionService::OnBlacklistUpdated() {
3086 blacklist_->GetBlacklistedIDs( 3150 blacklist_->GetBlacklistedIDs(
3087 GenerateInstalledExtensionsSet()->GetIDs(), 3151 GenerateInstalledExtensionsSet()->GetIDs(),
3088 base::Bind(&ExtensionService::ManageBlacklist, 3152 base::Bind(&ExtensionService::ManageBlacklist,
3089 AsWeakPtr(), 3153 AsWeakPtr(),
3090 blacklisted_extensions_.GetIDs())); 3154 blacklisted_extensions_.GetIDs()));
3091 } 3155 }
3092 3156
3093 void ExtensionService::ManageBlacklist( 3157 void ExtensionService::ManageBlacklist(
3094 const std::set<std::string>& old_blacklisted_ids, 3158 const std::set<std::string>& old_blacklisted_ids,
(...skipping 27 matching lines...) Expand all
3122 scoped_refptr<const Extension> extension = GetInstalledExtension(*it); 3186 scoped_refptr<const Extension> extension = GetInstalledExtension(*it);
3123 DCHECK(extension); 3187 DCHECK(extension);
3124 if (!extension) 3188 if (!extension)
3125 continue; 3189 continue;
3126 blacklisted_extensions_.Insert(extension); 3190 blacklisted_extensions_.Insert(extension);
3127 UnloadExtension(*it, extension_misc::UNLOAD_REASON_BLACKLIST); 3191 UnloadExtension(*it, extension_misc::UNLOAD_REASON_BLACKLIST);
3128 } 3192 }
3129 3193
3130 IdentifyAlertableExtensions(); 3194 IdentifyAlertableExtensions();
3131 } 3195 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698