OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/extensions/extension_warning_badge_service.h" | |
6 | |
7 #include "base/stl_util.h" | |
8 #include "chrome/app/chrome_command_ids.h" | |
9 #include "chrome/browser/extensions/extension_warning_badge_service_factory.h" | |
10 #include "chrome/browser/profiles/profile.h" | |
11 #include "chrome/browser/ui/browser_commands.h" | |
12 #include "chrome/browser/ui/global_error/global_error.h" | |
13 #include "chrome/browser/ui/global_error/global_error_service.h" | |
14 #include "chrome/browser/ui/global_error/global_error_service_factory.h" | |
15 #include "chrome/grit/generated_resources.h" | |
16 #include "ui/base/l10n/l10n_util.h" | |
17 | |
18 namespace extensions { | |
19 | |
20 namespace { | |
21 // Non-modal GlobalError implementation that warns the user if extensions | |
22 // created warnings or errors. If the user clicks on the wrench menu, the user | |
23 // is redirected to chrome://extensions to inspect the errors. | |
24 class ErrorBadge : public GlobalError { | |
25 public: | |
26 explicit ErrorBadge(ExtensionWarningBadgeService* badge_service); | |
27 ~ErrorBadge() override; | |
28 | |
29 // Implementation for GlobalError: | |
30 bool HasMenuItem() override; | |
31 int MenuItemCommandID() override; | |
32 base::string16 MenuItemLabel() override; | |
33 void ExecuteMenuItem(Browser* browser) override; | |
34 | |
35 bool HasBubbleView() override; | |
36 bool HasShownBubbleView() override; | |
37 void ShowBubbleView(Browser* browser) override; | |
38 GlobalErrorBubbleViewBase* GetBubbleView() override; | |
39 | |
40 static int GetMenuItemCommandID(); | |
41 | |
42 private: | |
43 ExtensionWarningBadgeService* badge_service_; | |
44 | |
45 DISALLOW_COPY_AND_ASSIGN(ErrorBadge); | |
46 }; | |
47 | |
48 ErrorBadge::ErrorBadge(ExtensionWarningBadgeService* badge_service) | |
49 : badge_service_(badge_service) {} | |
50 | |
51 ErrorBadge::~ErrorBadge() {} | |
52 | |
53 bool ErrorBadge::HasMenuItem() { | |
54 return true; | |
55 } | |
56 | |
57 int ErrorBadge::MenuItemCommandID() { | |
58 return GetMenuItemCommandID(); | |
59 } | |
60 | |
61 base::string16 ErrorBadge::MenuItemLabel() { | |
62 return l10n_util::GetStringUTF16(IDS_EXTENSION_WARNINGS_WRENCH_MENU_ITEM); | |
63 } | |
64 | |
65 void ErrorBadge::ExecuteMenuItem(Browser* browser) { | |
66 // Suppress all current warnings in the extension service from triggering | |
67 // a badge on the wrench menu in the future of this session. | |
68 badge_service_->SuppressCurrentWarnings(); | |
69 | |
70 chrome::ExecuteCommand(browser, IDC_MANAGE_EXTENSIONS); | |
71 } | |
72 | |
73 bool ErrorBadge::HasBubbleView() { return false; } | |
74 | |
75 bool ErrorBadge::HasShownBubbleView() { return false; } | |
76 | |
77 void ErrorBadge::ShowBubbleView(Browser* browser) { NOTREACHED(); } | |
78 | |
79 GlobalErrorBubbleViewBase* ErrorBadge::GetBubbleView() { | |
80 return NULL; | |
81 } | |
82 | |
83 // static | |
84 int ErrorBadge::GetMenuItemCommandID() { | |
85 return IDC_EXTENSION_ERRORS; | |
86 } | |
87 | |
88 } // namespace | |
89 | |
90 ExtensionWarningBadgeService::ExtensionWarningBadgeService(Profile* profile) | |
91 : profile_(profile), warning_service_observer_(this) { | |
92 DCHECK(CalledOnValidThread()); | |
93 warning_service_observer_.Add(WarningService::Get(profile_)); | |
94 } | |
95 | |
96 ExtensionWarningBadgeService::~ExtensionWarningBadgeService() {} | |
97 | |
98 // static | |
99 ExtensionWarningBadgeService* ExtensionWarningBadgeService::Get( | |
100 content::BrowserContext* context) { | |
101 return ExtensionWarningBadgeServiceFactory::GetForBrowserContext(context); | |
102 } | |
103 | |
104 void ExtensionWarningBadgeService::SuppressCurrentWarnings() { | |
105 DCHECK(CalledOnValidThread()); | |
106 size_t old_size = suppressed_warnings_.size(); | |
107 | |
108 const WarningSet& warnings = GetCurrentWarnings(); | |
109 suppressed_warnings_.insert(warnings.begin(), warnings.end()); | |
110 | |
111 if (old_size != suppressed_warnings_.size()) | |
112 UpdateBadgeStatus(); | |
113 } | |
114 | |
115 const WarningSet& ExtensionWarningBadgeService::GetCurrentWarnings() const { | |
116 return WarningService::Get(profile_)->warnings(); | |
117 } | |
118 | |
119 void ExtensionWarningBadgeService::ExtensionWarningsChanged() { | |
120 DCHECK(CalledOnValidThread()); | |
121 UpdateBadgeStatus(); | |
122 } | |
123 | |
124 void ExtensionWarningBadgeService::UpdateBadgeStatus() { | |
125 const std::set<Warning>& warnings = GetCurrentWarnings(); | |
126 bool non_suppressed_warnings_exist = false; | |
127 for (std::set<Warning>::const_iterator i = warnings.begin(); | |
128 i != warnings.end(); ++i) { | |
129 if (!ContainsKey(suppressed_warnings_, *i)) { | |
130 non_suppressed_warnings_exist = true; | |
131 break; | |
132 } | |
133 } | |
134 ShowBadge(non_suppressed_warnings_exist); | |
135 } | |
136 | |
137 void ExtensionWarningBadgeService::ShowBadge(bool show) { | |
138 GlobalErrorService* service = | |
139 GlobalErrorServiceFactory::GetForProfile(profile_); | |
140 GlobalError* error = service->GetGlobalErrorByMenuItemCommandID( | |
141 ErrorBadge::GetMenuItemCommandID()); | |
142 | |
143 // Activate or hide the warning badge in case the current state is incorrect. | |
144 if (error && !show) { | |
145 service->RemoveGlobalError(error); | |
146 delete error; | |
147 } else if (!error && show) { | |
148 service->AddGlobalError(new ErrorBadge(this)); | |
149 } | |
150 } | |
151 | |
152 } // namespace extensions | |
OLD | NEW |