Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / extension_warning_badge_service.cc
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