| 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_info_map.h" | 5 #include "extensions/browser/info_map.h" |
| 6 | 6 |
| 7 #include "chrome/common/extensions/extension.h" | 7 #include "chrome/common/extensions/extension.h" |
| 8 #include "chrome/common/extensions/extension_set.h" | 8 #include "chrome/common/extensions/extension_set.h" |
| 9 #include "chrome/common/url_constants.h" | |
| 10 #include "content/public/browser/browser_thread.h" | 9 #include "content/public/browser/browser_thread.h" |
| 11 #include "extensions/common/constants.h" | 10 #include "extensions/common/constants.h" |
| 12 #include "extensions/common/manifest_handlers/incognito_info.h" | 11 #include "extensions/common/manifest_handlers/incognito_info.h" |
| 13 | 12 |
| 14 using content::BrowserThread; | 13 using content::BrowserThread; |
| 15 using extensions::Extension; | 14 |
| 16 using extensions::UnloadedExtensionInfo; | 15 namespace extensions { |
| 17 | 16 |
| 18 namespace { | 17 namespace { |
| 19 | 18 |
| 20 void CheckOnValidThread() { | 19 void CheckOnValidThread() { |
| 21 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 20 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 22 } | 21 } |
| 23 | 22 |
| 24 } // namespace | 23 } // namespace |
| 25 | 24 |
| 26 struct ExtensionInfoMap::ExtraData { | 25 struct InfoMap::ExtraData { |
| 27 // When the extension was installed. | 26 // When the extension was installed. |
| 28 base::Time install_time; | 27 base::Time install_time; |
| 29 | 28 |
| 30 // True if the user has allowed this extension to run in incognito mode. | 29 // True if the user has allowed this extension to run in incognito mode. |
| 31 bool incognito_enabled; | 30 bool incognito_enabled; |
| 32 | 31 |
| 33 ExtraData(); | 32 ExtraData(); |
| 34 ~ExtraData(); | 33 ~ExtraData(); |
| 35 }; | 34 }; |
| 36 | 35 |
| 37 ExtensionInfoMap::ExtraData::ExtraData() : incognito_enabled(false) {} | 36 InfoMap::ExtraData::ExtraData() : incognito_enabled(false) {} |
| 38 | 37 |
| 39 ExtensionInfoMap::ExtraData::~ExtraData() {} | 38 InfoMap::ExtraData::~ExtraData() {} |
| 40 | 39 |
| 41 ExtensionInfoMap::ExtensionInfoMap() : signin_process_id_(-1) {} | 40 InfoMap::InfoMap() : signin_process_id_(-1) {} |
| 42 | 41 |
| 43 const extensions::ProcessMap& ExtensionInfoMap::process_map() const { | 42 const ProcessMap& InfoMap::process_map() const { return process_map_; } |
| 44 return process_map_; | |
| 45 } | |
| 46 | 43 |
| 47 void ExtensionInfoMap::AddExtension(const Extension* extension, | 44 void InfoMap::AddExtension(const Extension* extension, |
| 48 base::Time install_time, | 45 base::Time install_time, |
| 49 bool incognito_enabled) { | 46 bool incognito_enabled) { |
| 50 CheckOnValidThread(); | 47 CheckOnValidThread(); |
| 51 extensions_.Insert(extension); | 48 extensions_.Insert(extension); |
| 52 disabled_extensions_.Remove(extension->id()); | 49 disabled_extensions_.Remove(extension->id()); |
| 53 | 50 |
| 54 extra_data_[extension->id()].install_time = install_time; | 51 extra_data_[extension->id()].install_time = install_time; |
| 55 extra_data_[extension->id()].incognito_enabled = incognito_enabled; | 52 extra_data_[extension->id()].incognito_enabled = incognito_enabled; |
| 56 } | 53 } |
| 57 | 54 |
| 58 void ExtensionInfoMap::RemoveExtension( | 55 void InfoMap::RemoveExtension(const std::string& extension_id, |
| 59 const std::string& extension_id, | 56 const UnloadedExtensionInfo::Reason reason) { |
| 60 const UnloadedExtensionInfo::Reason reason) { | |
| 61 CheckOnValidThread(); | 57 CheckOnValidThread(); |
| 62 const Extension* extension = extensions_.GetByID(extension_id); | 58 const Extension* extension = extensions_.GetByID(extension_id); |
| 63 extra_data_.erase(extension_id); // we don't care about disabled extra data | 59 extra_data_.erase(extension_id); // we don't care about disabled extra data |
| 64 bool was_uninstalled = (reason != UnloadedExtensionInfo::REASON_DISABLE && | 60 bool was_uninstalled = (reason != UnloadedExtensionInfo::REASON_DISABLE && |
| 65 reason != UnloadedExtensionInfo::REASON_TERMINATE); | 61 reason != UnloadedExtensionInfo::REASON_TERMINATE); |
| 66 if (extension) { | 62 if (extension) { |
| 67 if (!was_uninstalled) | 63 if (!was_uninstalled) |
| 68 disabled_extensions_.Insert(extension); | 64 disabled_extensions_.Insert(extension); |
| 69 extensions_.Remove(extension_id); | 65 extensions_.Remove(extension_id); |
| 70 } else if (was_uninstalled) { | 66 } else if (was_uninstalled) { |
| 71 // If the extension was uninstalled, make sure it's removed from the map of | 67 // If the extension was uninstalled, make sure it's removed from the map of |
| 72 // disabled extensions. | 68 // disabled extensions. |
| 73 disabled_extensions_.Remove(extension_id); | 69 disabled_extensions_.Remove(extension_id); |
| 74 } else { | 70 } else { |
| 75 // NOTE: This can currently happen if we receive multiple unload | 71 // NOTE: This can currently happen if we receive multiple unload |
| 76 // notifications, e.g. setting incognito-enabled state for a | 72 // notifications, e.g. setting incognito-enabled state for a |
| 77 // disabled extension (e.g., via sync). See | 73 // disabled extension (e.g., via sync). See |
| 78 // http://code.google.com/p/chromium/issues/detail?id=50582 . | 74 // http://code.google.com/p/chromium/issues/detail?id=50582 . |
| 79 NOTREACHED() << extension_id; | 75 NOTREACHED() << extension_id; |
| 80 } | 76 } |
| 81 } | 77 } |
| 82 | 78 |
| 83 base::Time ExtensionInfoMap::GetInstallTime( | 79 base::Time InfoMap::GetInstallTime(const std::string& extension_id) const { |
| 84 const std::string& extension_id) const { | |
| 85 ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); | 80 ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); |
| 86 if (iter != extra_data_.end()) | 81 if (iter != extra_data_.end()) |
| 87 return iter->second.install_time; | 82 return iter->second.install_time; |
| 88 return base::Time(); | 83 return base::Time(); |
| 89 } | 84 } |
| 90 | 85 |
| 91 bool ExtensionInfoMap::IsIncognitoEnabled( | 86 bool InfoMap::IsIncognitoEnabled(const std::string& extension_id) const { |
| 92 const std::string& extension_id) const { | |
| 93 // Keep in sync with duplicate in extension_process_manager.cc. | 87 // Keep in sync with duplicate in extension_process_manager.cc. |
| 94 ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); | 88 ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); |
| 95 if (iter != extra_data_.end()) | 89 if (iter != extra_data_.end()) |
| 96 return iter->second.incognito_enabled; | 90 return iter->second.incognito_enabled; |
| 97 return false; | 91 return false; |
| 98 } | 92 } |
| 99 | 93 |
| 100 bool ExtensionInfoMap::CanCrossIncognito(const Extension* extension) const { | 94 bool InfoMap::CanCrossIncognito(const Extension* extension) const { |
| 101 // This is duplicated from ExtensionService :(. | 95 // This is duplicated from ExtensionService :(. |
| 102 return IsIncognitoEnabled(extension->id()) && | 96 return IsIncognitoEnabled(extension->id()) && |
| 103 !extensions::IncognitoInfo::IsSplitMode(extension); | 97 !IncognitoInfo::IsSplitMode(extension); |
| 104 } | 98 } |
| 105 | 99 |
| 106 void ExtensionInfoMap::RegisterExtensionProcess(const std::string& extension_id, | 100 void InfoMap::RegisterExtensionProcess(const std::string& extension_id, |
| 107 int process_id, | 101 int process_id, |
| 108 int site_instance_id) { | 102 int site_instance_id) { |
| 109 if (!process_map_.Insert(extension_id, process_id, site_instance_id)) { | 103 if (!process_map_.Insert(extension_id, process_id, site_instance_id)) { |
| 110 NOTREACHED() << "Duplicate extension process registration for: " | 104 NOTREACHED() << "Duplicate extension process registration for: " |
| 111 << extension_id << "," << process_id << "."; | 105 << extension_id << "," << process_id << "."; |
| 112 } | 106 } |
| 113 } | 107 } |
| 114 | 108 |
| 115 void ExtensionInfoMap::UnregisterExtensionProcess( | 109 void InfoMap::UnregisterExtensionProcess(const std::string& extension_id, |
| 116 const std::string& extension_id, | 110 int process_id, |
| 117 int process_id, | 111 int site_instance_id) { |
| 118 int site_instance_id) { | |
| 119 if (!process_map_.Remove(extension_id, process_id, site_instance_id)) { | 112 if (!process_map_.Remove(extension_id, process_id, site_instance_id)) { |
| 120 NOTREACHED() << "Unknown extension process registration for: " | 113 NOTREACHED() << "Unknown extension process registration for: " |
| 121 << extension_id << "," << process_id << "."; | 114 << extension_id << "," << process_id << "."; |
| 122 } | 115 } |
| 123 } | 116 } |
| 124 | 117 |
| 125 void ExtensionInfoMap::UnregisterAllExtensionsInProcess(int process_id) { | 118 void InfoMap::UnregisterAllExtensionsInProcess(int process_id) { |
| 126 process_map_.RemoveAllFromProcess(process_id); | 119 process_map_.RemoveAllFromProcess(process_id); |
| 127 } | 120 } |
| 128 | 121 |
| 129 void ExtensionInfoMap::GetExtensionsWithAPIPermissionForSecurityOrigin( | 122 void InfoMap::GetExtensionsWithAPIPermissionForSecurityOrigin( |
| 130 const GURL& origin, | 123 const GURL& origin, |
| 131 int process_id, | 124 int process_id, |
| 132 extensions::APIPermission::ID permission, | 125 APIPermission::ID permission, |
| 133 ExtensionSet* extensions) const { | 126 ExtensionSet* extensions) const { |
| 134 DCHECK(extensions); | 127 DCHECK(extensions); |
| 135 | 128 |
| 136 if (origin.SchemeIs(extensions::kExtensionScheme)) { | 129 if (origin.SchemeIs(kExtensionScheme)) { |
| 137 const std::string& id = origin.host(); | 130 const std::string& id = origin.host(); |
| 138 const Extension* extension = extensions_.GetByID(id); | 131 const Extension* extension = extensions_.GetByID(id); |
| 139 if (extension && extension->HasAPIPermission(permission) && | 132 if (extension && extension->HasAPIPermission(permission) && |
| 140 process_map_.Contains(id, process_id)) { | 133 process_map_.Contains(id, process_id)) { |
| 141 extensions->Insert(extension); | 134 extensions->Insert(extension); |
| 142 } | 135 } |
| 143 return; | 136 return; |
| 144 } | 137 } |
| 145 | 138 |
| 146 ExtensionSet::const_iterator i = extensions_.begin(); | 139 ExtensionSet::const_iterator i = extensions_.begin(); |
| 147 for (; i != extensions_.end(); ++i) { | 140 for (; i != extensions_.end(); ++i) { |
| 148 if ((*i)->web_extent().MatchesSecurityOrigin(origin) && | 141 if ((*i)->web_extent().MatchesSecurityOrigin(origin) && |
| 149 process_map_.Contains((*i)->id(), process_id) && | 142 process_map_.Contains((*i)->id(), process_id) && |
| 150 (*i)->HasAPIPermission(permission)) { | 143 (*i)->HasAPIPermission(permission)) { |
| 151 extensions->Insert(*i); | 144 extensions->Insert(*i); |
| 152 } | 145 } |
| 153 } | 146 } |
| 154 } | 147 } |
| 155 | 148 |
| 156 bool ExtensionInfoMap::SecurityOriginHasAPIPermission( | 149 bool InfoMap::SecurityOriginHasAPIPermission(const GURL& origin, |
| 157 const GURL& origin, int process_id, | 150 int process_id, |
| 158 extensions::APIPermission::ID permission) const { | 151 APIPermission::ID permission) |
| 152 const { |
| 159 ExtensionSet extensions; | 153 ExtensionSet extensions; |
| 160 GetExtensionsWithAPIPermissionForSecurityOrigin( | 154 GetExtensionsWithAPIPermissionForSecurityOrigin( |
| 161 origin, process_id, permission, &extensions); | 155 origin, process_id, permission, &extensions); |
| 162 return !extensions.is_empty(); | 156 return !extensions.is_empty(); |
| 163 } | 157 } |
| 164 | 158 |
| 165 ExtensionsQuotaService* ExtensionInfoMap::GetQuotaService() { | 159 QuotaService* InfoMap::GetQuotaService() { |
| 166 CheckOnValidThread(); | 160 CheckOnValidThread(); |
| 167 if (!quota_service_) | 161 if (!quota_service_) |
| 168 quota_service_.reset(new ExtensionsQuotaService()); | 162 quota_service_.reset(new QuotaService()); |
| 169 return quota_service_.get(); | 163 return quota_service_.get(); |
| 170 } | 164 } |
| 171 | 165 |
| 172 void ExtensionInfoMap::SetSigninProcess(int process_id) { | 166 void InfoMap::SetSigninProcess(int process_id) { |
| 173 signin_process_id_ = process_id; | 167 signin_process_id_ = process_id; |
| 174 } | 168 } |
| 175 | 169 |
| 176 bool ExtensionInfoMap::IsSigninProcess(int process_id) const { | 170 bool InfoMap::IsSigninProcess(int process_id) const { |
| 177 return process_id == signin_process_id_; | 171 return process_id == signin_process_id_; |
| 178 } | 172 } |
| 179 | 173 |
| 180 ExtensionInfoMap::~ExtensionInfoMap() { | 174 InfoMap::~InfoMap() { |
| 181 if (quota_service_) { | 175 if (quota_service_) { |
| 182 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, | 176 BrowserThread::DeleteSoon( |
| 183 quota_service_.release()); | 177 BrowserThread::IO, FROM_HERE, quota_service_.release()); |
| 184 } | 178 } |
| 185 } | 179 } |
| 180 |
| 181 } // namespace extensions |
| OLD | NEW |