Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(884)

Side by Side Diff: chrome/browser/protector/settings_change_global_error.cc

Issue 9500020: ProtectorService supports multiple change instances. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/browser/protector/settings_change_global_error.h" 5 #include "chrome/browser/protector/settings_change_global_error.h"
6 6
7 #include <bitset>
8
7 #include "base/bind.h" 9 #include "base/bind.h"
8 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
11 #include "base/lazy_instance.h"
9 #include "base/logging.h" 12 #include "base/logging.h"
10 #include "base/stl_util.h" 13 #include "base/stl_util.h"
11 #include "chrome/app/chrome_command_ids.h"
12 #include "chrome/browser/platform_util.h" 14 #include "chrome/browser/platform_util.h"
13 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/protector/base_setting_change.h" 16 #include "chrome/browser/protector/base_setting_change.h"
15 #include "chrome/browser/protector/settings_change_global_error_delegate.h" 17 #include "chrome/browser/protector/settings_change_global_error_delegate.h"
16 #include "chrome/browser/ui/browser.h" 18 #include "chrome/browser/ui/browser.h"
17 #include "chrome/browser/ui/browser_window.h" 19 #include "chrome/browser/ui/browser_window.h"
18 #include "chrome/browser/ui/global_error_service.h" 20 #include "chrome/browser/ui/global_error_service.h"
19 #include "chrome/browser/ui/global_error_service_factory.h" 21 #include "chrome/browser/ui/global_error_service_factory.h"
20 #include "content/public/browser/browser_thread.h" 22 #include "content/public/browser/browser_thread.h"
21 23
22 using content::BrowserThread; 24 using content::BrowserThread;
23 25
24 namespace protector { 26 namespace protector {
25 27
26 namespace { 28 namespace {
27 29
28 // Timeout before the global error is removed (wrench menu item disappears). 30 // Timeout before the global error is removed (wrench menu item disappears).
29 const int kMenuItemDisplayPeriodMs = 10*60*1000; // 10 min 31 const int kMenuItemDisplayPeriodMs = 10*60*1000; // 10 min
30 32
33 // Unset bits indicate available command IDs.
34 static base::LazyInstance<
35 std::bitset<IDC_SHOW_SETTINGS_CHANGE_LAST -
36 IDC_SHOW_SETTINGS_CHANGE_FIRST + 1> > menu_ids =
37 LAZY_INSTANCE_INITIALIZER;
38
31 } // namespace 39 } // namespace
32 40
33 SettingsChangeGlobalError::SettingsChangeGlobalError( 41 SettingsChangeGlobalError::SettingsChangeGlobalError(
34 BaseSettingChange* change, 42 BaseSettingChange* change,
35 SettingsChangeGlobalErrorDelegate* delegate) 43 SettingsChangeGlobalErrorDelegate* delegate)
36 : change_(change), 44 : change_(change),
37 delegate_(delegate), 45 delegate_(delegate),
38 profile_(NULL), 46 profile_(NULL),
39 closed_by_button_(false), 47 closed_by_button_(false),
40 show_on_browser_activation_(false), 48 show_on_browser_activation_(false),
41 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { 49 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)),
50 menu_id_(-1) {
42 DCHECK(delegate_); 51 DCHECK(delegate_);
52 for (int i = IDC_SHOW_SETTINGS_CHANGE_FIRST;
53 i <= IDC_SHOW_SETTINGS_CHANGE_LAST; i++) {
54 if (!menu_ids.Get()[i - IDC_SHOW_SETTINGS_CHANGE_FIRST]) {
55 menu_id_ = i;
56 menu_ids.Get().set(i - IDC_SHOW_SETTINGS_CHANGE_FIRST);
57 break;
58 }
59 }
60 DCHECK(menu_id_ >= 0) << "Out of command IDs for SettingsChangeGlobalError";
43 } 61 }
44 62
45 SettingsChangeGlobalError::~SettingsChangeGlobalError() { 63 SettingsChangeGlobalError::~SettingsChangeGlobalError() {
64 if (profile_)
65 RemoveFromProfile();
66 if (menu_id_ >= 0)
67 menu_ids.Get().reset(menu_id_ - IDC_SHOW_SETTINGS_CHANGE_FIRST);
46 } 68 }
47 69
48 bool SettingsChangeGlobalError::HasBadge() { 70 bool SettingsChangeGlobalError::HasBadge() {
49 return true; 71 return true;
50 } 72 }
51 73
52 int SettingsChangeGlobalError::GetBadgeResourceID() { 74 int SettingsChangeGlobalError::GetBadgeResourceID() {
53 return change_->GetBadgeIconID(); 75 return change_->GetBadgeIconID();
54 } 76 }
55 77
56 bool SettingsChangeGlobalError::HasMenuItem() { 78 bool SettingsChangeGlobalError::HasMenuItem() {
57 return true; 79 return true;
58 } 80 }
59 81
60 int SettingsChangeGlobalError::MenuItemCommandID() { 82 int SettingsChangeGlobalError::MenuItemCommandID() {
61 return IDC_SHOW_SETTINGS_CHANGES; 83 return menu_id_;
62 } 84 }
63 85
64 string16 SettingsChangeGlobalError::MenuItemLabel() { 86 string16 SettingsChangeGlobalError::MenuItemLabel() {
65 return change_->GetBubbleTitle(); 87 return change_->GetBubbleTitle();
66 } 88 }
67 89
68 int SettingsChangeGlobalError::MenuItemIconResourceID() { 90 int SettingsChangeGlobalError::MenuItemIconResourceID() {
69 return change_->GetMenuItemIconID(); 91 return change_->GetMenuItemIconID();
70 } 92 }
71 93
(...skipping 26 matching lines...) Expand all
98 return change_->GetDiscardButtonText(); 120 return change_->GetDiscardButtonText();
99 } 121 }
100 122
101 string16 SettingsChangeGlobalError::GetBubbleViewCancelButtonLabel() { 123 string16 SettingsChangeGlobalError::GetBubbleViewCancelButtonLabel() {
102 return change_->GetApplyButtonText(); 124 return change_->GetApplyButtonText();
103 } 125 }
104 126
105 void SettingsChangeGlobalError::BubbleViewAcceptButtonPressed( 127 void SettingsChangeGlobalError::BubbleViewAcceptButtonPressed(
106 Browser* browser) { 128 Browser* browser) {
107 closed_by_button_ = true; 129 closed_by_button_ = true;
108 delegate_->OnDiscardChange(browser); 130 delegate_->OnDiscardChange(this, browser);
109 } 131 }
110 132
111 void SettingsChangeGlobalError::BubbleViewCancelButtonPressed( 133 void SettingsChangeGlobalError::BubbleViewCancelButtonPressed(
112 Browser* browser) { 134 Browser* browser) {
113 closed_by_button_ = true; 135 closed_by_button_ = true;
114 delegate_->OnApplyChange(browser); 136 delegate_->OnApplyChange(this, browser);
115 } 137 }
116 138
117 void SettingsChangeGlobalError::OnBrowserSetLastActive( 139 void SettingsChangeGlobalError::OnBrowserSetLastActive(
118 const Browser* browser) { 140 const Browser* browser) {
119 if (show_on_browser_activation_ && browser && browser->is_type_tabbed()) { 141 if (show_on_browser_activation_ && browser && browser->is_type_tabbed()) {
120 // A tabbed browser window got activated, show the error bubble again. 142 // A tabbed browser window got activated, show the error bubble again.
121 // Calling Show() immediately from here does not always work because the 143 // Calling Show() immediately from here does not always work because the
122 // old browser window may still have focus. 144 // old browser window may still have focus.
123 // Multiple posted Show() calls are fine since the first successful one 145 // Multiple posted Show() calls are fine since the first successful one
124 // will invalidate all the weak pointers. 146 // will invalidate all the weak pointers.
125 // Note that Show() will display the bubble in the last active browser 147 // Note that Show() will display the bubble in the last active browser
126 // (which may not be |browser| at the moment Show() is executed). 148 // (which may not be |browser| at the moment Show() is executed).
127 BrowserThread::PostTask( 149 BrowserThread::PostTask(
128 BrowserThread::UI, FROM_HERE, 150 BrowserThread::UI, FROM_HERE,
129 base::Bind(&SettingsChangeGlobalError::Show, 151 base::Bind(&SettingsChangeGlobalError::Show,
130 weak_factory_.GetWeakPtr())); 152 weak_factory_.GetWeakPtr()));
131 } 153 }
132 } 154 }
133 155
134 void SettingsChangeGlobalError::RemoveFromProfile() { 156 void SettingsChangeGlobalError::RemoveFromProfile() {
135 if (profile_) 157 if (profile_) {
136 GlobalErrorServiceFactory::GetForProfile(profile_)->RemoveGlobalError(this); 158 GlobalErrorServiceFactory::GetForProfile(profile_)->RemoveGlobalError(this);
159 profile_ = NULL;
160 }
137 BrowserList::RemoveObserver(this); 161 BrowserList::RemoveObserver(this);
138 // This will delete |this|. 162 // This will delete |this|.
139 delegate_->OnRemovedFromProfile(); 163 delegate_->OnRemovedFromProfile(this);
140 } 164 }
141 165
142 void SettingsChangeGlobalError::OnBubbleViewDidClose(Browser* browser) { 166 void SettingsChangeGlobalError::OnBubbleViewDidClose(Browser* browser) {
143 if (!closed_by_button_) { 167 if (!closed_by_button_) {
144 BrowserThread::PostDelayedTask( 168 BrowserThread::PostDelayedTask(
145 BrowserThread::UI, FROM_HERE, 169 BrowserThread::UI, FROM_HERE,
146 base::Bind(&SettingsChangeGlobalError::OnInactiveTimeout, 170 base::Bind(&SettingsChangeGlobalError::OnInactiveTimeout,
147 weak_factory_.GetWeakPtr()), 171 weak_factory_.GetWeakPtr()),
148 kMenuItemDisplayPeriodMs); 172 kMenuItemDisplayPeriodMs);
149 #if !defined(TOOLKIT_GTK) 173 #if !defined(TOOLKIT_GTK)
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 218
195 void SettingsChangeGlobalError::ShowInBrowser(Browser* browser) { 219 void SettingsChangeGlobalError::ShowInBrowser(Browser* browser) {
196 show_on_browser_activation_ = false; 220 show_on_browser_activation_ = false;
197 // Cancel any previously posted tasks so that the global error 221 // Cancel any previously posted tasks so that the global error
198 // does not get removed on timeout while still showing the bubble. 222 // does not get removed on timeout while still showing the bubble.
199 weak_factory_.InvalidateWeakPtrs(); 223 weak_factory_.InvalidateWeakPtrs();
200 ShowBubbleView(browser); 224 ShowBubbleView(browser);
201 } 225 }
202 226
203 void SettingsChangeGlobalError::OnInactiveTimeout() { 227 void SettingsChangeGlobalError::OnInactiveTimeout() {
204 delegate_->OnDecisionTimeout(); 228 delegate_->OnDecisionTimeout(this);
205 RemoveFromProfile(); 229 RemoveFromProfile();
206 } 230 }
207 231
208 } // namespace protector 232 } // namespace protector
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698