OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "extensions/browser/warning_service.h" | 5 #include "extensions/browser/warning_service.h" |
6 | 6 |
7 #include "content/public/browser/browser_thread.h" | 7 #include "content/public/browser/browser_thread.h" |
8 #include "extensions/browser/extension_registry.h" | 8 #include "extensions/browser/extension_registry.h" |
9 #include "extensions/browser/extensions_browser_client.h" | 9 #include "extensions/browser/extensions_browser_client.h" |
10 #include "extensions/browser/warning_service_factory.h" | 10 #include "extensions/browser/warning_service_factory.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 WarningService::~WarningService() {} | 26 WarningService::~WarningService() {} |
27 | 27 |
28 // static | 28 // static |
29 WarningService* WarningService::Get(content::BrowserContext* browser_context) { | 29 WarningService* WarningService::Get(content::BrowserContext* browser_context) { |
30 return WarningServiceFactory::GetForBrowserContext(browser_context); | 30 return WarningServiceFactory::GetForBrowserContext(browser_context); |
31 } | 31 } |
32 | 32 |
33 void WarningService::ClearWarnings( | 33 void WarningService::ClearWarnings( |
34 const std::set<Warning::WarningType>& types) { | 34 const std::set<Warning::WarningType>& types) { |
35 DCHECK(CalledOnValidThread()); | 35 DCHECK(CalledOnValidThread()); |
36 bool deleted_anything = false; | 36 ExtensionIdSet affected_extensions; |
37 for (WarningSet::iterator i = warnings_.begin(); | 37 for (WarningSet::iterator i = warnings_.begin(); |
38 i != warnings_.end();) { | 38 i != warnings_.end();) { |
39 if (types.find(i->warning_type()) != types.end()) { | 39 if (types.find(i->warning_type()) != types.end()) { |
40 deleted_anything = true; | 40 affected_extensions.insert(i->extension_id()); |
41 warnings_.erase(i++); | 41 warnings_.erase(i++); |
42 } else { | 42 } else { |
43 ++i; | 43 ++i; |
44 } | 44 } |
45 } | 45 } |
46 | 46 |
47 if (deleted_anything) | 47 if (!affected_extensions.empty()) |
48 NotifyWarningsChanged(); | 48 NotifyWarningsChanged(affected_extensions); |
49 } | 49 } |
50 | 50 |
51 std::set<Warning::WarningType> WarningService:: | 51 std::set<Warning::WarningType> WarningService:: |
52 GetWarningTypesAffectingExtension(const std::string& extension_id) const { | 52 GetWarningTypesAffectingExtension(const std::string& extension_id) const { |
53 DCHECK(CalledOnValidThread()); | 53 DCHECK(CalledOnValidThread()); |
54 std::set<Warning::WarningType> result; | 54 std::set<Warning::WarningType> result; |
55 for (WarningSet::const_iterator i = warnings_.begin(); | 55 for (WarningSet::const_iterator i = warnings_.begin(); |
56 i != warnings_.end(); ++i) { | 56 i != warnings_.end(); ++i) { |
57 if (i->extension_id() == extension_id) | 57 if (i->extension_id() == extension_id) |
58 result.insert(i->warning_type()); | 58 result.insert(i->warning_type()); |
(...skipping 12 matching lines...) Expand all Loading... |
71 for (WarningSet::const_iterator i = warnings_.begin(); | 71 for (WarningSet::const_iterator i = warnings_.begin(); |
72 i != warnings_.end(); ++i) { | 72 i != warnings_.end(); ++i) { |
73 if (i->extension_id() == extension_id) | 73 if (i->extension_id() == extension_id) |
74 result.push_back(i->GetLocalizedMessage(&extension_set)); | 74 result.push_back(i->GetLocalizedMessage(&extension_set)); |
75 } | 75 } |
76 return result; | 76 return result; |
77 } | 77 } |
78 | 78 |
79 void WarningService::AddWarnings(const WarningSet& warnings) { | 79 void WarningService::AddWarnings(const WarningSet& warnings) { |
80 DCHECK(CalledOnValidThread()); | 80 DCHECK(CalledOnValidThread()); |
81 size_t old_size = warnings_.size(); | |
82 | 81 |
83 warnings_.insert(warnings.begin(), warnings.end()); | 82 ExtensionIdSet affected_extensions; |
84 | 83 for (const Warning& warning : warnings) { |
85 if (old_size != warnings_.size()) | 84 if (warnings_.insert(warning).second) |
86 NotifyWarningsChanged(); | 85 affected_extensions.insert(warning.extension_id()); |
| 86 } |
| 87 if (!affected_extensions.empty()) |
| 88 NotifyWarningsChanged(affected_extensions); |
87 } | 89 } |
88 | 90 |
89 // static | 91 // static |
90 void WarningService::NotifyWarningsOnUI( | 92 void WarningService::NotifyWarningsOnUI( |
91 void* profile_id, | 93 void* profile_id, |
92 const WarningSet& warnings) { | 94 const WarningSet& warnings) { |
93 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 95 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
94 content::BrowserContext* browser_context = | 96 content::BrowserContext* browser_context = |
95 reinterpret_cast<content::BrowserContext*>(profile_id); | 97 reinterpret_cast<content::BrowserContext*>(profile_id); |
96 | 98 |
97 if (!browser_context || | 99 if (!browser_context || |
98 !ExtensionsBrowserClient::Get() || | 100 !ExtensionsBrowserClient::Get() || |
99 !ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) { | 101 !ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) { |
100 return; | 102 return; |
101 } | 103 } |
102 | 104 |
103 WarningService* warning_service = WarningService::Get(browser_context); | 105 WarningService* warning_service = WarningService::Get(browser_context); |
104 | 106 |
105 warning_service->AddWarnings(warnings); | 107 warning_service->AddWarnings(warnings); |
106 } | 108 } |
107 | 109 |
108 void WarningService::AddObserver(Observer* observer) { | 110 void WarningService::AddObserver(Observer* observer) { |
109 observer_list_.AddObserver(observer); | 111 observer_list_.AddObserver(observer); |
110 } | 112 } |
111 | 113 |
112 void WarningService::RemoveObserver(Observer* observer) { | 114 void WarningService::RemoveObserver(Observer* observer) { |
113 observer_list_.RemoveObserver(observer); | 115 observer_list_.RemoveObserver(observer); |
114 } | 116 } |
115 | 117 |
116 void WarningService::NotifyWarningsChanged() { | 118 void WarningService::NotifyWarningsChanged( |
117 FOR_EACH_OBSERVER(Observer, observer_list_, ExtensionWarningsChanged()); | 119 const ExtensionIdSet& affected_extensions) { |
| 120 FOR_EACH_OBSERVER(Observer, observer_list_, |
| 121 ExtensionWarningsChanged(affected_extensions)); |
118 } | 122 } |
119 | 123 |
120 void WarningService::OnExtensionUnloaded( | 124 void WarningService::OnExtensionUnloaded( |
121 content::BrowserContext* browser_context, | 125 content::BrowserContext* browser_context, |
122 const Extension* extension, | 126 const Extension* extension, |
123 UnloadedExtensionInfo::Reason reason) { | 127 UnloadedExtensionInfo::Reason reason) { |
124 // Unloading one extension might have solved the problems of others. | 128 // Unloading one extension might have solved the problems of others. |
125 // Therefore, we clear warnings of this type for all extensions. | 129 // Therefore, we clear warnings of this type for all extensions. |
126 std::set<Warning::WarningType> warning_types = | 130 std::set<Warning::WarningType> warning_types = |
127 GetWarningTypesAffectingExtension(extension->id()); | 131 GetWarningTypesAffectingExtension(extension->id()); |
128 ClearWarnings(warning_types); | 132 ClearWarnings(warning_types); |
129 } | 133 } |
130 | 134 |
131 } // namespace extensions | 135 } // namespace extensions |
OLD | NEW |