info_map.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/incognito_info.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckOnValidThread() { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct InfoMap::ExtraData { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the extension was installed. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time install_time; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the user has allowed this extension to run in incognito mode. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool incognito_enabled; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // True if the user has disabled notifications for this extension manually. 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool notifications_disabled; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtraData(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ExtraData(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InfoMap::ExtraData::ExtraData() : incognito_enabled(false) {} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InfoMap::ExtraData::~ExtraData() {} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InfoMap::InfoMap() : signin_process_id_(-1) {} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const ProcessMap& InfoMap::process_map() const { return process_map_; } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const ProcessMap& InfoMap::worker_process_map() const { 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return worker_process_map_; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::AddExtension(const Extension* extension, 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Time install_time, 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool incognito_enabled, 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool notifications_disabled) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckOnValidThread(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_.Insert(extension); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disabled_extensions_.Remove(extension->id()); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_data_[extension->id()].install_time = install_time; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_data_[extension->id()].incognito_enabled = incognito_enabled; 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extra_data_[extension->id()].notifications_disabled = notifications_disabled; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::RemoveExtension(const std::string& extension_id, 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const UnloadedExtensionInfo::Reason reason) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckOnValidThread(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = extensions_.GetByID(extension_id); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_data_.erase(extension_id); // we don't care about disabled extra data 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool was_uninstalled = (reason != UnloadedExtensionInfo::REASON_DISABLE && 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) reason != UnloadedExtensionInfo::REASON_TERMINATE); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!was_uninstalled) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disabled_extensions_.Insert(extension); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_.Remove(extension_id); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (was_uninstalled) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the extension was uninstalled, make sure it's removed from the map of 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled extensions. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disabled_extensions_.Remove(extension_id); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: This can currently happen if we receive multiple unload 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifications, e.g. setting incognito-enabled state for a 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled extension (e.g., via sync). See 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=50582 . 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << extension_id; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)base::Time InfoMap::GetInstallTime(const std::string& extension_id) const { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != extra_data_.end()) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iter->second.install_time; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::Time(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::IsIncognitoEnabled(const std::string& extension_id) const { 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Keep in sync with duplicate in extensions/browser/process_manager.cc. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != extra_data_.end()) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iter->second.incognito_enabled; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::CanCrossIncognito(const Extension* extension) const { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is duplicated from ExtensionService :(. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsIncognitoEnabled(extension->id()) && 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !IncognitoInfo::IsSplitMode(extension); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::RegisterExtensionProcess(const std::string& extension_id, 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int process_id, 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int site_instance_id) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!process_map_.Insert(extension_id, process_id, site_instance_id)) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Duplicate extension process registration for: " 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << extension_id << "," << process_id << "."; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::UnregisterExtensionProcess(const std::string& extension_id, 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int process_id, 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int site_instance_id) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!process_map_.Remove(extension_id, process_id, site_instance_id)) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unknown extension process registration for: " 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << extension_id << "," << process_id << "."; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::UnregisterAllExtensionsInProcess(int process_id) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_map_.RemoveAllFromProcess(process_id); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InfoMap::RegisterExtensionWorkerProcess(const std::string& extension_id, 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int process_id, 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int site_instance_id) { 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!worker_process_map_.Insert(extension_id, process_id, site_instance_id)) { 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED() << "Duplicate extension worker process registration for: " 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << extension_id << "," << process_id << "."; 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InfoMap::UnregisterExtensionWorkerProcess(int process_id) { 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_.RemoveAllFromProcess(process_id); 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::GetExtensionsWithAPIPermissionForSecurityOrigin( 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& origin, 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int process_id, 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) APIPermission::ID permission, 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionSet* extensions) const { 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(extensions); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (origin.SchemeIs(kExtensionScheme)) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id = origin.host(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = extensions_.GetByID(id); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension && extension->HasAPIPermission(permission) && 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) process_map_.Contains(id, process_id)) { 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions->Insert(extension); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSet::const_iterator i = extensions_.begin(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; i != extensions_.end(); ++i) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->web_extent().MatchesSecurityOrigin(origin) && 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_map_.Contains((*i)->id(), process_id) && 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*i)->HasAPIPermission(permission)) { 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions->Insert(*i); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::SecurityOriginHasAPIPermission(const GURL& origin, 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int process_id, 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) APIPermission::ID permission) 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const { 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionSet extensions; 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetExtensionsWithAPIPermissionForSecurityOrigin( 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin, process_id, permission, &extensions); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !extensions.is_empty(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)QuotaService* InfoMap::GetQuotaService() { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckOnValidThread(); 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!quota_service_) 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) quota_service_.reset(new QuotaService()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return quota_service_.get(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::SetSigninProcess(int process_id) { 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) signin_process_id_ = process_id; 19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::IsSigninProcess(int process_id) const { 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return process_id == signin_process_id_; 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::SetNotificationsDisabled( 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& extension_id, 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool notifications_disabled) { 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExtraDataMap::iterator iter = extra_data_.find(extension_id); 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (iter != extra_data_.end()) 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) iter->second.notifications_disabled = notifications_disabled; 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::AreNotificationsDisabled( 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& extension_id) const { 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (iter != extra_data_.end()) 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return iter->second.notifications_disabled; 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InfoMap::~InfoMap() { 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (quota_service_) { 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThread::DeleteSoon( 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThread::IO, FROM_HERE, quota_service_.release()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace extensions 220