blob: 13f621c31dcc81c2d9cc54a54ca696a4dd6fa1a3 [file] [log] [blame]
Avi Drissman60039d42022-09-13 21:49:051// Copyright 2012 The Chromium Authors
hanxic7e55202014-08-28 14:13:212// 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
David Sandersde5fee542022-03-23 02:47:447#include "base/observer_list.h"
hanxic7e55202014-08-28 14:13:218#include "content/public/browser/browser_thread.h"
hanxic7e55202014-08-28 14:13:219#include "extensions/browser/extensions_browser_client.h"
reillyg22114a382014-11-03 16:47:5710#include "extensions/browser/warning_service_factory.h"
hanxic7e55202014-08-28 14:13:2111#include "extensions/common/extension_set.h"
12
13using content::BrowserThread;
14
15namespace extensions {
16
17WarningService::WarningService(content::BrowserContext* browser_context)
Evan Stade922f3f1f2019-09-04 21:05:1318 : browser_context_(browser_context) {
gab370841f22017-06-01 14:38:2619 DCHECK_CURRENTLY_ON(BrowserThread::UI);
hanxic7e55202014-08-28 14:13:2120 if (browser_context_) {
Sigurdur Asgeirsson834f0572021-03-24 13:24:5821 extension_registry_observation_.Observe(ExtensionRegistry::Get(
hanxic7e55202014-08-28 14:13:2122 ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context_)));
23 }
24}
25
gab370841f22017-06-01 14:38:2626WarningService::~WarningService() {
27 DCHECK_CURRENTLY_ON(BrowserThread::UI);
28}
hanxic7e55202014-08-28 14:13:2129
reillyg22114a382014-11-03 16:47:5730// static
31WarningService* WarningService::Get(content::BrowserContext* browser_context) {
32 return WarningServiceFactory::GetForBrowserContext(browser_context);
33}
34
hanxic7e55202014-08-28 14:13:2135void WarningService::ClearWarnings(
36 const std::set<Warning::WarningType>& types) {
gab370841f22017-06-01 14:38:2637 DCHECK_CURRENTLY_ON(BrowserThread::UI);
rdevlin.cronin7dd052902015-05-19 22:23:2238 ExtensionIdSet affected_extensions;
jdoerriea1e1598b2018-10-10 09:10:3739 for (auto i = warnings_.begin(); i != warnings_.end();) {
hanxic7e55202014-08-28 14:13:2140 if (types.find(i->warning_type()) != types.end()) {
rdevlin.cronin7dd052902015-05-19 22:23:2241 affected_extensions.insert(i->extension_id());
hanxic7e55202014-08-28 14:13:2142 warnings_.erase(i++);
43 } else {
44 ++i;
45 }
46 }
47
rdevlin.cronin7dd052902015-05-19 22:23:2248 if (!affected_extensions.empty())
49 NotifyWarningsChanged(affected_extensions);
hanxic7e55202014-08-28 14:13:2150}
51
52std::set<Warning::WarningType> WarningService::
53 GetWarningTypesAffectingExtension(const std::string& extension_id) const {
gab370841f22017-06-01 14:38:2654 DCHECK_CURRENTLY_ON(BrowserThread::UI);
hanxic7e55202014-08-28 14:13:2155 std::set<Warning::WarningType> result;
jdoerriea1e1598b2018-10-10 09:10:3756 for (auto i = warnings_.cbegin(); i != warnings_.cend(); ++i) {
hanxic7e55202014-08-28 14:13:2157 if (i->extension_id() == extension_id)
58 result.insert(i->warning_type());
59 }
60 return result;
61}
62
63std::vector<std::string> WarningService::GetWarningMessagesForExtension(
64 const std::string& extension_id) const {
gab370841f22017-06-01 14:38:2665 DCHECK_CURRENTLY_ON(BrowserThread::UI);
hanxic7e55202014-08-28 14:13:2166 std::vector<std::string> result;
67
68 const ExtensionSet& extension_set =
69 ExtensionRegistry::Get(browser_context_)->enabled_extensions();
70
jdoerriea1e1598b2018-10-10 09:10:3771 for (auto i = warnings_.cbegin(); i != warnings_.cend(); ++i) {
hanxic7e55202014-08-28 14:13:2172 if (i->extension_id() == extension_id)
73 result.push_back(i->GetLocalizedMessage(&extension_set));
74 }
75 return result;
76}
77
78void WarningService::AddWarnings(const WarningSet& warnings) {
gab370841f22017-06-01 14:38:2679 DCHECK_CURRENTLY_ON(BrowserThread::UI);
hanxic7e55202014-08-28 14:13:2180
rdevlin.cronin7dd052902015-05-19 22:23:2281 ExtensionIdSet affected_extensions;
82 for (const Warning& warning : warnings) {
83 if (warnings_.insert(warning).second)
84 affected_extensions.insert(warning.extension_id());
85 }
86 if (!affected_extensions.empty())
87 NotifyWarningsChanged(affected_extensions);
hanxic7e55202014-08-28 14:13:2188}
89
90// static
91void WarningService::NotifyWarningsOnUI(
92 void* profile_id,
93 const WarningSet& warnings) {
94 DCHECK_CURRENTLY_ON(BrowserThread::UI);
95 content::BrowserContext* browser_context =
96 reinterpret_cast<content::BrowserContext*>(profile_id);
97
98 if (!browser_context ||
99 !ExtensionsBrowserClient::Get() ||
100 !ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) {
101 return;
102 }
103
reillyg22114a382014-11-03 16:47:57104 WarningService* warning_service = WarningService::Get(browser_context);
hanxic7e55202014-08-28 14:13:21105
106 warning_service->AddWarnings(warnings);
107}
108
109void WarningService::AddObserver(Observer* observer) {
110 observer_list_.AddObserver(observer);
111}
112
113void WarningService::RemoveObserver(Observer* observer) {
114 observer_list_.RemoveObserver(observer);
115}
116
rdevlin.cronin7dd052902015-05-19 22:23:22117void WarningService::NotifyWarningsChanged(
118 const ExtensionIdSet& affected_extensions) {
ericwilligersd1e28152016-10-17 22:53:14119 for (auto& observer : observer_list_)
120 observer.ExtensionWarningsChanged(affected_extensions);
hanxic7e55202014-08-28 14:13:21121}
122
123void WarningService::OnExtensionUnloaded(
124 content::BrowserContext* browser_context,
125 const Extension* extension,
limasdf0deef2042017-05-03 19:17:17126 UnloadedExtensionReason reason) {
hanxic7e55202014-08-28 14:13:21127 // Unloading one extension might have solved the problems of others.
128 // Therefore, we clear warnings of this type for all extensions.
129 std::set<Warning::WarningType> warning_types =
130 GetWarningTypesAffectingExtension(extension->id());
131 ClearWarnings(warning_types);
132}
133
134} // namespace extensions