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

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

Issue 131743021: app_shell: Extract extension runtime data from ExtensionService (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cleanup, unit test (runtime_data) Created 6 years, 11 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) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 #include "content/public/browser/url_data_source.h" 75 #include "content/public/browser/url_data_source.h"
76 #include "extensions/browser/app_sorting.h" 76 #include "extensions/browser/app_sorting.h"
77 #include "extensions/browser/event_router.h" 77 #include "extensions/browser/event_router.h"
78 #include "extensions/browser/extension_registry.h" 78 #include "extensions/browser/extension_registry.h"
79 #include "extensions/browser/extensions_browser_client.h" 79 #include "extensions/browser/extensions_browser_client.h"
80 #include "extensions/browser/external_provider_interface.h" 80 #include "extensions/browser/external_provider_interface.h"
81 #include "extensions/browser/management_policy.h" 81 #include "extensions/browser/management_policy.h"
82 #include "extensions/browser/pending_extension_manager.h" 82 #include "extensions/browser/pending_extension_manager.h"
83 #include "extensions/browser/pref_names.h" 83 #include "extensions/browser/pref_names.h"
84 #include "extensions/browser/process_manager.h" 84 #include "extensions/browser/process_manager.h"
85 #include "extensions/browser/runtime_data.h"
85 #include "extensions/browser/update_observer.h" 86 #include "extensions/browser/update_observer.h"
86 #include "extensions/common/constants.h" 87 #include "extensions/common/constants.h"
87 #include "extensions/common/error_utils.h" 88 #include "extensions/common/error_utils.h"
88 #include "extensions/common/extension.h" 89 #include "extensions/common/extension.h"
89 #include "extensions/common/extensions_client.h" 90 #include "extensions/common/extensions_client.h"
90 #include "extensions/common/feature_switch.h" 91 #include "extensions/common/feature_switch.h"
91 #include "extensions/common/manifest.h" 92 #include "extensions/common/manifest.h"
92 #include "extensions/common/manifest_constants.h" 93 #include "extensions/common/manifest_constants.h"
93 #include "extensions/common/manifest_handlers/background_info.h" 94 #include "extensions/common/manifest_handlers/background_info.h"
94 #include "extensions/common/manifest_handlers/incognito_info.h" 95 #include "extensions/common/manifest_handlers/incognito_info.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 return IsCWSSharedModule(extension); 182 return IsCWSSharedModule(extension);
182 } 183 }
183 184
184 private: 185 private:
185 DISALLOW_COPY_AND_ASSIGN(SharedModuleProvider); 186 DISALLOW_COPY_AND_ASSIGN(SharedModuleProvider);
186 }; 187 };
187 188
188 189
189 } // namespace 190 } // namespace
190 191
191 ExtensionService::ExtensionRuntimeData::ExtensionRuntimeData()
192 : background_page_ready(false),
193 being_upgraded(false),
194 has_used_webrequest(false) {
195 }
196
197 ExtensionService::ExtensionRuntimeData::~ExtensionRuntimeData() {
198 }
199
200 // ExtensionService. 192 // ExtensionService.
201 193
202 void ExtensionService::CheckExternalUninstall(const std::string& id) { 194 void ExtensionService::CheckExternalUninstall(const std::string& id) {
203 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 195 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
204 196
205 // Check if the providers know about this extension. 197 // Check if the providers know about this extension.
206 extensions::ProviderCollection::const_iterator i; 198 extensions::ProviderCollection::const_iterator i;
207 for (i = external_extension_providers_.begin(); 199 for (i = external_extension_providers_.begin();
208 i != external_extension_providers_.end(); ++i) { 200 i != external_extension_providers_.end(); ++i) {
209 DCHECK(i->get()->IsReady()); 201 DCHECK(i->get()->IsReady());
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 if (host && DevToolsAgentHost::HasFor(host->render_view_host())) { 724 if (host && DevToolsAgentHost::HasFor(host->render_view_host())) {
733 // Look for an open inspector for the background page. 725 // Look for an open inspector for the background page.
734 scoped_refptr<DevToolsAgentHost> agent_host = 726 scoped_refptr<DevToolsAgentHost> agent_host =
735 DevToolsAgentHost::GetOrCreateFor(host->render_view_host()); 727 DevToolsAgentHost::GetOrCreateFor(host->render_view_host());
736 agent_host->DisconnectRenderViewHost(); 728 agent_host->DisconnectRenderViewHost();
737 orphaned_dev_tools_[extension_id] = agent_host; 729 orphaned_dev_tools_[extension_id] = agent_host;
738 } 730 }
739 731
740 path = current_extension->path(); 732 path = current_extension->path();
741 // BeingUpgraded is set back to false when the extension is added. 733 // BeingUpgraded is set back to false when the extension is added.
742 SetBeingUpgraded(current_extension, true); 734 system_->runtime_data()->SetBeingUpgraded(current_extension, true);
743 DisableExtension(extension_id, Extension::DISABLE_RELOAD); 735 DisableExtension(extension_id, Extension::DISABLE_RELOAD);
744 reloading_extensions_.insert(extension_id); 736 reloading_extensions_.insert(extension_id);
745 } else { 737 } else {
746 path = unloaded_extension_paths_[extension_id]; 738 path = unloaded_extension_paths_[extension_id];
747 } 739 }
748 740
749 if (delayed_installs_.Contains(extension_id)) { 741 if (delayed_installs_.Contains(extension_id)) {
750 FinishDelayedInstallation(extension_id); 742 FinishDelayedInstallation(extension_id);
751 return; 743 return;
752 } 744 }
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 963
972 extension_prefs_->SetExtensionState(extension_id, Extension::DISABLED); 964 extension_prefs_->SetExtensionState(extension_id, Extension::DISABLED);
973 extension_prefs_->AddDisableReason(extension_id, disable_reason); 965 extension_prefs_->AddDisableReason(extension_id, disable_reason);
974 966
975 int include_mask = 967 int include_mask =
976 ExtensionRegistry::EVERYTHING & ~ExtensionRegistry::DISABLED; 968 ExtensionRegistry::EVERYTHING & ~ExtensionRegistry::DISABLED;
977 extension = registry_->GetExtensionById(extension_id, include_mask); 969 extension = registry_->GetExtensionById(extension_id, include_mask);
978 if (!extension) 970 if (!extension)
979 return; 971 return;
980 972
981 // Reset the background_page_ready flag 973 // Reset the background_page_ready flag.
982 if (extensions::BackgroundInfo::HasBackgroundPage(extension)) 974 if (extensions::BackgroundInfo::HasBackgroundPage(extension))
983 extension_runtime_data_[extension->id()].background_page_ready = false; 975 system_->runtime_data()->SetBackgroundPageReady(extension, false);
984 976
985 // Move it over to the disabled list. Don't send a second unload notification 977 // Move it over to the disabled list. Don't send a second unload notification
986 // for terminated extensions being disabled. 978 // for terminated extensions being disabled.
987 registry_->AddDisabled(make_scoped_refptr(extension)); 979 registry_->AddDisabled(make_scoped_refptr(extension));
988 if (registry_->enabled_extensions().Contains(extension->id())) { 980 if (registry_->enabled_extensions().Contains(extension->id())) {
989 registry_->RemoveEnabled(extension->id()); 981 registry_->RemoveEnabled(extension->id());
990 NotifyExtensionUnloaded(extension, UnloadedExtensionInfo::REASON_DISABLE); 982 NotifyExtensionUnloaded(extension, UnloadedExtensionInfo::REASON_DISABLE);
991 } else { 983 } else {
992 registry_->RemoveTerminated(extension->id()); 984 registry_->RemoveTerminated(extension->id());
993 } 985 }
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after
1583 } 1575 }
1584 1576
1585 // Keep information about the extension so that we can reload it later 1577 // Keep information about the extension so that we can reload it later
1586 // even if it's not permanently installed. 1578 // even if it's not permanently installed.
1587 unloaded_extension_paths_[extension->id()] = extension->path(); 1579 unloaded_extension_paths_[extension->id()] = extension->path();
1588 1580
1589 // Clean up if the extension is meant to be enabled after a reload. 1581 // Clean up if the extension is meant to be enabled after a reload.
1590 reloading_extensions_.erase(extension->id()); 1582 reloading_extensions_.erase(extension->id());
1591 1583
1592 // Clean up runtime data. 1584 // Clean up runtime data.
1593 extension_runtime_data_.erase(extension_id); 1585 system_->runtime_data()->Erase(extension);
not at google - send to devlin 2014/01/18 01:09:04 I would expect RuntimeData to be able to manage cl
James Cook 2014/01/18 02:01:18 I didn't do that because NOTIFICATION_EXTENSION_UN
not at google - send to devlin 2014/01/21 18:47:47 Ah right. I think the solution to this would be to
1594 1586
1595 if (registry_->disabled_extensions().Contains(extension->id())) { 1587 if (registry_->disabled_extensions().Contains(extension->id())) {
1596 registry_->RemoveDisabled(extension->id()); 1588 registry_->RemoveDisabled(extension->id());
1597 // Make sure the profile cleans up its RequestContexts when an already 1589 // Make sure the profile cleans up its RequestContexts when an already
1598 // disabled extension is unloaded (since they are also tracking the disabled 1590 // disabled extension is unloaded (since they are also tracking the disabled
1599 // extensions). 1591 // extensions).
1600 system_->UnregisterExtensionWithRequestContexts(extension_id, reason); 1592 system_->UnregisterExtensionWithRequestContexts(extension_id, reason);
1601 } else { 1593 } else {
1602 // Remove the extension from the enabled list. 1594 // Remove the extension from the enabled list.
1603 registry_->RemoveEnabled(extension->id()); 1595 registry_->RemoveEnabled(extension->id());
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1713 if (old) { 1705 if (old) {
1714 is_extension_installed = true; 1706 is_extension_installed = true;
1715 int version_compare_result = 1707 int version_compare_result =
1716 extension->version()->CompareTo(*(old->version())); 1708 extension->version()->CompareTo(*(old->version()));
1717 is_extension_upgrade = version_compare_result > 0; 1709 is_extension_upgrade = version_compare_result > 0;
1718 // Other than for unpacked extensions, CrxInstaller should have guaranteed 1710 // Other than for unpacked extensions, CrxInstaller should have guaranteed
1719 // that we aren't downgrading. 1711 // that we aren't downgrading.
1720 if (!Manifest::IsUnpackedLocation(extension->location())) 1712 if (!Manifest::IsUnpackedLocation(extension->location()))
1721 CHECK_GE(version_compare_result, 0); 1713 CHECK_GE(version_compare_result, 0);
1722 } 1714 }
1723 SetBeingUpgraded(extension, is_extension_upgrade); 1715 system_->runtime_data()->SetBeingUpgraded(extension, is_extension_upgrade);
1724 1716
1725 // The extension is now loaded, remove its data from unloaded extension map. 1717 // The extension is now loaded, remove its data from unloaded extension map.
1726 unloaded_extension_paths_.erase(extension->id()); 1718 unloaded_extension_paths_.erase(extension->id());
1727 1719
1728 // If a terminated extension is loaded, remove it from the terminated list. 1720 // If a terminated extension is loaded, remove it from the terminated list.
1729 UntrackTerminatedExtension(extension->id()); 1721 UntrackTerminatedExtension(extension->id());
1730 1722
1731 // If the extension was disabled for a reload, then enable it. 1723 // If the extension was disabled for a reload, then enable it.
1732 bool reloading = reloading_extensions_.erase(extension->id()) > 0; 1724 bool reloading = reloading_extensions_.erase(extension->id()) > 0;
1733 1725
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1776 } 1768 }
1777 extension_prefs_->app_sorting()->EnsureValidOrdinals( 1769 extension_prefs_->app_sorting()->EnsureValidOrdinals(
1778 extension->id(), syncer::StringOrdinal()); 1770 extension->id(), syncer::StringOrdinal());
1779 } 1771 }
1780 1772
1781 registry_->AddEnabled(extension); 1773 registry_->AddEnabled(extension);
1782 if (extension_sync_service_) 1774 if (extension_sync_service_)
1783 extension_sync_service_->SyncExtensionChangeIfNeeded(*extension); 1775 extension_sync_service_->SyncExtensionChangeIfNeeded(*extension);
1784 NotifyExtensionLoaded(extension); 1776 NotifyExtensionLoaded(extension);
1785 } 1777 }
1786 SetBeingUpgraded(extension, false); 1778 system_->runtime_data()->SetBeingUpgraded(extension, false);
1787 } 1779 }
1788 1780
1789 void ExtensionService::AddComponentExtension(const Extension* extension) { 1781 void ExtensionService::AddComponentExtension(const Extension* extension) {
1790 const std::string old_version_string( 1782 const std::string old_version_string(
1791 extension_prefs_->GetVersionString(extension->id())); 1783 extension_prefs_->GetVersionString(extension->id()));
1792 const Version old_version(old_version_string); 1784 const Version old_version(old_version_string);
1793 1785
1794 VLOG(1) << "AddComponentExtension " << extension->name(); 1786 VLOG(1) << "AddComponentExtension " << extension->name();
1795 if (!old_version.IsValid() || !old_version.Equals(*extension->version())) { 1787 if (!old_version.IsValid() || !old_version.Equals(*extension->version())) {
1796 VLOG(1) << "Component extension " << extension->name() << " (" 1788 VLOG(1) << "Component extension " << extension->name() << " ("
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after
2609 const ExtensionSet& extensions = registry_->enabled_extensions(); 2601 const ExtensionSet& extensions = registry_->enabled_extensions();
2610 for (ExtensionSet::const_iterator it = extensions.begin(); 2602 for (ExtensionSet::const_iterator it = extensions.begin();
2611 it != extensions.end(); ++it) { 2603 it != extensions.end(); ++it) {
2612 if ((*it)->is_app() && (*it)->location() != Manifest::COMPONENT) 2604 if ((*it)->is_app() && (*it)->location() != Manifest::COMPONENT)
2613 result.insert((*it)->id()); 2605 result.insert((*it)->id());
2614 } 2606 }
2615 2607
2616 return result; 2608 return result;
2617 } 2609 }
2618 2610
2619 bool ExtensionService::IsBackgroundPageReady(const Extension* extension) const {
2620 if (!extensions::BackgroundInfo::HasPersistentBackgroundPage(extension))
2621 return true;
2622 ExtensionRuntimeDataMap::const_iterator it =
2623 extension_runtime_data_.find(extension->id());
2624 return it == extension_runtime_data_.end() ? false :
2625 it->second.background_page_ready;
2626 }
2627
2628 void ExtensionService::SetBackgroundPageReady(const Extension* extension) {
2629 DCHECK(extensions::BackgroundInfo::HasBackgroundPage(extension));
2630 extension_runtime_data_[extension->id()].background_page_ready = true;
2631 }
2632
2633 bool ExtensionService::IsBeingUpgraded(const Extension* extension) const {
2634 ExtensionRuntimeDataMap::const_iterator it =
2635 extension_runtime_data_.find(extension->id());
2636 return it == extension_runtime_data_.end() ? false :
2637 it->second.being_upgraded;
2638 }
2639
2640 void ExtensionService::SetBeingUpgraded(const Extension* extension,
2641 bool value) {
2642 extension_runtime_data_[extension->id()].being_upgraded = value;
2643 }
2644
2645 bool ExtensionService::IsBeingReloaded( 2611 bool ExtensionService::IsBeingReloaded(
2646 const std::string& extension_id) const { 2612 const std::string& extension_id) const {
2647 return ContainsKey(extensions_being_reloaded_, extension_id); 2613 return ContainsKey(extensions_being_reloaded_, extension_id);
2648 } 2614 }
2649 2615
2650 void ExtensionService::SetBeingReloaded(const std::string& extension_id, 2616 void ExtensionService::SetBeingReloaded(const std::string& extension_id,
2651 bool isBeingReloaded) { 2617 bool isBeingReloaded) {
2652 if (isBeingReloaded) 2618 if (isBeingReloaded)
2653 extensions_being_reloaded_.insert(extension_id); 2619 extensions_being_reloaded_.insert(extension_id);
2654 else 2620 else
2655 extensions_being_reloaded_.erase(extension_id); 2621 extensions_being_reloaded_.erase(extension_id);
2656 } 2622 }
2657 2623
2658 bool ExtensionService::HasUsedWebRequest(const Extension* extension) const {
2659 ExtensionRuntimeDataMap::const_iterator it =
2660 extension_runtime_data_.find(extension->id());
2661 return it == extension_runtime_data_.end() ? false :
2662 it->second.has_used_webrequest;
2663 }
2664
2665 void ExtensionService::SetHasUsedWebRequest(const Extension* extension,
2666 bool value) {
2667 extension_runtime_data_[extension->id()].has_used_webrequest = value;
2668 }
2669
2670 bool ExtensionService::ShouldEnableOnInstall(const Extension* extension) { 2624 bool ExtensionService::ShouldEnableOnInstall(const Extension* extension) {
2671 // Extensions installed by policy can't be disabled. So even if a previous 2625 // Extensions installed by policy can't be disabled. So even if a previous
2672 // installation disabled the extension, make sure it is now enabled. 2626 // installation disabled the extension, make sure it is now enabled.
2673 if (system_->management_policy()->MustRemainEnabled(extension, NULL)) 2627 if (system_->management_policy()->MustRemainEnabled(extension, NULL))
2674 return true; 2628 return true;
2675 2629
2676 if (extension_prefs_->IsExtensionDisabled(extension->id())) 2630 if (extension_prefs_->IsExtensionDisabled(extension->id()))
2677 return false; 2631 return false;
2678 2632
2679 if (FeatureSwitch::prompt_for_external_extensions()->IsEnabled()) { 2633 if (FeatureSwitch::prompt_for_external_extensions()->IsEnabled()) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
2812 void ExtensionService::RemoveUpdateObserver( 2766 void ExtensionService::RemoveUpdateObserver(
2813 extensions::UpdateObserver* observer) { 2767 extensions::UpdateObserver* observer) {
2814 update_observers_.RemoveObserver(observer); 2768 update_observers_.RemoveObserver(observer);
2815 } 2769 }
2816 2770
2817 // Used only by test code. 2771 // Used only by test code.
2818 void ExtensionService::UnloadAllExtensionsInternal() { 2772 void ExtensionService::UnloadAllExtensionsInternal() {
2819 profile_->GetExtensionSpecialStoragePolicy()->RevokeRightsForAllExtensions(); 2773 profile_->GetExtensionSpecialStoragePolicy()->RevokeRightsForAllExtensions();
2820 2774
2821 registry_->ClearAll(); 2775 registry_->ClearAll();
2822 extension_runtime_data_.clear(); 2776 system_->runtime_data()->ClearAll();
2823 2777
2824 // TODO(erikkay) should there be a notification for this? We can't use 2778 // TODO(erikkay) should there be a notification for this? We can't use
2825 // EXTENSION_UNLOADED since that implies that the extension has been disabled 2779 // EXTENSION_UNLOADED since that implies that the extension has been disabled
2826 // or uninstalled. 2780 // or uninstalled.
2827 } 2781 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698