| Index: chrome/browser/ui/gtk/browser_toolbar_gtk.cc | 
| diff --git a/chrome/browser/ui/gtk/browser_toolbar_gtk.cc b/chrome/browser/ui/gtk/browser_toolbar_gtk.cc | 
| index 11e1b2b34b78916bd15475979e0b4f690ec2013a..45b45812f65af7a15506e458de7014c16933e74d 100644 | 
| --- a/chrome/browser/ui/gtk/browser_toolbar_gtk.cc | 
| +++ b/chrome/browser/ui/gtk/browser_toolbar_gtk.cc | 
| @@ -99,7 +99,9 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window) | 
| model_(browser->toolbar_model()), | 
| is_wrench_menu_model_valid_(true), | 
| browser_(browser), | 
| -      window_(window) { | 
| +      window_(window), | 
| +      zoom_callback_(base::Bind(&BrowserToolbarGtk::OnZoomLevelChanged, | 
| +                                base::Unretained(this))) { | 
| wrench_menu_model_.reset(new WrenchMenuModel(this, browser_, false, false)); | 
|  | 
| chrome::AddCommandObserver(browser_, IDC_BACK, this); | 
| @@ -124,6 +126,9 @@ BrowserToolbarGtk::~BrowserToolbarGtk() { | 
| offscreen_entry_.Destroy(); | 
|  | 
| wrench_menu_.reset(); | 
| + | 
| +  HostZoomMap::GetForBrowserContext( | 
| +      browser()->profile())->RemoveZoomLevelChangedCallback(zoom_callback_); | 
| } | 
|  | 
| void BrowserToolbarGtk::Init(GtkWindow* top_level_window) { | 
| @@ -241,9 +246,8 @@ void BrowserToolbarGtk::Init(GtkWindow* top_level_window) { | 
| // The bookmark menu model needs to be able to force the wrench menu to close. | 
| wrench_menu_model_->bookmark_sub_menu_model()->SetMenuGtk(wrench_menu_.get()); | 
|  | 
| -  registrar_.Add(this, content::NOTIFICATION_ZOOM_LEVEL_CHANGED, | 
| -      content::Source<HostZoomMap>( | 
| -          HostZoomMap::GetForBrowserContext(profile))); | 
| +  HostZoomMap::GetForBrowserContext( | 
| +      browser()->profile())->AddZoomLevelChangedCallback(zoom_callback_); | 
|  | 
| if (ShouldOnlyShowLocation()) { | 
| gtk_widget_show(event_box_); | 
| @@ -416,18 +420,6 @@ void BrowserToolbarGtk::Observe(int type, | 
| } else if (type == chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED) { | 
| is_wrench_menu_model_valid_ = false; | 
| gtk_widget_queue_draw(wrench_menu_button_->widget()); | 
| -  } else if (type == content::NOTIFICATION_ZOOM_LEVEL_CHANGED) { | 
| -    // Since BrowserToolbarGtk create a new |wrench_menu_model_| in | 
| -    // RebuildWrenchMenu(), the ordering of the observers of | 
| -    // NOTIFICATION_ZOOM_LEVEL_CHANGED can change, and result in subtle bugs | 
| -    // like http://crbug.com/118823. Rather than depending on the ordering | 
| -    // of the notification observers, always update the WrenchMenuModel before | 
| -    // updating the WrenchMenu. | 
| -    wrench_menu_model_->UpdateZoomControls(); | 
| - | 
| -    // If our zoom level changed, we need to tell the menu to update its state, | 
| -    // since the menu could still be open. | 
| -    wrench_menu_->UpdateMenu(); | 
| } else { | 
| NOTREACHED(); | 
| } | 
| @@ -449,6 +441,20 @@ bool BrowserToolbarGtk::IsWrenchMenuShowing() const { | 
|  | 
| // BrowserToolbarGtk, private -------------------------------------------------- | 
|  | 
| +void BrowserToolbarGtk::OnZoomLevelChanged(const std::string& host) { | 
| +  // Since BrowserToolbarGtk create a new |wrench_menu_model_| in | 
| +  // RebuildWrenchMenu(), the ordering of the observers of HostZoomMap | 
| +  // can change, and result in subtle bugs like http://crbug.com/118823. | 
| +  // Rather than depending on the ordering of the observers, always update | 
| +  // the WrenchMenuModel before updating the WrenchMenu. | 
| +  wrench_menu_model_->UpdateZoomControls(); | 
| + | 
| +  // If our zoom level changed, we need to tell the menu to update its state, | 
| +  // since the menu could still be open. | 
| +  wrench_menu_->UpdateMenu(); | 
| +} | 
| + | 
| + | 
| void BrowserToolbarGtk::SetUpDragForHomeButton() { | 
| if (!home_page_.IsManaged() && !home_page_is_new_tab_page_.IsManaged()) { | 
| gtk_drag_dest_set(home_->widget(), GTK_DEST_DEFAULT_ALL, | 
|  |