Index: chrome/browser/protector/settings_change_global_error.cc |
diff --git a/chrome/browser/protector/settings_change_global_error.cc b/chrome/browser/protector/settings_change_global_error.cc |
index 5ae10a04c70be7973a236c1060e7fdc83a0437a1..f71a2db4a4217cdaf3e5c069c010012cb3a50df8 100644 |
--- a/chrome/browser/protector/settings_change_global_error.cc |
+++ b/chrome/browser/protector/settings_change_global_error.cc |
@@ -8,7 +8,6 @@ |
#include "base/compiler_specific.h" |
#include "base/logging.h" |
#include "base/stl_util.h" |
-#include "chrome/app/chrome_command_ids.h" |
#include "chrome/browser/platform_util.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/protector/base_setting_change.h" |
@@ -30,6 +29,11 @@ const int kMenuItemDisplayPeriodMs = 10*60*1000; // 10 min |
} // namespace |
+// static |
+std::bitset<IDC_SHOW_SETTINGS_CHANGE_LAST - |
+ IDC_SHOW_SETTINGS_CHANGE_FIRST + 1> |
+ SettingsChangeGlobalError::menu_ids_; |
+ |
SettingsChangeGlobalError::SettingsChangeGlobalError( |
BaseSettingChange* change, |
SettingsChangeGlobalErrorDelegate* delegate) |
@@ -38,11 +42,25 @@ SettingsChangeGlobalError::SettingsChangeGlobalError( |
profile_(NULL), |
closed_by_button_(false), |
show_on_browser_activation_(false), |
- ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { |
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), |
+ menu_id_(-1) { |
DCHECK(delegate_); |
+ for (int i = IDC_SHOW_SETTINGS_CHANGE_FIRST; |
+ i <= IDC_SHOW_SETTINGS_CHANGE_LAST; i++) { |
+ if (!menu_ids_[i - IDC_SHOW_SETTINGS_CHANGE_FIRST]) { |
+ menu_id_ = i; |
+ menu_ids_.set(i - IDC_SHOW_SETTINGS_CHANGE_FIRST); |
+ break; |
+ } |
+ } |
+ DCHECK(menu_id_ >= 0) << "Out of command IDs for SettingsChangeGlobalError"; |
} |
SettingsChangeGlobalError::~SettingsChangeGlobalError() { |
+ if (profile_) |
+ RemoveFromProfile(); |
+ if (menu_id_ >= 0) |
+ menu_ids_.reset(menu_id_ - IDC_SHOW_SETTINGS_CHANGE_FIRST); |
} |
bool SettingsChangeGlobalError::HasBadge() { |
@@ -58,7 +76,7 @@ bool SettingsChangeGlobalError::HasMenuItem() { |
} |
int SettingsChangeGlobalError::MenuItemCommandID() { |
- return IDC_SHOW_SETTINGS_CHANGES; |
+ return menu_id_; |
} |
string16 SettingsChangeGlobalError::MenuItemLabel() { |
@@ -105,13 +123,13 @@ string16 SettingsChangeGlobalError::GetBubbleViewCancelButtonLabel() { |
void SettingsChangeGlobalError::BubbleViewAcceptButtonPressed( |
Browser* browser) { |
closed_by_button_ = true; |
- delegate_->OnDiscardChange(browser); |
+ delegate_->OnDiscardChange(this, browser); |
} |
void SettingsChangeGlobalError::BubbleViewCancelButtonPressed( |
Browser* browser) { |
closed_by_button_ = true; |
- delegate_->OnApplyChange(browser); |
+ delegate_->OnApplyChange(this, browser); |
} |
void SettingsChangeGlobalError::OnBrowserSetLastActive( |
@@ -132,11 +150,13 @@ void SettingsChangeGlobalError::OnBrowserSetLastActive( |
} |
void SettingsChangeGlobalError::RemoveFromProfile() { |
- if (profile_) |
+ if (profile_) { |
GlobalErrorServiceFactory::GetForProfile(profile_)->RemoveGlobalError(this); |
+ profile_ = NULL; |
+ } |
BrowserList::RemoveObserver(this); |
// This will delete |this|. |
- delegate_->OnRemovedFromProfile(); |
+ delegate_->OnRemovedFromProfile(this); |
} |
void SettingsChangeGlobalError::OnBubbleViewDidClose(Browser* browser) { |
@@ -146,12 +166,16 @@ void SettingsChangeGlobalError::OnBubbleViewDidClose(Browser* browser) { |
base::Bind(&SettingsChangeGlobalError::OnInactiveTimeout, |
weak_factory_.GetWeakPtr()), |
kMenuItemDisplayPeriodMs); |
+#if !defined(TOOLKIT_GTK) |
Ivan Korotkov
2012/02/29 16:57:41
Disregard that, please (comes from a different CL)
|
+ // TODO(ivankr): the logic for redisplaying bubble is disabled on Gtk, see |
+ // http://crbug.com/115719. |
if (browser->window() && |
!platform_util::IsWindowActive(browser->window()->GetNativeHandle())) { |
// Bubble closed because the entire window lost activation, display |
// again when a window gets active. |
show_on_browser_activation_ = true; |
} |
+#endif |
} else { |
RemoveFromProfile(); |
} |
@@ -197,7 +221,7 @@ void SettingsChangeGlobalError::ShowInBrowser(Browser* browser) { |
} |
void SettingsChangeGlobalError::OnInactiveTimeout() { |
- delegate_->OnDecisionTimeout(); |
+ delegate_->OnDecisionTimeout(this); |
RemoveFromProfile(); |
} |