blob: 45a9699370ba1a6d143b533d6dfa87d74606ced1 [file] [log] [blame]
hanxic7e55202014-08-28 14:13:211// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "extensions/browser/warning_service.h"
6
7#include "content/public/browser/browser_thread.h"
hanxic7e55202014-08-28 14:13:218#include "extensions/browser/extensions_browser_client.h"
reillyg22114a382014-11-03 16:47:579#include "extensions/browser/warning_service_factory.h"
hanxic7e55202014-08-28 14:13:2110#include "extensions/common/extension_set.h"
11
12using content::BrowserThread;
13
14namespace extensions {
15
16WarningService::WarningService(content::BrowserContext* browser_context)
Evan Stade922f3f1f2019-09-04 21:05:1317 : browser_context_(browser_context) {
gab370841f22017-06-01 14:38:2618 DCHECK_CURRENTLY_ON(BrowserThread::UI);
hanxic7e55202014-08-28 14:13:2119 if (browser_context_) {
20 extension_registry_observer_.Add(ExtensionRegistry::Get(
21 ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context_)));
22 }
23}
24
gab370841f22017-06-01 14:38:2625WarningService::~WarningService() {
26 DCHECK_CURRENTLY_ON(BrowserThread::UI);
27}
hanxic7e55202014-08-28 14:13:2128
reillyg22114a382014-11-03 16:47:5729// static
30WarningService* WarningService::Get(content::BrowserContext* browser_context) {
31 return WarningServiceFactory::GetForBrowserContext(browser_context);
32}
33
hanxic7e55202014-08-28 14:13:2134void WarningService::ClearWarnings(
35 const std::set<Warning::WarningType>& types) {
gab370841f22017-06-01 14:38:2636 DCHECK_CURRENTLY_ON(BrowserThread::UI);
rdevlin.cronin7dd052902015-05-19 22:23:2237 ExtensionIdSet affected_extensions;
jdoerriea1e1598b2018-10-10 09:10:3738 for (auto i = warnings_.begin(); i != warnings_.end();) {
hanxic7e55202014-08-28 14:13:2139 if (types.find(i->warning_type()) != types.end()) {
rdevlin.cronin7dd052902015-05-19 22:23:2240 affected_extensions.insert(i->extension_id());
hanxic7e55202014-08-28 14:13:2141 warnings_.erase(i++);
42 } else {
43 ++i;
44 }
45 }
46
rdevlin.cronin7dd052902015-05-19 22:23:2247 if (!affected_extensions.empty())
48 NotifyWarningsChanged(affected_extensions);
hanxic7e55202014-08-28 14:13:2149}
50
51std::set<Warning::WarningType> WarningService::
52 GetWarningTypesAffectingExtension(const std::string& extension_id) const {
gab370841f22017-06-01 14:38:2653 DCHECK_CURRENTLY_ON(BrowserThread::UI);
hanxic7e55202014-08-28 14:13:2154 std::set<Warning::WarningType> result;
jdoerriea1e1598b2018-10-10 09:10:3755 for (auto i = warnings_.cbegin(); i != warnings_.cend(); ++i) {
hanxic7e55202014-08-28 14:13:2156 if (i->extension_id() == extension_id)
57 result.insert(i->warning_type());
58 }
59 return result;
60}
61
62std::vector<std::string> WarningService::GetWarningMessagesForExtension(
63 const std::string& extension_id) const {
gab370841f22017-06-01 14:38:2664 DCHECK_CURRENTLY_ON(BrowserThread::UI);
hanxic7e55202014-08-28 14:13:2165 std::vector<std::string> result;
66
67 const ExtensionSet& extension_set =
68 ExtensionRegistry::Get(browser_context_)->enabled_extensions();
69
jdoerriea1e1598b2018-10-10 09:10:3770 for (auto i = warnings_.cbegin(); i != warnings_.cend(); ++i) {
hanxic7e55202014-08-28 14:13:2171 if (i->extension_id() == extension_id)
72 result.push_back(i->GetLocalizedMessage(&extension_set));
73 }
74 return result;
75}
76
77void WarningService::AddWarnings(const WarningSet& warnings) {
gab370841f22017-06-01 14:38:2678 DCHECK_CURRENTLY_ON(BrowserThread::UI);
hanxic7e55202014-08-28 14:13:2179
rdevlin.cronin7dd052902015-05-19 22:23:2280 ExtensionIdSet affected_extensions;
81 for (const Warning& warning : warnings) {
82 if (warnings_.insert(warning).second)
83 affected_extensions.insert(warning.extension_id());
84 }
85 if (!affected_extensions.empty())
86 NotifyWarningsChanged(affected_extensions);
hanxic7e55202014-08-28 14:13:2187}
88
89// static
90void WarningService::NotifyWarningsOnUI(
91 void* profile_id,
92 const WarningSet& warnings) {
93 DCHECK_CURRENTLY_ON(BrowserThread::UI);
94 content::BrowserContext* browser_context =
95 reinterpret_cast<content::BrowserContext*>(profile_id);
96
97 if (!browser_context ||
98 !ExtensionsBrowserClient::Get() ||
99 !ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) {
100 return;
101 }
102
reillyg22114a382014-11-03 16:47:57103 WarningService* warning_service = WarningService::Get(browser_context);
hanxic7e55202014-08-28 14:13:21104
105 warning_service->AddWarnings(warnings);
106}
107
108void WarningService::AddObserver(Observer* observer) {
109 observer_list_.AddObserver(observer);
110}
111
112void WarningService::RemoveObserver(Observer* observer) {
113 observer_list_.RemoveObserver(observer);
114}
115
rdevlin.cronin7dd052902015-05-19 22:23:22116void WarningService::NotifyWarningsChanged(
117 const ExtensionIdSet& affected_extensions) {
ericwilligersd1e28152016-10-17 22:53:14118 for (auto& observer : observer_list_)
119 observer.ExtensionWarningsChanged(affected_extensions);
hanxic7e55202014-08-28 14:13:21120}
121
122void WarningService::OnExtensionUnloaded(
123 content::BrowserContext* browser_context,
124 const Extension* extension,
limasdf0deef2042017-05-03 19:17:17125 UnloadedExtensionReason reason) {
hanxic7e55202014-08-28 14:13:21126 // Unloading one extension might have solved the problems of others.
127 // Therefore, we clear warnings of this type for all extensions.
128 std::set<Warning::WarningType> warning_types =
129 GetWarningTypesAffectingExtension(extension->id());
130 ClearWarnings(warning_types);
131}
132
133} // namespace extensions