1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/info_map.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/string_util.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/browser/content_verifier.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/common/extension_resource.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/incognito_info.h" 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/common/manifest_handlers/shared_module_info.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h" 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "url/gurl.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid CheckOnValidThread() { DCHECK_CURRENTLY_ON(BrowserThread::IO); } 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct InfoMap::ExtraData { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the extension was installed. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time install_time; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the user has allowed this extension to run in incognito mode. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool incognito_enabled; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // True if the user has disabled notifications for this extension manually. 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool notifications_disabled; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtraData(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ExtraData(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)InfoMap::ExtraData::ExtraData() 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : incognito_enabled(false), notifications_disabled(false) { 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InfoMap::ExtraData::~ExtraData() {} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)InfoMap::InfoMap() : signin_process_id_(-1) { 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::AddExtension(const Extension* extension, 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Time install_time, 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool incognito_enabled, 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool notifications_disabled) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckOnValidThread(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_.Insert(extension); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disabled_extensions_.Remove(extension->id()); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_data_[extension->id()].install_time = install_time; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_data_[extension->id()].incognito_enabled = incognito_enabled; 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extra_data_[extension->id()].notifications_disabled = notifications_disabled; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::RemoveExtension(const std::string& extension_id, 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const UnloadedExtensionInfo::Reason reason) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckOnValidThread(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = extensions_.GetByID(extension_id); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_data_.erase(extension_id); // we don't care about disabled extra data 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool was_uninstalled = (reason != UnloadedExtensionInfo::REASON_DISABLE && 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) reason != UnloadedExtensionInfo::REASON_TERMINATE); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!was_uninstalled) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disabled_extensions_.Insert(extension); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_.Remove(extension_id); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (was_uninstalled) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the extension was uninstalled, make sure it's removed from the map of 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled extensions. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disabled_extensions_.Remove(extension_id); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: This can currently happen if we receive multiple unload 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifications, e.g. setting incognito-enabled state for a 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled extension (e.g., via sync). See 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=50582 . 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << extension_id; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)base::Time InfoMap::GetInstallTime(const std::string& extension_id) const { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != extra_data_.end()) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iter->second.install_time; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::Time(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::IsIncognitoEnabled(const std::string& extension_id) const { 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Keep in sync with duplicate in extensions/browser/process_manager.cc. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != extra_data_.end()) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iter->second.incognito_enabled; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::CanCrossIncognito(const Extension* extension) const { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is duplicated from ExtensionService :(. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsIncognitoEnabled(extension->id()) && 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !IncognitoInfo::IsSplitMode(extension); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::RegisterExtensionProcess(const std::string& extension_id, 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int process_id, 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int site_instance_id) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!process_map_.Insert(extension_id, process_id, site_instance_id)) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Duplicate extension process registration for: " 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << extension_id << "," << process_id << "."; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::UnregisterExtensionProcess(const std::string& extension_id, 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int process_id, 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int site_instance_id) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!process_map_.Remove(extension_id, process_id, site_instance_id)) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unknown extension process registration for: " 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << extension_id << "," << process_id << "."; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::UnregisterAllExtensionsInProcess(int process_id) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_map_.RemoveAllFromProcess(process_id); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::GetExtensionsWithAPIPermissionForSecurityOrigin( 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& origin, 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int process_id, 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) APIPermission::ID permission, 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionSet* extensions) const { 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(extensions); 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (origin.SchemeIs(kExtensionScheme)) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id = origin.host(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = extensions_.GetByID(id); 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (extension && 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extension->permissions_data()->HasAPIPermission(permission) && 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) process_map_.Contains(id, process_id)) { 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions->Insert(extension); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSet::const_iterator i = extensions_.begin(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; i != extensions_.end(); ++i) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->web_extent().MatchesSecurityOrigin(origin) && 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_map_.Contains((*i)->id(), process_id) && 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) (*i)->permissions_data()->HasAPIPermission(permission)) { 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions->Insert(*i); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::SecurityOriginHasAPIPermission(const GURL& origin, 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int process_id, 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) APIPermission::ID permission) 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const { 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionSet extensions; 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionsWithAPIPermissionForSecurityOrigin( 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin, process_id, permission, &extensions); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !extensions.is_empty(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// This function is security sensitive. Bugs could cause problems that break 1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// restrictions on local file access or NaCl's validation caching. If you modify 1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// this function, please get a security review from a NaCl person. 1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool InfoMap::MapUrlToLocalFilePath(const GURL& file_url, 1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool use_blocking_api, 1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::FilePath* file_path) { 1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Check that the URL is recognized by the extension system. 1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const Extension* extension = extensions_.GetExtensionOrAppByURL(file_url); 1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!extension) 1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // This is a short-cut which avoids calling a blocking file operation 1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // (GetFilePath()), so that this can be called on the IO thread. It only 1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // handles a subset of the urls. 1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!use_blocking_api) { 1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (file_url.SchemeIs(extensions::kExtensionScheme)) { 1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string path = file_url.path(); 1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::TrimString(path, "/", &path); // Remove first slash 1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) *file_path = extension->path().AppendASCII(path); 1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return true; 1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string path = file_url.path(); 1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ExtensionResource resource; 1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (SharedModuleInfo::IsImportedPath(path)) { 1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Check if this is a valid path that is imported for this extension. 1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string new_extension_id; 2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string new_relative_path; 2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SharedModuleInfo::ParseImportedPath( 2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) path, &new_extension_id, &new_relative_path); 2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const Extension* new_extension = extensions_.GetByID(new_extension_id); 2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!new_extension) 2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!SharedModuleInfo::ImportsExtensionById(extension, new_extension_id) || 2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) !SharedModuleInfo::IsExportAllowed(new_extension, new_relative_path)) { 2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) resource = new_extension->GetResource(new_relative_path); 2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } else { 2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Check that the URL references a resource in the extension. 2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) resource = extension->GetResource(path); 2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (resource.empty()) 2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // GetFilePath is a blocking function call. 2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const base::FilePath resource_file_path = resource.GetFilePath(); 2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (resource_file_path.empty()) 2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) *file_path = resource_file_path; 2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return true; 2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)QuotaService* InfoMap::GetQuotaService() { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckOnValidThread(); 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!quota_service_) 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) quota_service_.reset(new QuotaService()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return quota_service_.get(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::SetSigninProcess(int process_id) { 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) signin_process_id_ = process_id; 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::IsSigninProcess(int process_id) const { 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return process_id == signin_process_id_; 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::SetNotificationsDisabled( 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& extension_id, 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool notifications_disabled) { 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExtraDataMap::iterator iter = extra_data_.find(extension_id); 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (iter != extra_data_.end()) 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) iter->second.notifications_disabled = notifications_disabled; 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::AreNotificationsDisabled( 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& extension_id) const { 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (iter != extra_data_.end()) 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return iter->second.notifications_disabled; 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void InfoMap::SetContentVerifier(ContentVerifier* verifier) { 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content_verifier_ = verifier; 263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InfoMap::~InfoMap() { 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (quota_service_) { 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThread::DeleteSoon( 268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThread::IO, FROM_HERE, quota_service_.release()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace extensions 273