info_map.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InfoMap::RegisterExtensionWorkerProcess(const std::string& extension_id,
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             int process_id,
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             int site_instance_id) {
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!worker_process_map_.Insert(extension_id, process_id, site_instance_id)) {
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NOTREACHED() << "Duplicate extension worker process registration for: "
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 << extension_id << "," << process_id << ".";
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InfoMap::UnregisterExtensionWorkerProcess(int process_id) {
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  worker_process_map_.RemoveAllFromProcess(process_id);
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::GetExtensionsWithAPIPermissionForSecurityOrigin(
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GURL& origin,
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int process_id,
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    APIPermission::ID permission,
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionSet* extensions) const {
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(extensions);
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (origin.SchemeIs(kExtensionScheme)) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& id = origin.host();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = extensions_.GetByID(id);
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (extension &&
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        extension->permissions_data()->HasAPIPermission(permission) &&
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        process_map_.Contains(id, process_id)) {
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extensions->Insert(extension);
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet::const_iterator i = extensions_.begin();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; i != extensions_.end(); ++i) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*i)->web_extent().MatchesSecurityOrigin(origin) &&
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_map_.Contains((*i)->id(), process_id) &&
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        (*i)->permissions_data()->HasAPIPermission(permission)) {
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extensions->Insert(*i);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::SecurityOriginHasAPIPermission(const GURL& origin,
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                             int process_id,
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                             APIPermission::ID permission)
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const {
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionSet extensions;
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetExtensionsWithAPIPermissionForSecurityOrigin(
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      origin, process_id, permission, &extensions);
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return !extensions.is_empty();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// This function is security sensitive. Bugs could cause problems that break
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// restrictions on local file access or NaCl's validation caching. If you modify
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// this function, please get a security review from a NaCl person.
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool InfoMap::MapUrlToLocalFilePath(const GURL& file_url,
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    bool use_blocking_api,
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    base::FilePath* file_path) {
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Check that the URL is recognized by the extension system.
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const Extension* extension = extensions_.GetExtensionOrAppByURL(file_url);
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!extension)
1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return false;
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // This is a short-cut which avoids calling a blocking file operation
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // (GetFilePath()), so that this can be called on the IO thread. It only
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // handles a subset of the urls.
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!use_blocking_api) {
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (file_url.SchemeIs(extensions::kExtensionScheme)) {
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      std::string path = file_url.path();
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::TrimString(path, "/", &path);  // Remove first slash
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      *file_path = extension->path().AppendASCII(path);
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return false;
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::string path = file_url.path();
2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ExtensionResource resource;
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (SharedModuleInfo::IsImportedPath(path)) {
2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Check if this is a valid path that is imported for this extension.
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string new_extension_id;
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string new_relative_path;
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SharedModuleInfo::ParseImportedPath(
2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        path, &new_extension_id, &new_relative_path);
2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const Extension* new_extension = extensions_.GetByID(new_extension_id);
2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (!new_extension)
2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return false;
2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (!SharedModuleInfo::ImportsExtensionById(extension, new_extension_id) ||
2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        !SharedModuleInfo::IsExportAllowed(new_extension, new_relative_path)) {
2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return false;
2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    resource = new_extension->GetResource(new_relative_path);
2266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } else {
2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Check that the URL references a resource in the extension.
2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    resource = extension->GetResource(path);
2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (resource.empty())
2326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return false;
2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // GetFilePath is a blocking function call.
2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const base::FilePath resource_file_path = resource.GetFilePath();
2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (resource_file_path.empty())
2376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return false;
2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  *file_path = resource_file_path;
2406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return true;
2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)QuotaService* InfoMap::GetQuotaService() {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckOnValidThread();
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!quota_service_)
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    quota_service_.reset(new QuotaService());
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return quota_service_.get();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::SetSigninProcess(int process_id) {
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  signin_process_id_ = process_id;
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::IsSigninProcess(int process_id) const {
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return process_id == signin_process_id_;
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InfoMap::SetNotificationsDisabled(
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& extension_id,
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool notifications_disabled) {
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ExtraDataMap::iterator iter = extra_data_.find(extension_id);
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (iter != extra_data_.end())
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    iter->second.notifications_disabled = notifications_disabled;
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool InfoMap::AreNotificationsDisabled(
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& extension_id) const {
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ExtraDataMap::const_iterator iter = extra_data_.find(extension_id);
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (iter != extra_data_.end())
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return iter->second.notifications_disabled;
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return false;
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void InfoMap::SetContentVerifier(ContentVerifier* verifier) {
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  content_verifier_ = verifier;
276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InfoMap::~InfoMap() {
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (quota_service_) {
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    BrowserThread::DeleteSoon(
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        BrowserThread::IO, FROM_HERE, quota_service_.release());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace extensions
286