blob: 4e1642029350a807345717d594a4b65f584f7a5b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/extensions/extension_info_map.h"
#include "chrome/common/extensions/extension.h"
#include "content/browser/browser_thread.h"
namespace {
static void CheckOnValidThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
}
} // namespace
struct ExtensionInfoMap::ExtraData {
// When the extension was installed.
base::Time install_time;
// True if the user has allowed this extension to run in incognito mode.
bool incognito_enabled;
ExtraData();
~ExtraData();
};
ExtensionInfoMap::ExtraData::ExtraData() : incognito_enabled(false) {
}
ExtensionInfoMap::ExtraData::~ExtraData() {
}
ExtensionInfoMap::ExtensionInfoMap() {
}
ExtensionInfoMap::~ExtensionInfoMap() {
}
void ExtensionInfoMap::AddExtension(const Extension* extension,
base::Time install_time,
bool incognito_enabled) {
CheckOnValidThread();
extensions_.Insert(extension);
disabled_extensions_.Remove(extension->id());
extra_data_[extension->id()].install_time = install_time;
extra_data_[extension->id()].incognito_enabled = incognito_enabled;
}
void ExtensionInfoMap::RemoveExtension(const std::string& extension_id,
const UnloadedExtensionInfo::Reason reason) {
CheckOnValidThread();
const Extension* extension = extensions_.GetByID(extension_id);
extra_data_.erase(extension_id); // we don't care about disabled extra data
if (extension) {
if (reason == UnloadedExtensionInfo::DISABLE)
disabled_extensions_.Insert(extension);
extensions_.Remove(extension_id);
} else if (reason != UnloadedExtensionInfo::DISABLE) {
// If the extension was uninstalled, make sure it's removed from the map of
// disabled extensions.
disabled_extensions_.Remove(extension_id);
} else {
// NOTE: This can currently happen if we receive multiple unload
// notifications, e.g. setting incognito-enabled state for a
// disabled extension (e.g., via sync). See
// http://code.google.com/p/chromium/issues/detail?id=50582 .
NOTREACHED() << extension_id;
}
}
base::Time ExtensionInfoMap::GetInstallTime(
const std::string& extension_id) const {
ExtraDataMap::const_iterator iter = extra_data_.find(extension_id);
if (iter != extra_data_.end())
return iter->second.install_time;
return base::Time();
}
bool ExtensionInfoMap::IsIncognitoEnabled(
const std::string& extension_id) const {
ExtraDataMap::const_iterator iter = extra_data_.find(extension_id);
if (iter != extra_data_.end())
return iter->second.incognito_enabled;
return false;
}
bool ExtensionInfoMap::CanCrossIncognito(const Extension* extension) {
// This is duplicated from ExtensionService :(.
return IsIncognitoEnabled(extension->id()) &&
!extension->incognito_split_mode();
}
|