| 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 std::set<std::string> 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 std::set<std::string> 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 std::set<std::string>& 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 |