// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/extensions/extension_info_map.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/url_constants.h" #include "content/browser/browser_thread.h" namespace { static void CheckOnValidThread() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); } } // namespace ExtensionInfoMap::ExtensionInfoMap() { } ExtensionInfoMap::~ExtensionInfoMap() { } void ExtensionInfoMap::AddExtension(const Extension* extension) { CheckOnValidThread(); extension_info_[extension->id()] = extension; Map::iterator iter = disabled_extension_info_.find(extension->id()); if (iter != disabled_extension_info_.end()) disabled_extension_info_.erase(iter); } void ExtensionInfoMap::RemoveExtension(const std::string& id, const UnloadedExtensionInfo::Reason reason) { CheckOnValidThread(); Map::iterator iter = extension_info_.find(id); if (iter != extension_info_.end()) { if (reason == UnloadedExtensionInfo::DISABLE) disabled_extension_info_[id] = (*iter).second; extension_info_.erase(iter); } else if (reason != UnloadedExtensionInfo::DISABLE) { // If the extension was uninstalled, make sure it's removed from the map of // disabled extensions. disabled_extension_info_.erase(id); } else { // NOTE: This can currently happen if we receive multiple unload // notifications, e.g. setting incognito-enabled state for a // disabled extension (e.g., via sync). See // http://code.google.com/p/chromium/issues/detail?id=50582 . NOTREACHED() << id; } } std::string ExtensionInfoMap::GetNameForExtension(const std::string& id) const { Map::const_iterator iter = extension_info_.find(id); if (iter != extension_info_.end()) return iter->second->name(); else return std::string(); } FilePath ExtensionInfoMap::GetPathForExtension(const std::string& id) const { Map::const_iterator iter = extension_info_.find(id); if (iter != extension_info_.end()) return iter->second->path(); else return FilePath(); } FilePath ExtensionInfoMap::GetPathForDisabledExtension( const std::string& id) const { Map::const_iterator iter = disabled_extension_info_.find(id); if (iter != disabled_extension_info_.end()) return iter->second->path(); else return FilePath(); } bool ExtensionInfoMap::ExtensionHasWebExtent(const std::string& id) const { Map::const_iterator iter = extension_info_.find(id); return iter != extension_info_.end() && !iter->second->web_extent().is_empty(); } bool ExtensionInfoMap::ExtensionCanLoadInIncognito( const std::string& id) const { Map::const_iterator iter = extension_info_.find(id); // Only split-mode extensions can load in incognito profiles. return iter != extension_info_.end() && iter->second->incognito_split_mode(); } std::string ExtensionInfoMap::GetDefaultLocaleForExtension( const std::string& id) const { Map::const_iterator iter = extension_info_.find(id); std::string result; if (iter != extension_info_.end()) result = iter->second->default_locale(); return result; } ExtensionExtent ExtensionInfoMap::GetEffectiveHostPermissionsForExtension( const std::string& id) const { Map::const_iterator iter = extension_info_.find(id); ExtensionExtent result; if (iter != extension_info_.end()) result = iter->second->GetEffectiveHostPermissions(); return result; } bool ExtensionInfoMap::CheckURLAccessToExtensionPermission( const GURL& url, const char* permission_name) const { Map::const_iterator info; if (url.SchemeIs(chrome::kExtensionScheme)) { // If the url is an extension scheme, we just look it up by extension id. std::string id = url.host(); info = extension_info_.find(id); } else { // Otherwise, we scan for a matching extent. Overlapping extents are // disallowed, so only one will match. info = extension_info_.begin(); while (info != extension_info_.end() && !info->second->web_extent().ContainsURL(url)) ++info; } if (info == extension_info_.end()) return false; return info->second->api_permissions().count(permission_name) != 0; } bool ExtensionInfoMap::URLIsForExtensionIcon(const GURL& url) const { DCHECK(url.SchemeIs(chrome::kExtensionScheme)); Map::const_iterator iter = extension_info_.find(url.host()); if (iter == extension_info_.end()) { iter = disabled_extension_info_.find(url.host()); if (iter == disabled_extension_info_.end()) return false; } std::string path = url.path(); DCHECK(path.length() > 0 && path[0] == '/'); path = path.substr(1); return iter->second->icons().ContainsPath(path); }