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