blob: 6e9e4aa23abf0a2e3f48a2645ac80a66201f141e [file] [log] [blame]
[email protected]dd163fb02011-05-04 22:22:171// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]4361c7c2010-09-30 21:57:532// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/extensions/extension_info_map.h"
6
[email protected]6f229e82010-11-02 17:47:267#include "chrome/common/extensions/extension.h"
[email protected]5f945a0e2011-03-01 17:47:538#include "content/browser/browser_thread.h"
[email protected]4361c7c2010-09-30 21:57:539
10namespace {
11
12static void CheckOnValidThread() {
[email protected]ca4b5fa32010-10-09 12:42:1813 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
[email protected]4361c7c2010-09-30 21:57:5314}
15
16} // namespace
17
[email protected]c357acb42011-06-09 20:52:4218
19struct ExtensionInfoMap::ExtraData {
20 // When the extension was installed.
21 base::Time install_time;
22
23 // True if the user has allowed this extension to run in incognito mode.
24 bool incognito_enabled;
25
26 ExtraData();
27 ~ExtraData();
28};
29
30ExtensionInfoMap::ExtraData::ExtraData() : incognito_enabled(false) {
31}
32
33ExtensionInfoMap::ExtraData::~ExtraData() {
34}
35
36
[email protected]4361c7c2010-09-30 21:57:5337ExtensionInfoMap::ExtensionInfoMap() {
38}
39
40ExtensionInfoMap::~ExtensionInfoMap() {
41}
42
[email protected]c357acb42011-06-09 20:52:4243void ExtensionInfoMap::AddExtension(const Extension* extension,
44 base::Time install_time,
45 bool incognito_enabled) {
[email protected]4361c7c2010-09-30 21:57:5346 CheckOnValidThread();
[email protected]be0a2cfd2011-06-02 21:36:4247 extensions_.Insert(extension);
48 disabled_extensions_.Remove(extension->id());
[email protected]c357acb42011-06-09 20:52:4249
50 extra_data_[extension->id()].install_time = install_time;
51 extra_data_[extension->id()].incognito_enabled = incognito_enabled;
[email protected]4361c7c2010-09-30 21:57:5352}
53
[email protected]c357acb42011-06-09 20:52:4254void ExtensionInfoMap::RemoveExtension(const std::string& extension_id,
[email protected]814a7bf0f2011-08-13 05:30:5955 const extension_misc::UnloadedExtensionReason reason) {
[email protected]4361c7c2010-09-30 21:57:5356 CheckOnValidThread();
[email protected]c357acb42011-06-09 20:52:4257 const Extension* extension = extensions_.GetByID(extension_id);
58 extra_data_.erase(extension_id); // we don't care about disabled extra data
[email protected]be0a2cfd2011-06-02 21:36:4259 if (extension) {
[email protected]814a7bf0f2011-08-13 05:30:5960 if (reason == extension_misc::UNLOAD_REASON_DISABLE)
[email protected]be0a2cfd2011-06-02 21:36:4261 disabled_extensions_.Insert(extension);
[email protected]c357acb42011-06-09 20:52:4262 extensions_.Remove(extension_id);
[email protected]814a7bf0f2011-08-13 05:30:5963 } else if (reason != extension_misc::UNLOAD_REASON_DISABLE) {
[email protected]dd163fb02011-05-04 22:22:1764 // If the extension was uninstalled, make sure it's removed from the map of
65 // disabled extensions.
[email protected]c357acb42011-06-09 20:52:4266 disabled_extensions_.Remove(extension_id);
[email protected]4361c7c2010-09-30 21:57:5367 } else {
68 // NOTE: This can currently happen if we receive multiple unload
69 // notifications, e.g. setting incognito-enabled state for a
70 // disabled extension (e.g., via sync). See
71 // http://code.google.com/p/chromium/issues/detail?id=50582 .
[email protected]c357acb42011-06-09 20:52:4272 NOTREACHED() << extension_id;
[email protected]4361c7c2010-09-30 21:57:5373 }
74}
[email protected]c357acb42011-06-09 20:52:4275
76base::Time ExtensionInfoMap::GetInstallTime(
77 const std::string& extension_id) const {
78 ExtraDataMap::const_iterator iter = extra_data_.find(extension_id);
79 if (iter != extra_data_.end())
80 return iter->second.install_time;
81 return base::Time();
82}
83
84bool ExtensionInfoMap::IsIncognitoEnabled(
85 const std::string& extension_id) const {
86 ExtraDataMap::const_iterator iter = extra_data_.find(extension_id);
87 if (iter != extra_data_.end())
88 return iter->second.incognito_enabled;
89 return false;
90}
91
92bool ExtensionInfoMap::CanCrossIncognito(const Extension* extension) {
93 // This is duplicated from ExtensionService :(.
94 return IsIncognitoEnabled(extension->id()) &&
95 !extension->incognito_split_mode();
96}
[email protected]8add5412011-10-01 21:02:1497
98// These are duplicated from ExtensionProcessManager :(.
99void ExtensionInfoMap::BindingsEnabledForProcess(int host_id) {
100 extension_bindings_process_ids_.insert(host_id);
101}
102
103void ExtensionInfoMap::BindingsDisabledForProcess(int host_id) {
104 extension_bindings_process_ids_.erase(host_id);
105}
106
107bool ExtensionInfoMap::AreBindingsEnabledForProcess(int host_id) const {
108 return extension_bindings_process_ids_.find(host_id) !=
109 extension_bindings_process_ids_.end();
110}