1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <algorithm>
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/command_line.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/number_formatting.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_updater.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_commands_global_registry.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_util.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_command_controller.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_instant_controller.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service_factory.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_view.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/toolbar/wrench_menu_model.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/view_ids.h"
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/views/extensions/extension_message_bubble_view.h"
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/views/extensions/extension_popup.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/page_action_image_view.h"
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/page_action_with_badge_view.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/star_view.h"
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/translate_icon_view.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/outdated_upgrade_bubble_view.h"
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/views/toolbar/back_button.h"
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/toolbar/home_button.h"
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/toolbar/reload_button.h"
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/toolbar/wrench_menu.h"
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/toolbar/wrench_toolbar_button.h"
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h"
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_accessibility_state.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h"
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/aura/window.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/theme_provider.h"
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h"
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/compositor/layer.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/canvas_image_source.h"
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/keyboard/keyboard_controller.h"
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/native_theme/native_theme_aura.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_listener.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/view_storage.h"
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/view_targeter.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/tooltip_manager.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/non_client_view.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/views/conflicting_module_view_win.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/critical_notification_bubble_view.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(OS_CHROMEOS)
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/signin_global_error_factory.h"
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/sync/sync_global_error_factory.h"
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(USE_ASH)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/shell.h"
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UserMetricsAction;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The edge graphics have some built-in spacing/shadowing, so we have to adjust
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// our spacing to make it match.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kLeftEdgeSpacing = 3;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kRightEdgeSpacing = 2;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ash doesn't use a rounded content area and its top edge has an extra shadow.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kContentShadowHeightAsh = 2;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Non-ash uses a rounded content area with no shadow in the assets.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kContentShadowHeight = 0;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(OS_CHROMEOS)
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool HasAshShell() {
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(USE_ASH)
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return ash::Shell::HasInstance();
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // USE_ASH
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // OS_CHROMEOS
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char ToolbarView::kViewClassName[] = "ToolbarView";
120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, public:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ToolbarView::ToolbarView(Browser* browser)
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : back_(NULL),
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      forward_(NULL),
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reload_(NULL),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      home_(NULL),
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_bar_(NULL),
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_actions_(NULL),
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_menu_(NULL),
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      browser_(browser),
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      badge_controller_(browser->profile(), this),
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      extension_message_bubble_factory_(
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          new extensions::ExtensionMessageBubbleFactory(browser->profile(),
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                        this)) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_id(VIEW_ID_TOOLBAR);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetEventTargeter(
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      scoped_ptr<views::ViewTargeter>(new views::ViewTargeter(this)));
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddCommandObserver(browser_, IDC_BACK, this);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddCommandObserver(browser_, IDC_FORWARD, this);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddCommandObserver(browser_, IDC_RELOAD, this);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddCommandObserver(browser_, IDC_HOME, this);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddCommandObserver(browser_, IDC_LOAD_NEW_TAB_PAGE, this);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  display_mode_ = DISPLAYMODE_LOCATION;
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (browser->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) ||
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (browser->is_app() && extensions::util::IsStreamlinedHostedAppsEnabled()))
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    display_mode_ = DISPLAYMODE_NORMAL;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (OutdatedUpgradeBubbleView::IsAvailable()) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    registrar_.Add(this, chrome::NOTIFICATION_OUTDATED_INSTALL,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   content::NotificationService::AllSources());
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    registrar_.Add(this, chrome::NOTIFICATION_OUTDATED_INSTALL_NO_AU,
157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   content::NotificationService::AllSources());
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_CRITICAL_UPGRADE_INSTALLED,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ToolbarView::~ToolbarView() {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: Don't remove the command observers here.  This object gets destroyed
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after the Browser (which owns the CommandUpdater), so the CommandUpdater is
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // already gone.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::Init() {
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetWidget()->AddObserver(this);
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  back_ = new BackButton(this, new BackForwardMenuModel(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_, BackForwardMenuModel::BACKWARD_MENU));
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  back_->set_triggerable_event_flags(
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ui::EF_LEFT_MOUSE_BUTTON | ui::EF_MIDDLE_MOUSE_BUTTON);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  back_->set_tag(IDC_BACK);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  back_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_BACK));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  back_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_BACK));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  back_->set_id(VIEW_ID_BACK_BUTTON);
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  back_->Init();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  forward_ = new ToolbarButton(this, new BackForwardMenuModel(
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      browser_, BackForwardMenuModel::FORWARD_MENU));
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  forward_->set_triggerable_event_flags(
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ui::EF_LEFT_MOUSE_BUTTON | ui::EF_MIDDLE_MOUSE_BUTTON);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forward_->set_tag(IDC_FORWARD);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forward_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_FORWARD));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forward_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_FORWARD));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forward_->set_id(VIEW_ID_FORWARD_BUTTON);
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  forward_->Init();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_bar_ = new LocationBarView(
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser_, browser_->profile(),
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      browser_->command_controller()->command_updater(), this,
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_mode_ == DISPLAYMODE_LOCATION);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  reload_ = new ReloadButton(browser_->command_controller()->command_updater());
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  reload_->set_triggerable_event_flags(
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ui::EF_LEFT_MOUSE_BUTTON | ui::EF_MIDDLE_MOUSE_BUTTON);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reload_->set_tag(IDC_RELOAD);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reload_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_RELOAD));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reload_->set_id(VIEW_ID_RELOAD_BUTTON);
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reload_->Init();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  home_ = new HomeButton(this, browser_);
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  home_->set_triggerable_event_flags(
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ui::EF_LEFT_MOUSE_BUTTON | ui::EF_MIDDLE_MOUSE_BUTTON);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_->set_tag(IDC_HOME);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_HOME));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_HOME));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_->set_id(VIEW_ID_HOME_BUTTON);
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  home_->Init();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  browser_actions_ = new BrowserActionsContainer(
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      browser_,
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      this,   // Owner.
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NULL);  // No master container for this one (it is master).
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  app_menu_ = new WrenchToolbarButton(this);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_menu_->EnableCanvasFlippingForRTLUI(true);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_menu_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_APP));
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_menu_->SetTooltipText(l10n_util::GetStringUTF16(IDS_APPMENU_TOOLTIP));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_menu_->set_id(VIEW_ID_APP_MENU);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Always add children in order from left to right, for accessibility.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(back_);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(forward_);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(reload_);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(home_);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(location_bar_);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(browser_actions_);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(app_menu_);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LoadImages();
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Start global error services now so we badge the menu correctly in non-Ash.
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(OS_CHROMEOS)
240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!HasAshShell()) {
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SigninGlobalErrorFactory::GetForProfile(browser_->profile());
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(OS_ANDROID)
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    SyncGlobalErrorFactory::GetForProfile(browser_->profile());
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // OS_CHROMEOS
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Add any necessary badges to the menu item based on the system state.
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Do this after |app_menu_| has been added as a bubble may be shown that
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // needs the widget (widget found by way of app_menu_->GetWidget()).
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  badge_controller_.UpdateDelegate();
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_bar_->Init();
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  show_home_button_.Init(prefs::kShowHomeButton,
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         browser_->profile()->GetPrefs(),
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         base::Bind(&ToolbarView::OnShowHomeButtonChanged,
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    base::Unretained(this)));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_actions_->Init();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accessibility specific tooltip text.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content::BrowserAccessibilityState::GetInstance()->
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IsAccessibleBrowser()) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    back_->SetTooltipText(
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ACCNAME_TOOLTIP_BACK));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    forward_->SetTooltipText(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ACCNAME_TOOLTIP_FORWARD));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ToolbarView::OnWidgetVisibilityChanged(views::Widget* widget,
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                            bool visible) {
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (visible) {
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Safe to call multiple times; the bubble will only appear once.
276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    extension_message_bubble_factory_->MaybeShow(app_menu_);
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ToolbarView::OnWidgetActivationChanged(views::Widget* widget,
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            bool active) {
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extensions::ExtensionCommandsGlobalRegistry* registry =
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extensions::ExtensionCommandsGlobalRegistry::Get(browser_->profile());
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (registry) {
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (active) {
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      registry->set_registry_for_active_window(
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          browser_actions_->extension_keybinding_registry());
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } else if (registry->registry_for_active_window() ==
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               browser_actions_->extension_keybinding_registry()) {
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      registry->set_registry_for_active_window(NULL);
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ToolbarView::Update(WebContents* tab) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (location_bar_)
2973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    location_bar_->Update(tab);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_actions_)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_actions_->RefreshBrowserActionViews();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reload_)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reload_->set_menu_enabled(chrome::IsDebuggerAttachedToCurrentTab(browser_));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::SetPaneFocusAndFocusAppMenu() {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPaneFocus(app_menu_);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ToolbarView::IsAppMenuFocused() {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return app_menu_->HasFocus();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::AddMenuListener(views::MenuListener* listener) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_listeners_.AddObserver(listener);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::RemoveMenuListener(views::MenuListener* listener) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_listeners_.RemoveObserver(listener);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* ToolbarView::GetBookmarkBubbleAnchor() {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* star_view = location_bar()->star_view();
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return (star_view && star_view->visible()) ? star_view : app_menu_;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)views::View* ToolbarView::GetTranslateBubbleAnchor() {
3261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  views::View* translate_icon_view = location_bar()->translate_icon_view();
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return (translate_icon_view && translate_icon_view->visible()) ?
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      translate_icon_view : app_menu_;
3291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ToolbarView::ExecuteExtensionCommand(
332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const extensions::Extension* extension,
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const extensions::Command& command) {
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  browser_actions_->ExecuteExtensionCommand(extension, command);
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ToolbarView::ShowAppMenu(bool for_drop) {
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (wrench_menu_.get() && wrench_menu_->IsShowing())
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (keyboard::KeyboardController::GetInstance() &&
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      keyboard::KeyboardController::GetInstance()->keyboard_visible()) {
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    keyboard::KeyboardController::GetInstance()->HideKeyboard(
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        keyboard::KeyboardController::HIDE_REASON_AUTOMATIC);
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  wrench_menu_.reset(
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new WrenchMenu(browser_, for_drop ? WrenchMenu::FOR_DROP : 0));
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  wrench_menu_model_.reset(new WrenchMenuModel(this, browser_));
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  wrench_menu_->Init(wrench_menu_model_.get());
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FOR_EACH_OBSERVER(views::MenuListener, menu_listeners_, OnMenuOpened());
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  wrench_menu_->RunMenu(app_menu_);
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::MenuButton* ToolbarView::app_menu() const {
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return app_menu_;
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, AccessiblePaneView overrides:
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ToolbarView::SetPaneFocus(views::View* initial_focus) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!AccessiblePaneView::SetPaneFocus(initial_focus))
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_bar_->SetShowFocusRect(true);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ToolbarView::GetAccessibleState(ui::AXViewState* state) {
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  state->role = ui::AX_ROLE_TOOLBAR;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_TOOLBAR);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, Menu::Delegate overrides:
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ToolbarView::GetAcceleratorInfo(int id, ui::Accelerator* accel) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->GetAccelerator(id, accel);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, views::MenuButtonListener implementation:
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::OnMenuButtonClicked(views::View* source,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const gfx::Point& point) {
389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TRACE_EVENT0("views", "ToolbarView::OnMenuButtonClicked");
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(VIEW_ID_APP_MENU, source->id());
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ShowAppMenu(false);  // Not for drop.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, LocationBarView::Delegate implementation:
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)WebContents* ToolbarView::GetWebContents() {
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return browser_->tab_strip_model()->GetActiveWebContents();
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)ToolbarModel* ToolbarView::GetToolbarModel() {
4023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return browser_->toolbar_model();
4033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const ToolbarModel* ToolbarView::GetToolbarModel() const {
4063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return browser_->toolbar_model();
4073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InstantController* ToolbarView::GetInstant() {
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return browser_->instant_controller() ?
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser_->instant_controller()->instant() : NULL;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingBubbleModelDelegate*
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ToolbarView::GetContentSettingBubbleModelDelegate() {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_->content_setting_bubble_model_delegate();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ToolbarView::ShowWebsiteSettings(content::WebContents* web_contents,
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const GURL& url,
4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      const content::SSLStatus& ssl) {
4227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chrome::ShowWebsiteSettings(browser_, web_contents, url, ssl);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* ToolbarView::CreateViewsBubble(
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::BubbleDelegateView* bubble_delegate) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return views::BubbleDelegateView::CreateBubble(bubble_delegate);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PageActionImageView* ToolbarView::CreatePageActionImageView(
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LocationBarView* owner, ExtensionAction* action) {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new PageActionImageView(owner, action, browser_);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, CommandObserver implementation:
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::EnabledStateChangedForCommand(int id, bool enabled) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Button* button = NULL;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (id) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_BACK:
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      button = back_;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_FORWARD:
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      button = forward_;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_RELOAD:
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      button = reload_;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_HOME:
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      button = home_;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (button)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    button->SetEnabled(enabled);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, views::Button::ButtonListener implementation:
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::ButtonPressed(views::Button* sender,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const ui::Event& event) {
46323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  chrome::ExecuteCommandWithDisposition(
46423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      browser_, sender->tag(), ui::DispositionFromEventFlags(event.flags()));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, content::NotificationObserver implementation:
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::Observe(int type,
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const content::NotificationSource& source,
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const content::NotificationDetails& details) {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_OUTDATED_INSTALL:
475effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ShowOutdatedInstallNotification(true);
476effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      break;
477effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case chrome::NOTIFICATION_OUTDATED_INSTALL_NO_AU:
478effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ShowOutdatedInstallNotification(false);
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chrome::NOTIFICATION_CRITICAL_UPGRADE_INSTALLED:
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowCriticalNotification();
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, ui::AcceleratorProvider implementation:
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ToolbarView::GetAcceleratorForCommandId(int command_id,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::Accelerator* accelerator) {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->GetAccelerator(command_id, accelerator);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, views::View overrides:
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ToolbarView::GetPreferredSize() const {
502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Size size(location_bar_->GetPreferredSize());
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_display_mode_normal()) {
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int content_width = kLeftEdgeSpacing + back_->GetPreferredSize().width() +
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        forward_->GetPreferredSize().width() +
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        reload_->GetPreferredSize().width() +
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        (show_home_button_.GetValue() ? home_->GetPreferredSize().width() : 0) +
508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        kStandardSpacing + browser_actions_->GetPreferredSize().width() +
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        app_menu_->GetPreferredSize().width() + kRightEdgeSpacing;
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    size.Enlarge(content_width, 0);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return SizeForContentSize(size);
513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ToolbarView::GetMinimumSize() const {
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Size size(location_bar_->GetMinimumSize());
517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_display_mode_normal()) {
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int content_width = kLeftEdgeSpacing + back_->GetMinimumSize().width() +
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        forward_->GetMinimumSize().width() + reload_->GetMinimumSize().width() +
520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        (show_home_button_.GetValue() ? home_->GetMinimumSize().width() : 0) +
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        kStandardSpacing + browser_actions_->GetMinimumSize().width() +
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        app_menu_->GetMinimumSize().width() + kRightEdgeSpacing;
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    size.Enlarge(content_width, 0);
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return SizeForContentSize(size);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::Layout() {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we have not been initialized yet just do nothing.
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (back_ == NULL)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_display_mode_normal()) {
53490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    location_bar_->SetBounds(0, PopupTopSpacing(), width(),
53590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             location_bar_->GetPreferredSize().height());
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // We assume all child elements except the location bar are the same height.
540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set child_y such that buttons appear vertically centered. We put any excess
541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // padding above the buttons.
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int child_height =
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::min(back_->GetPreferredSize().height(), height());
544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int child_y = (height() - child_height + 1) / 2;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the window is maximized, we extend the back button to the left so that
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clicking on the left-most pixel will activate the back button.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(abarth):  If the window becomes maximized but is not resized,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                then Layout() might not be called and the back button
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                will be slightly the wrong size.  We should force a
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                Layout() in this case.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                http://crbug.com/5540
55390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool maximized = browser_->window() && browser_->window()->IsMaximized();
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int back_width = back_->GetPreferredSize().width();
555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (maximized) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    back_->SetBounds(0, child_y, back_width + kLeftEdgeSpacing, child_height);
557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    back_->SetLeadingMargin(kLeftEdgeSpacing);
558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else {
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    back_->SetBounds(kLeftEdgeSpacing, child_y, back_width, child_height);
560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    back_->SetLeadingMargin(0);
561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
5625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int next_element_x = back_->bounds().right();
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  forward_->SetBounds(next_element_x, child_y,
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      forward_->GetPreferredSize().width(), child_height);
5665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  next_element_x = forward_->bounds().right();
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reload_->SetBounds(next_element_x, child_y,
5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     reload_->GetPreferredSize().width(), child_height);
5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  next_element_x = reload_->bounds().right();
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (show_home_button_.GetValue() ||
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (browser_->is_app() &&
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       extensions::util::IsStreamlinedHostedAppsEnabled())) {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    home_->SetVisible(true);
5765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    home_->SetBounds(next_element_x, child_y,
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     home_->GetPreferredSize().width(), child_height);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    home_->SetVisible(false);
5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    home_->SetBounds(next_element_x, child_y, 0, child_height);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  next_element_x = home_->bounds().right() + kStandardSpacing;
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int browser_actions_width = browser_actions_->GetPreferredSize().width();
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int app_menu_width = app_menu_->GetPreferredSize().width();
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int available_width = std::max(0, width() - kRightEdgeSpacing -
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      app_menu_width - browser_actions_width - next_element_x);
5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int location_height = location_bar_->GetPreferredSize().height();
590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int location_y = (height() - location_height + 1) / 2;
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  location_bar_->SetBounds(next_element_x, location_y,
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           std::max(available_width, 0), location_height);
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  next_element_x = location_bar_->bounds().right();
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  browser_actions_->SetBounds(
596effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      next_element_x, child_y, browser_actions_width, child_height);
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  next_element_x = browser_actions_->bounds().right();
598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser actions need to do a layout explicitly, because when an
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension is loaded/unloaded/changed, BrowserActionContainer removes and
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // re-adds everything, regardless of whether it has a page action. For a
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page action, browser action bounds do not change, as a result of which
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetBounds does not do a layout at all.
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sidchat): Rework the above behavior so that explicit layout is not
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                required.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_actions_->Layout();
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extend the app menu to the screen's right edge in maximized mode just like
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we extend the back button to the left edge.
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (maximized)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    app_menu_width += kRightEdgeSpacing;
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  app_menu_->SetBounds(next_element_x, child_y, app_menu_width, child_height);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::OnPaint(gfx::Canvas* canvas) {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View::OnPaint(canvas);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_display_mode_normal())
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For glass, we need to draw a black line below the location bar to separate
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it from the content area.  For non-glass, the NonClientView draws the
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // toolbar background below the location bar for us.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: Keep this in sync with BrowserView::GetInfoBarSeparatorColor()!
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (GetWidget()->ShouldWindowContentsBeTransparent())
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    canvas->FillRect(gfx::Rect(0, height() - 1, width(), 1), SK_ColorBLACK);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::OnThemeChanged() {
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadImages();
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
633b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* ToolbarView::GetClassName() const {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kViewClassName;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ToolbarView::AcceleratorPressed(const ui::Accelerator& accelerator) {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const views::View* focused_view = focus_manager()->GetFocusedView();
639a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (focused_view && (focused_view->id() == VIEW_ID_OMNIBOX))
640a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    return false;  // Let the omnibox handle all accelerator events.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AccessiblePaneView::AcceleratorPressed(accelerator);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ToolbarView::IsWrenchMenuShowing() const {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return wrench_menu_.get() && wrench_menu_->IsShowing();
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool ToolbarView::ShouldPaintBackground() const {
6494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return display_mode_ == DISPLAYMODE_NORMAL;
6504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
6514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, protected:
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Override this so that when the user presses F6 to rotate toolbar panes,
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the location bar gets focus, not the first control in the toolbar - and
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// also so that it selects all content in the location bar.
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ToolbarView::SetPaneFocusAndFocusDefault() {
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!location_bar_->HasFocus()) {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetPaneFocus(location_bar_);
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    location_bar_->FocusLocation(true);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!AccessiblePaneView::SetPaneFocusAndFocusDefault())
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_->window()->RotatePaneFocus(true);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::RemovePaneFocus() {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AccessiblePaneView::RemovePaneFocus();
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_bar_->SetShowFocusRect(false);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToolbarView, private:
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
679116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// views::ViewTargeterDelegate:
680116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ToolbarView::DoesIntersectRect(const views::View* target,
681116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    const gfx::Rect& rect) const {
682116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CHECK_EQ(target, this);
683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
684116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Fall through to the tab strip above us if none of |rect| intersects
685116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // with this view (intersection with the top shadow edge does not
686116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // count as intersection with this view).
687116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (rect.bottom() < content_shadow_height())
688116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
689116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Otherwise let our superclass take care of it.
690116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ViewTargeterDelegate::DoesIntersectRect(this, rect);
691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
692116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ToolbarView::UpdateBadgeSeverity(WrenchMenuBadgeController::BadgeType type,
6945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                      WrenchIconPainter::Severity severity,
6955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                      bool animate)  {
6965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Showing the bubble requires |app_menu_| to be in a widget. See comment
6975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // in ConflictingModuleView for details.
6985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(app_menu_->GetWidget());
6995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::string16 accname_app = l10n_util::GetStringUTF16(IDS_ACCNAME_APP);
7015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (type == WrenchMenuBadgeController::BADGE_TYPE_UPGRADE_NOTIFICATION) {
7025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    accname_app = l10n_util::GetStringFUTF16(
7035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        IDS_ACCNAME_APP_UPGRADE_RECOMMENDED, accname_app);
7045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
7055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  app_menu_->SetAccessibleName(accname_app);
7065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  app_menu_->SetSeverity(severity, animate);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Keep track of whether we were showing the badge before, so we don't send
7095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // multiple UMA events for example when multiple Chrome windows are open.
7105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static bool incompatibility_badge_showing = false;
7115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Save the old value before resetting it.
7125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool was_showing = incompatibility_badge_showing;
7135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  incompatibility_badge_showing = false;
7145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (type == WrenchMenuBadgeController::BADGE_TYPE_INCOMPATIBILITY_WARNING) {
7165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!was_showing) {
7175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::RecordAction(UserMetricsAction("ConflictBadge"));
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ConflictingModuleView::MaybeShow(browser_, app_menu_);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
7225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    incompatibility_badge_showing = true;
7235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
7245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ToolbarView::PopupTopSpacing() const {
72890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int kPopupTopSpacingNonGlass = 3;
729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return GetWidget()->ShouldWindowContentsBeTransparent() ?
730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      0 : kPopupTopSpacingNonGlass;
731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ToolbarView::SizeForContentSize(gfx::Size size) const {
734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_display_mode_normal()) {
735cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::ImageSkia* normal_background =
736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        GetThemeProvider()->GetImageSkiaNamed(IDR_CONTENT_TOP_CENTER);
737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    size.SetToMax(
738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        gfx::Size(0, normal_background->height() - content_shadow_height()));
739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const int kPopupBottomSpacingGlass = 1;
741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const int kPopupBottomSpacingNonGlass = 2;
742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    size.Enlarge(
743cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        0,
744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        PopupTopSpacing() + (GetWidget()->ShouldWindowContentsBeTransparent() ?
745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            kPopupBottomSpacingGlass : kPopupBottomSpacingNonGlass));
746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return size;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::LoadImages() {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ThemeProvider* tp = GetThemeProvider();
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  back_->SetImage(views::Button::STATE_NORMAL,
754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  *(tp->GetImageSkiaNamed(IDR_BACK)));
755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  back_->SetImage(views::Button::STATE_DISABLED,
756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  *(tp->GetImageSkiaNamed(IDR_BACK_D)));
757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  forward_->SetImage(views::Button::STATE_NORMAL,
759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    *(tp->GetImageSkiaNamed(IDR_FORWARD)));
760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  forward_->SetImage(views::Button::STATE_DISABLED,
761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     *(tp->GetImageSkiaNamed(IDR_FORWARD_D)));
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  reload_->LoadImages();
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  home_->SetImage(views::Button::STATE_NORMAL,
766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  *(tp->GetImageSkiaNamed(IDR_HOME)));
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarView::ShowCriticalNotification() {
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CriticalNotificationBubbleView* bubble_delegate =
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CriticalNotificationBubbleView(app_menu_);
773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  views::BubbleDelegateView::CreateBubble(bubble_delegate)->Show();
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
777effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ToolbarView::ShowOutdatedInstallNotification(bool auto_update_enabled) {
778effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (OutdatedUpgradeBubbleView::IsAvailable()) {
779effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    OutdatedUpgradeBubbleView::ShowBubble(
780effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        app_menu_, browser_, auto_update_enabled);
781effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ToolbarView::OnShowHomeButtonChanged() {
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SchedulePaint();
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ToolbarView::content_shadow_height() const {
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return browser_->host_desktop_type() == chrome::HOST_DESKTOP_TYPE_ASH ?
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kContentShadowHeightAsh : kContentShadowHeight;
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
793