info_map.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/browser/content_verifier.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/incognito_info.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid CheckOnValidThread() { DCHECK_CURRENTLY_ON(BrowserThread::IO); }
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);
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (extension &&
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        extension->permissions_data()->HasAPIPermission(permission) &&
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        process_map_.Contains(id, process_id)) {
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extensions->Insert(extension);
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet::const_iterator i = extensions_.begin();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; i != extensions_.end(); ++i) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*i)->web_extent().MatchesSecurityOrigin(origin) &&
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_map_.Contains((*i)->id(), process_id) &&
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        (*i)->permissions_data()->HasAPIPermission(permission)) {
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extensions->Insert(*i);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::SecurityOriginHasAPIPermission(const GURL& origin,
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                             int process_id,
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                             APIPermission::ID permission)
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const {
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionSet extensions;
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetExtensionsWithAPIPermissionForSecurityOrigin(
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      origin, process_id, permission, &extensions);
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return !extensions.is_empty();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)QuotaService* InfoMap::GetQuotaService() {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckOnValidThread();
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!quota_service_)
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    quota_service_.reset(new QuotaService());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return quota_service_.get();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::SetSigninProcess(int process_id) {
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  signin_process_id_ = process_id;
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::IsSigninProcess(int process_id) const {
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return process_id == signin_process_id_;
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::SetNotificationsDisabled(
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& extension_id,
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool notifications_disabled) {
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ExtraDataMap::iterator iter = extra_data_.find(extension_id);
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (iter != extra_data_.end())
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    iter->second.notifications_disabled = notifications_disabled;
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::AreNotificationsDisabled(
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& extension_id) const {
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ExtraDataMap::const_iterator iter = extra_data_.find(extension_id);
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (iter != extra_data_.end())
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return iter->second.notifications_disabled;
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return false;
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void InfoMap::SetContentVerifier(ContentVerifier* verifier) {
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  content_verifier_ = verifier;
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InfoMap::~InfoMap() {
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (quota_service_) {
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    BrowserThread::DeleteSoon(
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        BrowserThread::IO, FROM_HERE, quota_service_.release());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace extensions
225