15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_updater.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/omnibox/omnibox_api.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/location_bar_controller.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/script_bubble_controller.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_instant_controller.h" 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/omnibox/alternate_nav_url_fetcher.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/location_bar_util.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_model.h" 35a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_view.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/view_ids.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/bookmarks/bookmark_prompt_view.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/browser_dialogs.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/extensions/extension_popup.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/content_setting_image_view.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/ev_bubble_view.h" 434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/browser/ui/views/location_bar/generated_credit_card_view.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/keyword_hint_view.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_layout.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_icon_view.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/open_pdf_in_reader_view.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/page_action_image_view.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/page_action_with_badge_view.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/location_bar/script_bubble_icon_view.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/selected_keyword_view.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/star_view.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/zoom_bubble_view.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/zoom_view.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/omnibox/omnibox_view_views.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/omnibox/omnibox_views.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/zoom/zoom_controller.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/feature_switch.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accessibility/accessible_view_state.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/theme_provider.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/color_utils.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h" 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ui/native_theme/native_theme.h" 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/background.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/border.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/button_drag_utils.h" 813d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch#include "ui/views/controls/button/image_button.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/window/non_client_view.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/win/scoped_hdc.h" 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/win/scoped_select_object.h" 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme_win.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/omnibox/omnibox_view_win.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/first_run_bubble.h" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::View; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* GetBrowserFromDelegate(LocationBarView::Delegate* delegate) { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = delegate->GetWebContents(); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return contents ? chrome::FindBrowserWithWebContents(contents) : NULL; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Given a containing |height| and a base |font_list|, shrinks the fonts until 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the primary font will fit within |height| while having its cap height 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// vertically centered. Returns the |font_y_offset| needed to produce this 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// centering. 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void CalculateFontAndOffsetForHeight(int height, 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gfx::FontList* font_list, 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int* font_y_offset) { 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN) 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::win::ScopedGetDC screen_dc(NULL); 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) while (true) { 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(pkasting): Expand the gfx::Font metrics (and underlying Skia 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // metrics) enough to expose the cap height directly. 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN) 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const gfx::Font& font = font_list->GetPrimaryFont(); 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::win::ScopedSelectObject font_in_dc(screen_dc, font.GetNativeFont()); 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TEXTMETRIC tm = {0}; 13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetTextMetrics(screen_dc, &tm); 136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int cap_height = font.GetBaseline() - tm.tmInternalLeading; 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *font_y_offset = ((height - cap_height) / 2) - tm.tmInternalLeading; 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Without cap height available, we fall back to centering the full height. 140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *font_y_offset = (height - font_list->GetHeight()) / 2; 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const int font_size = font_list->GetFontSize(); 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (((*font_y_offset >= 0) && 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ((*font_y_offset + font_list->GetHeight()) <= height)) || 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) (font_size <= 1)) 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *font_list = font_list->DeriveFontListWithSize(font_size - 1); 14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// LocationBarView ----------------------------------------------------------- 15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int LocationBarView::kNormalEdgeThickness = 2; 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int LocationBarView::kPopupEdgeThickness = 1; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int LocationBarView::kIconInternalPadding = 2; 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int LocationBarView::kBubblePadding = 1; 162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char LocationBarView::kViewClassName[] = "LocationBarView"; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocationBarView::LocationBarView(Browser* browser, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandUpdater* command_updater, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ToolbarModel* model, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* delegate, 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_popup_mode) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : browser_(browser), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(profile), 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater_(command_updater), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_(model), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate), 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition_(CURRENT_TAB), 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_(content::PageTransitionFromInt( 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED | 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_FROM_ADDRESS_BAR)), 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_icon_view_(NULL), 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev_bubble_view_(NULL), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_view_(NULL), 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_(NULL), 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_keyword_view_(NULL), 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suggested_text_view_(NULL), 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyword_hint_view_(NULL), 1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mic_search_view_(NULL), 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_view_(NULL), 1884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch generated_credit_card_view_(NULL), 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open_pdf_in_reader_view_(NULL), 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) script_bubble_icon_view_(NULL), 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) star_view_(NULL), 19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_popup_mode_(is_popup_mode), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show_focus_rect_(false), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template_url_service_(NULL), 1954c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) animation_offset_(0), 1964c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) weak_ptr_factory_(this) { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!views::Textfield::IsViewsTextfieldEnabled()) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_id(VIEW_ID_OMNIBOX); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int kOmniboxBorderImages[] = IMAGE_GRID(IDR_OMNIBOX_BORDER); 201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int kOmniboxPopupImages[] = IMAGE_GRID(IDR_OMNIBOX_POPUP_BORDER); 202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) background_border_painter_.reset( 203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) views::Painter::CreateImageGridPainter( 204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_popup_mode_ ? kOmniboxPopupImages : kOmniboxBorderImages)); 205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_CHROMEOS) 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!is_popup_mode_) { 207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int kOmniboxFillingImages[] = IMAGE_GRID(IDR_OMNIBOX_FILLING); 208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) background_filling_painter_.reset( 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) views::Painter::CreateImageGridPainter(kOmniboxFillingImages)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) edit_bookmarks_enabled_.Init( 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kEditBookmarksEnabled, 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_->GetPrefs(), 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LocationBarView::Update, 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<content::WebContents*>(NULL))); 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (browser_) 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser_->search_model()->AddObserver(this); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocationBarView::~LocationBarView() { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (template_url_service_) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template_url_service_->RemoveObserver(this); 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (browser_) 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser_->search_model()->RemoveObserver(this); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2313d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch// static 2323d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochvoid LocationBarView::InitTouchableLocationBarChildView(views::View* view) { 2333d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch int horizontal_padding = GetBuiltInHorizontalPaddingForChildViews(); 2343d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch if (horizontal_padding != 0) { 2353d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch view->set_border(views::Border::CreateEmptyBorder( 2363d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 3, horizontal_padding, 3, horizontal_padding)); 2373d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch } 2383d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch} 2393d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::Init() { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to be in a Widget, otherwise GetNativeTheme() may change and we're 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not prepared for that. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(GetWidget()); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_icon_view_ = new LocationIconView(this); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_icon_view_->set_drag_controller(this); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(location_icon_view_); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Determine the main font. 250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gfx::FontList font_list = ResourceBundle::GetSharedInstance().GetFontList( 251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResourceBundle::BaseFont); 252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const int current_font_size = font_list.GetFontSize(); 25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int desired_font_size = browser_defaults::kOmniboxFontPixelSize; 25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (current_font_size < desired_font_size) 255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) font_list = font_list.DeriveFontListWithSize(desired_font_size); 25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Shrink large fonts to make them fit. 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(pkasting): Stretch the location bar instead in this case. 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int location_height = GetInternalHeight(true); 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int font_y_offset; 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CalculateFontAndOffsetForHeight(location_height, &font_list, &font_y_offset); 261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const gfx::Font& font = font_list.GetPrimaryFont(); 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Determine the font for use inside the bubbles. 264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gfx::FontList bubble_font_list(font_list); 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int bubble_font_y_offset; 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The bubble background images have 1 px thick edges, which we don't want to 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // overlap. 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int kBubbleInteriorVerticalPadding = 1; 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CalculateFontAndOffsetForHeight( 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) location_height - ((kBubblePadding + kBubbleInteriorVerticalPadding) * 2), 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &bubble_font_list, &bubble_font_y_offset); 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bubble_font_y_offset += kBubbleInteriorVerticalPadding; 273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const gfx::Font& bubble_font = font_list.GetPrimaryFont(); 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const SkColor background_color = 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetColor(ToolbarModel::NONE, LocationBarView::BACKGROUND); 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ev_bubble_view_ = new EVBubbleView( 278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bubble_font, bubble_font_y_offset, 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetColor(ToolbarModel::EV_SECURE, SECURITY_TEXT), background_color, this); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev_bubble_view_->set_drag_controller(this); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(ev_bubble_view_); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initialize the Omnibox view. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_.reset(CreateOmniboxView(this, model_, profile_, 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) command_updater_, is_popup_mode_, this, font_list, font_y_offset)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLocationEntryFocusable(true); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_view_ = location_entry_->AddToView(this); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Initialize the inline autocomplete view which is visible only when IME is 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // turned on. Use the same font with the omnibox and highlighted background. 291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_ = new views::Label(string16(), font); 2925db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) { 2935db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) // views::Label (|ime_inline_autocomplete_view_|) supports only gfx::Font 2945db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) // and ignores the rest of fonts but the first in |font_list| while 2955db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) // views::Textfield (|location_entry_view_|) supports gfx::FontList and 2965db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) // layouts text based on all fonts in the list. Thus the font height and 2975db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) // baseline can be different between them. We add padding to align them 2985db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) // on the same baseline. 2995db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) // TODO(yukishiino): Remove this hack once views::Label supports 3005db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) // gfx::FontList. 3015db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) const int baseline_diff = location_entry_view_->GetBaseline() - 3025db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) ime_inline_autocomplete_view_->GetBaseline(); 3035db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) ime_inline_autocomplete_view_->set_border( 3045db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) views::Border::CreateEmptyBorder( 3055db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) font_y_offset + baseline_diff, 0, 0, 0)); 3065db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles) } 307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->SetAutoColorReadabilityEnabled(false); 309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->set_background( 310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) views::Background::CreateSolidBackground(GetNativeTheme()->GetSystemColor( 311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused))); 312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->SetEnabledColor( 313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetNativeTheme()->GetSystemColor( 314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui::NativeTheme::kColorId_TextfieldSelectionColor)); 315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->SetVisible(false); 316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddChildView(ime_inline_autocomplete_view_); 317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const SkColor text_color = GetColor(ToolbarModel::NONE, TEXT); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_keyword_view_ = new SelectedKeywordView( 320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bubble_font, bubble_font_y_offset, text_color, background_color, 321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(selected_keyword_view_); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_text_view_ = new views::Label(string16(), font); 32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_text_view_->set_border( 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Border::CreateEmptyBorder(font_y_offset, 0, 0, 0)); 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_text_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_text_view_->SetAutoColorReadabilityEnabled(false); 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_text_view_->SetEnabledColor(GetColor( 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ToolbarModel::NONE, LocationBarView::DEEMPHASIZED_TEXT)); 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_text_view_->SetVisible(false); 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddChildView(suggested_text_view_); 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) keyword_hint_view_ = new KeywordHintView( 335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_, font, font_y_offset, 336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetColor(ToolbarModel::NONE, LocationBarView::DEEMPHASIZED_TEXT), 337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) background_color); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(keyword_hint_view_); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3403d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch mic_search_view_ = new views::ImageButton(this); 3413d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch mic_search_view_->set_id(VIEW_ID_MIC_SEARCH_BUTTON); 3423d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch mic_search_view_->set_accessibility_focusable(true); 3433d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch mic_search_view_->SetTooltipText( 3443d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch l10n_util::GetStringUTF16(IDS_TOOLTIP_MIC_SEARCH)); 3453d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch mic_search_view_->SetImage( 3463d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch views::Button::STATE_NORMAL, 3473d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 3483d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch IDR_OMNIBOX_MIC_SEARCH)); 3493d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch mic_search_view_->SetImageAlignment(views::ImageButton::ALIGN_CENTER, 3503d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch views::ImageButton::ALIGN_MIDDLE); 3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mic_search_view_->SetVisible(false); 3523d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch InitTouchableLocationBarChildView(mic_search_view_); 3537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AddChildView(mic_search_view_); 3547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingImageView* content_blocked_view = 357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new ContentSettingImageView(static_cast<ContentSettingsType>(i), this, 358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bubble_font, bubble_font_y_offset, 359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) text_color, background_color); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_setting_views_.push_back(content_blocked_view); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blocked_view->SetVisible(false); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(content_blocked_view); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch generated_credit_card_view_ = new GeneratedCreditCardView(model_, delegate_); 3664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch AddChildView(generated_credit_card_view_); 3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_view_ = new ZoomView(model_, delegate_); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_view_->set_id(VIEW_ID_ZOOM_BUTTON); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(zoom_view_); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open_pdf_in_reader_view_ = new OpenPDFInReaderView(this); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(open_pdf_in_reader_view_); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) script_bubble_icon_view_ = new ScriptBubbleIconView(delegate()); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) script_bubble_icon_view_->SetVisible(false); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(script_bubble_icon_view_); 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch star_view_ = new StarView(command_updater_); 3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch star_view_->SetVisible(false); 3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AddChildView(star_view_); 3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_)); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the location entry. We do this to avoid a black flash which is 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visible when the location entry has just been initialized. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Update(NULL); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnChanged(); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::IsInitialized() const { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return location_entry_view_ != NULL; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor LocationBarView::GetColor(ToolbarModel::SecurityLevel security_level, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ColorKind kind) const { 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::NativeTheme* native_theme = GetNativeTheme(); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (kind) { 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BACKGROUND: 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Chrome OS requires a transparent omnibox background color. 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SkColorSetARGB(0, 255, 255, 255); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return native_theme->GetSystemColor( 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_TextfieldDefaultBackground); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case TEXT: 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return native_theme->GetSystemColor( 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_TextfieldDefaultColor); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SELECTED_TEXT: 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return native_theme->GetSystemColor( 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_TextfieldSelectionColor); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DEEMPHASIZED_TEXT: 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return color_utils::AlphaBlend( 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetColor(security_level, TEXT), 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetColor(security_level, BACKGROUND), 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SECURITY_TEXT: { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (security_level) { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ToolbarModel::EV_SECURE: 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ToolbarModel::SECURE: 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color = SkColorSetRGB(7, 149, 0); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ToolbarModel::SECURITY_WARNING: 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ToolbarModel::SECURITY_POLICY_WARNING: 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetColor(security_level, DEEMPHASIZED_TEXT); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ToolbarModel::SECURITY_ERROR: 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color = SkColorSetRGB(162, 0, 0); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetColor(security_level, TEXT); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return color_utils::GetReadableColor( 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color, GetColor(security_level, BACKGROUND)); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetColor(security_level, TEXT); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void LocationBarView::GetOmniboxPopupPositioningInfo( 457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::Point* top_left_screen_coord, 458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int* popup_width, 459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int* left_margin, 460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int* right_margin) { 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Because the popup might appear atop the attached bookmark bar, there won't 4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // necessarily be a client edge separating it from the rest of the toolbar. 4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Therefore we position the popup high enough so it can draw its own client 4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // edge at the top, in the same place the toolbar would normally draw the 4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // client edge. 4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *top_left_screen_coord = gfx::Point( 4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parent()->height() - views::NonClientFrameView::kClientEdgeThickness); 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) views::View::ConvertPointToScreen(parent(), top_left_screen_coord); 470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *popup_width = parent()->width(); 471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Rect location_bar_bounds(bounds()); 4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) location_bar_bounds.Inset(kNormalEdgeThickness, 0); 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *left_margin = location_bar_bounds.x(); 4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *right_margin = *popup_width - location_bar_bounds.right(); 476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocationBarView::GetItemPadding() { 480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int kTouchItemPadding = 8; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ui::GetDisplayLayout() == ui::LAYOUT_TOUCH) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kTouchItemPadding; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int kDesktopScriptBadgeItemPadding = 9; 485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int kDesktopItemPadding = 3; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extensions::FeatureSwitch::script_badges()->IsEnabled() ? 487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kDesktopScriptBadgeItemPadding : kDesktopItemPadding; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DropdownBarHostDelegate 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SetFocusAndSelection(bool select_all) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusLocation(select_all); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SetAnimationOffset(int offset) { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) animation_offset_ = offset; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::Update(const WebContents* tab_for_state_restoring) { 5007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mic_search_view_->SetVisible( 5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !model_->GetInputInProgress() && browser_ && 5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser_->search_model()->voice_search_supported()); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshContentSettingViews(); 5044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch generated_credit_card_view_->Update(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZoomBubbleView::CloseBubble(); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshZoomView(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshPageActionViews(); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RefreshScriptBubble(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open_pdf_in_reader_view_->Update( 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->GetInputInProgress() ? NULL : GetWebContents()); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool star_enabled = 5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser_defaults::bookmarks_enabled && !is_popup_mode_ && star_view_ && 5147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !model_->GetInputInProgress() && edit_bookmarks_enabled_.GetValue(); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater_->UpdateCommandEnabled(IDC_BOOKMARK_PAGE, star_enabled); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater_->UpdateCommandEnabled(IDC_BOOKMARK_PAGE_FROM_STAR, 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) star_enabled); 519ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (star_view_) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) star_view_->SetVisible(star_enabled); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) location_entry_->Update(tab_for_state_restoring); 52390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnChanged(); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::UpdateContentSettingsIcons() { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshContentSettingViews(); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::UpdatePageActions() { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count_before = page_action_views_.size(); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshPageActionViews(); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RefreshScriptBubble(); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_action_views_.size() != count_before) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_COUNT_CHANGED, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<LocationBar>(this), 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::InvalidatePageActions() { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count_before = page_action_views_.size(); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeletePageActionViews(); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_action_views_.size() != count_before) { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_COUNT_CHANGED, 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<LocationBar>(this), 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::UpdateOpenPDFInReaderPrompt() { 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open_pdf_in_reader_view_->Update( 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->GetInputInProgress() ? NULL : GetWebContents()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid LocationBarView::UpdateGeneratedCreditCardView() { 5684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch generated_credit_card_view_->Update(); 5697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Layout(); 5707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SchedulePaint(); 5717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnFocus() { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Focus the view widget first which implements accessibility for 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Chrome OS. It is noop on Win. This should be removed once 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Chrome OS migrates to aura, which uses Views' textfield that receives 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focus. See crbug.com/106428. 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotifyAccessibilityEvent(ui::AccessibilityTypes::EVENT_FOCUS, false); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then focus the native location view which implements accessibility for 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows. 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_->SetFocus(); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SetPreviewEnabledPageAction(ExtensionAction* page_action, 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool preview_enabled) { 58790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_popup_mode_) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(page_action); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = delegate_->GetWebContents(); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshPageActionViews(); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageActionWithBadgeView* page_action_view = 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PageActionWithBadgeView*>(GetPageActionView(page_action)); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(page_action_view); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!page_action_view) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action_view->image_view()->set_preview_enabled(preview_enabled); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action_view->UpdateVisibility(contents, model_->GetURL()); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* LocationBarView::GetPageActionView(ExtensionAction *page_action) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(page_action); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PageActionViews::const_iterator i(page_action_views_.begin()); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != page_action_views_.end(); ++i) { 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->image_view()->page_action() == page_action) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *i; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SetStarToggled(bool on) { 617ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (star_view_) 618ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch star_view_->SetToggled(on); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::ShowBookmarkPrompt() { 622ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (star_view_ && star_view_->visible()) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkPromptView::ShowPrompt(star_view_, profile_->GetPrefs()); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::ZoomChangedForActiveTab(bool can_show_bubble) { 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(zoom_view_); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshZoomView(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (can_show_bubble && zoom_view_->visible() && delegate_->GetWebContents()) 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ZoomBubbleView::ShowBubble(delegate_->GetWebContents(), true); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::RefreshZoomView() { 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(zoom_view_); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = GetWebContents(); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZoomController* zoom_controller = 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ZoomController::FromWebContents(web_contents); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_view_->Update(zoom_controller); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point LocationBarView::GetLocationEntryOrigin() const { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point origin(location_entry_view_->bounds().origin()); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the UI layout is RTL, the coordinate system is not transformed and 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // therefore we need to adjust the X coordinate so that bubble appears on the 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // right hand side of the location bar. 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::i18n::IsRTL()) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin.set_x(width() - origin.x()); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::ConvertPointToScreen(this, &origin); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return origin; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void LocationBarView::SetImeInlineAutocompletion(const string16& text) { 660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->SetText(text); 661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->SetVisible(!text.empty()); 662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LocationBarView::SetGrayTextAutocompletion(const string16& text) { 66590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (suggested_text_view_->text() != text) { 66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_text_view_->SetText(text); 66790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_text_view_->SetVisible(!text.empty()); 66890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Layout(); 66990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SchedulePaint(); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstring16 LocationBarView::GetGrayTextAutocompletion() const { 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HasValidSuggestText() ? suggested_text_view_->text() : string16(); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SetLocationEntryFocusable(bool focusable) { 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxViewViews* omnibox_views = GetOmniboxViewViews(location_entry_.get()); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (omnibox_views) 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) omnibox_views->set_focusable(focusable); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_focusable(focusable); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::IsLocationEntryFocusableInRootView() const { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxViewViews* omnibox_views = GetOmniboxViewViews(location_entry_.get()); 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return omnibox_views ? omnibox_views->IsFocusable() : View::IsFocusable(); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size LocationBarView::GetPreferredSize() { 691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return background_border_painter_->GetMinimumSize(); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::Layout() { 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!location_entry_.get()) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selected_keyword_view_->SetVisible(false); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_icon_view_->SetVisible(false); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev_bubble_view_->SetVisible(false); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keyword_hint_view_->SetVisible(false); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int item_padding = GetItemPadding(); 704868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The native edit has 1 px of whitespace inside it before the text when the 705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // text is not scrolled off the leading edge. The views textfield has 1 px of 706868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // whitespace before the text in the RTL case only. 707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int kEditLeadingInternalSpace = 708868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) (base::i18n::IsRTL() || GetOmniboxViewWin(location_entry_.get())) ? 1 : 0; 709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LocationBarLayout leading_decorations( 710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LocationBarLayout::LEFT_EDGE, item_padding - kEditLeadingInternalSpace); 711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LocationBarLayout trailing_decorations(LocationBarLayout::RIGHT_EDGE, 712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_padding); 713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 keyword(location_entry_->model()->keyword()); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool is_keyword_hint(location_entry_->model()->is_keyword_hint()); 716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int bubble_location_y = vertical_edge_thickness() + kBubblePadding; 717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // In some cases (e.g. fullscreen mode) we may have 0 height. We still want 718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // to position our child views in this case, because other things may be 719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // positioned relative to them (e.g. the "bookmark added" bubble if the user 720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // hits ctrl-d). 721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int location_height = GetInternalHeight(false); 722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int bubble_height = std::max(location_height - (kBubblePadding * 2), 0); 7237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!keyword.empty() && !is_keyword_hint) { 724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) leading_decorations.AddDecoration(bubble_location_y, bubble_height, true, 0, 725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kBubblePadding, item_padding, 0, 726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) selected_keyword_view_); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_keyword_view_->keyword() != keyword) { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_keyword_view_->SetKeyword(keyword); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TemplateURL* template_url = 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLServiceFactory::GetForProfile(profile_)-> 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTemplateURLForKeyword(keyword); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (template_url && template_url->IsExtensionKeyword()) { 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Image image = extensions::OmniboxAPI::Get(profile_)-> 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetOmniboxIcon(template_url->GetExtensionId()); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_keyword_view_->SetImage(image.AsImageSkia()); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_keyword_view_->set_is_extension_icon(true); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_keyword_view_->SetImage( 739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *(GetThemeProvider()->GetImageSkiaNamed(IDR_OMNIBOX_SEARCH))); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_keyword_view_->set_is_extension_icon(false); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 743ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } else if (model_->GetSecurityLevel(false) == ToolbarModel::EV_SECURE) { 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ev_bubble_view_->SetLabel(model_->GetEVCertName()); 745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The largest fraction of the omnibox that can be taken by the EV bubble. 746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const double kMaxBubbleFraction = 0.5; 747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) leading_decorations.AddDecoration(bubble_location_y, bubble_height, false, 748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kMaxBubbleFraction, kBubblePadding, 749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_padding, 0, ev_bubble_view_); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 75190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) leading_decorations.AddDecoration( 75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) vertical_edge_thickness(), location_height, 7533d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch GetBuiltInHorizontalPaddingForChildViews(), 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) location_icon_view_); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (star_view_ && star_view_->visible()) { 75890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) trailing_decorations.AddDecoration( 75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) vertical_edge_thickness(), location_height, 7603d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch GetBuiltInHorizontalPaddingForChildViews(), star_view_); 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (script_bubble_icon_view_ && script_bubble_icon_view_->visible()) { 76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) trailing_decorations.AddDecoration( 76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) vertical_edge_thickness(), location_height, 7653d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch GetBuiltInHorizontalPaddingForChildViews(), 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) script_bubble_icon_view_); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (open_pdf_in_reader_view_ && open_pdf_in_reader_view_->visible()) { 76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) trailing_decorations.AddDecoration( 77090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) vertical_edge_thickness(), location_height, 7713d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch GetBuiltInHorizontalPaddingForChildViews(), 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_pdf_in_reader_view_); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PageActionViews::const_iterator i(page_action_views_.begin()); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != page_action_views_.end(); ++i) { 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->visible()) { 77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) trailing_decorations.AddDecoration( 77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) vertical_edge_thickness(), location_height, 7793d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch GetBuiltInHorizontalPaddingForChildViews(), (*i)); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (zoom_view_->visible()) { 78390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) trailing_decorations.AddDecoration(vertical_edge_thickness(), 78490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) location_height, 0, zoom_view_); 78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ContentSettingViews::const_reverse_iterator i( 787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content_setting_views_.rbegin()); i != content_setting_views_.rend(); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i) { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->visible()) { 79090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) trailing_decorations.AddDecoration( 791868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bubble_location_y, bubble_height, false, 0, item_padding, 7923d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch item_padding, GetBuiltInHorizontalPaddingForChildViews(), (*i)); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (generated_credit_card_view_->visible()) { 7967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch trailing_decorations.AddDecoration(vertical_edge_thickness(), 7977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch location_height, 0, 7984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch generated_credit_card_view_); 7997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 8007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (mic_search_view_->visible()) { 8017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch trailing_decorations.AddDecoration(vertical_edge_thickness(), 8027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch location_height, 0, mic_search_view_); 8037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 8047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Because IMEs may eat the tab key, we don't show "press tab to search" while 8057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // IME composition is in progress. 8067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!keyword.empty() && is_keyword_hint && 8077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) !location_entry_->IsImeComposing()) { 808868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) trailing_decorations.AddDecoration(vertical_edge_thickness(), 809868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) location_height, true, 0, item_padding, 810868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_padding, 0, keyword_hint_view_); 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (keyword_hint_view_->keyword() != keyword) 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keyword_hint_view_->SetKeyword(keyword); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Perform layout. 81690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int horizontal_edge_thickness = GetHorizontalEdgeThickness(); 81790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int full_width = width() - 2 * horizontal_edge_thickness; 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int entry_width = full_width; 81990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) leading_decorations.LayoutPass1(&entry_width); 82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) trailing_decorations.LayoutPass1(&entry_width); 82190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) leading_decorations.LayoutPass2(&entry_width); 82290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) trailing_decorations.LayoutPass2(&entry_width); 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int location_needed_width = location_entry_->TextWidth(); 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int available_width = entry_width - location_needed_width; 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The bounds must be wide enough for all the decorations to fit. 82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect location_bounds( 82890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) horizontal_edge_thickness, vertical_edge_thickness(), 82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::max(full_width, full_width - entry_width), location_height); 83090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) leading_decorations.LayoutPass3(&location_bounds, &available_width); 83190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) trailing_decorations.LayoutPass3(&location_bounds, &available_width); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Layout out the suggested text view right aligned to the location 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry. Only show the suggested text if we can fit the text from one 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // character before the end of the selection to the end of the text and the 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // suggested text. If we can't it means either the suggested text is too big, 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or the user has scrolled. 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sky): We could potentially adjust this to take into account suggested 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // text to force using minimum size if necessary, but currently the chance of 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // showing keyword hints and suggested text is minimal and we're not confident 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this is the right approach for suggested text. 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OmniboxViewViews* omnibox_views = 845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetOmniboxViewViews(location_entry_.get()); 846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int omnibox_views_margin = 0; 84790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (suggested_text_view_->visible()) { 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We do not display the suggested text when it contains a mix of RTL and 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LTR characters since this could mean the suggestion should be displayed 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in the middle of the string. 85190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::i18n::TextDirection text_direction = 85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::i18n::GetStringDirection(location_entry_->GetText()); 85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (text_direction != 85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::i18n::GetStringDirection(suggested_text_view_->text())) 85590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) text_direction = base::i18n::UNKNOWN_DIRECTION; 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sky): need to layout when the user changes caret position. 85890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size suggested_text_size(suggested_text_view_->GetPreferredSize()); 85990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (suggested_text_size.width() > available_width || 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) text_direction == base::i18n::UNKNOWN_DIRECTION) { 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hide the suggested text if the user has scrolled or we can't fit all 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the suggested text, or we have a mix of RTL and LTR characters. 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suggested_text_view_->SetBounds(0, 0, 0, 0); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) location_needed_width = 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::min(location_needed_width, 86790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) location_bounds.width() - suggested_text_size.width()); 86890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect suggested_text_bounds(location_bounds.origin(), 86990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_text_size); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sky): figure out why this needs the -1. 87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_text_bounds.Offset(location_needed_width - 1, 0); 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For non-views the omnibox needs to be shrunk so that the suggest text 873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is visible. 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!omnibox_views) 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) location_bounds.set_width(location_needed_width); 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We reverse the order of the location entry and suggested text if: 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - Chrome is RTL but the text is fully LTR, or 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - Chrome is LTR but the text is fully RTL. 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This ensures the suggested text is correctly displayed to the right 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (or left) of the user text. 88290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (text_direction == (base::i18n::IsRTL() ? 88390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::i18n::LEFT_TO_RIGHT : base::i18n::RIGHT_TO_LEFT)) { 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sky): Figure out why we need the +1. 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_text_bounds.set_x(location_bounds.x() + 1); 886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (omnibox_views) { 887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Use a margin to prevent the omnibox text from overlapping the 888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // suggest text. 889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) omnibox_views_margin = suggested_text_bounds.width(); 890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Non-views doesn't support margins so move the omnibox over. 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) location_bounds.set_x( 893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) location_bounds.x() + suggested_text_bounds.width()); 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_text_view_->SetBoundsRect(suggested_text_bounds); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (omnibox_views) 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) omnibox_views->SetHorizontalMargins(0, omnibox_views_margin); 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Layout |ime_inline_autocomplete_view_| next to the user input. 904868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ime_inline_autocomplete_view_->visible()) { 905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int width = 906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->font().GetStringWidth( 907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->text()) + 908868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->GetInsets().width(); 909868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // All the target languages (IMEs) are LTR, and we do not need to support 910868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // RTL so far. In other words, no testable RTL environment so far. 911868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int x = location_needed_width; 912868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (width > entry_width) 913868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) x = 0; 914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else if (location_needed_width + width > entry_width) 915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) x = entry_width - width; 916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) location_bounds.set_width(x); 917868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->SetBounds( 918868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) location_bounds.right(), location_bounds.y(), 919868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::min(width, entry_width), 920868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ime_inline_autocomplete_view_->GetPreferredSize().height()); 921868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 922868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_view_->SetBoundsRect(location_bounds); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnPaint(gfx::Canvas* canvas) { 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::OnPaint(canvas); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Fill the location bar background color behind the border. Parts of the 930868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // border images are meant to rest atop the toolbar background and parts atop 931868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // the omnibox background, so we can't just blindly fill our entire bounds. 93290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int horizontal_edge_thickness = GetHorizontalEdgeThickness(); 933868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!background_filling_painter_) { 934868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::Rect bounds(GetContentsBounds()); 935868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bounds.Inset(horizontal_edge_thickness, vertical_edge_thickness()); 936868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkColor color(GetColor(ToolbarModel::NONE, BACKGROUND)); 937868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (is_popup_mode_) { 938868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) canvas->FillRect(bounds, color); 939868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkPaint paint; 941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) paint.setStyle(SkPaint::kFill_Style); 942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) paint.setColor(color); 943868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int kBorderCornerRadius = 2; 944868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) canvas->DrawRoundRect(bounds, kBorderCornerRadius, paint); 94590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Maximized popup windows don't draw the horizontal edges. We implement this 949868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // by simply expanding the paint area outside the view by the edge thickness. 950868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::Rect background_rect(GetContentsBounds()); 951868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (is_popup_mode_ && (horizontal_edge_thickness == 0)) 952868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) background_rect.Inset(-kPopupEdgeThickness, 0); 953868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) views::Painter::PaintPainterAt(canvas, background_border_painter_.get(), 954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) background_rect); 955868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (background_filling_painter_) 956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) background_filling_painter_->Paint(canvas, size()); 957868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 958868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!is_popup_mode_) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintPageActionBackgrounds(canvas); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For non-InstantExtendedAPI cases, if necessary, show focus rect. 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: |Canvas::DrawFocusRect| paints a dashed rect with gray color. 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (show_focus_rect_ && HasFocus()) { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r = location_entry_view_->bounds(); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jamescook): Is this still needed? 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Inset(-1, 0); 96790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN) 96890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) r.Inset(0, -1); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->DrawFocusRect(r); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SetShowFocusRect(bool show) { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show_focus_rect_ = show; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SelectAll() { 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_->SelectAll(true); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::OnMousePressed(const ui::MouseEvent& event) { 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT msg; 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.IsLeftMouseButton()) { 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = (event.flags() & ui::EF_IS_DOUBLE_CLICK) ? 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WM_LBUTTONDBLCLK : WM_LBUTTONDOWN; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (event.IsMiddleMouseButton()) { 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = (event.flags() & ui::EF_IS_DOUBLE_CLICK) ? 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WM_MBUTTONDBLCLK : WM_MBUTTONDOWN; 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (event.IsRightMouseButton()) { 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = (event.flags() & ui::EF_IS_DOUBLE_CLICK) ? 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WM_RBUTTONDBLCLK : WM_RBUTTONDOWN; 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMouseEvent(event, msg); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::OnMouseDragged(const ui::MouseEvent& event) { 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMouseEvent(event, WM_MOUSEMOVE); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnMouseReleased(const ui::MouseEvent& event) { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT msg; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.IsLeftMouseButton()) { 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = WM_LBUTTONUP; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (event.IsMiddleMouseButton()) { 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = WM_MBUTTONUP; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (event.IsRightMouseButton()) { 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = WM_RBUTTONUP; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMouseEvent(event, msg); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnMouseCaptureLost() { 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxViewWin* omnibox_win = GetOmniboxViewWin(location_entry_.get()); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (omnibox_win) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) omnibox_win->HandleExternalMsg(WM_CAPTURECHANGED, 0, CPoint()); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochviews::View* LocationBarView::generated_credit_card_view() { 10314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return generated_credit_card_view_; 10327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 10337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnAutocompleteAccept( 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition transition, 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& alternate_nav_url) { 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WARNING: don't add an early return here. The calls after the if must 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happen. 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.is_valid()) { 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_input_ = UTF8ToUTF16(url.spec()); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition_ = disposition; 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_ = content::PageTransitionFromInt( 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition | content::PAGE_TRANSITION_FROM_ADDRESS_BAR); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_updater_) { 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!alternate_nav_url.is_valid()) { 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AlternateNavURLFetcher* fetcher = 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new AlternateNavURLFetcher(alternate_nav_url); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The AlternateNavURLFetcher will listen for the pending navigation 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification that will be issued as a result of the "open URL." It 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will automatically install itself into that navigation controller. 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fetcher->state() == AlternateNavURLFetcher::NOT_STARTED) { 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // I'm not sure this should be reachable, but I'm not also sure enough 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that it shouldn't to stick in a NOTREACHED(). In any case, this is 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // harmless. 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete fetcher; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The navigation controller will delete the fetcher. 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnChanged() { 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_icon_view_->SetImage( 1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetThemeProvider()->GetImageSkiaNamed(location_entry_->GetIcon())); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_icon_view_->ShowTooltip(!GetLocationEntry()->IsEditingOrEmpty()); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnSelectionBoundsChanged() { 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnInputInProgress(bool in_progress) { 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnInputInProgress(in_progress); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnKillFocus() { 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnSetFocus() { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::FocusManager* focus_manager = GetFocusManager(); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!focus_manager) { 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager->SetFocusedView(this); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Image LocationBarView::GetFavicon() const { 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FaviconTabHelper::FromWebContents( 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->GetWebContents())->GetFavicon(); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 LocationBarView::GetTitle() const { 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_->GetWebContents()->GetTitle(); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InstantController* LocationBarView::GetInstant() { 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->GetInstant(); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* LocationBarView::GetWebContents() const { 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_->GetWebContents(); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11153d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch// static 11163d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochint LocationBarView::GetBuiltInHorizontalPaddingForChildViews() { 11173d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch return (ui::GetDisplayLayout() == ui::LAYOUT_TOUCH) ? 11183d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch GetItemPadding() / 2 : 0; 11193d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch} 11203d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 112190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int LocationBarView::GetHorizontalEdgeThickness() const { 112290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // In maximized popup mode, there isn't any edge. 1123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return (is_popup_mode_ && browser_ && browser_->window() && 1124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser_->window()->IsMaximized()) ? 0 : vertical_edge_thickness(); 112590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::RefreshContentSettingViews() { 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ContentSettingViews::const_iterator i(content_setting_views_.begin()); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != content_setting_views_.end(); ++i) { 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*i)->Update(model_->GetInputInProgress() ? NULL : GetWebContents()); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::DeletePageActionViews() { 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PageActionViews::const_iterator i(page_action_views_.begin()); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != page_action_views_.end(); ++i) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveChildView(*i); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&page_action_views_); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::RefreshPageActionViews() { 114290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_popup_mode_) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remember the previous visibility of the page actions so that we can 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notify when this changes. 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ExtensionAction*, bool> old_visibility; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PageActionViews::const_iterator i(page_action_views_.begin()); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != page_action_views_.end(); ++i) { 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_visibility[(*i)->image_view()->page_action()] = (*i)->visible(); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ExtensionAction*> new_page_actions; 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = delegate_->GetWebContents(); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) { 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TabHelper* extensions_tab_helper = 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TabHelper::FromWebContents(contents); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::LocationBarController* controller = 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_tab_helper->location_bar_controller(); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_page_actions = controller->GetCurrentActions(); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On startup we sometimes haven't loaded any extensions. This makes sure 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we catch up when the extensions (and any page actions) load. 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_actions_ != new_page_actions) { 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_actions_.swap(new_page_actions); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeletePageActionViews(); // Delete the old views (if any). 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action_views_.resize(page_actions_.size()); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* right_anchor = open_pdf_in_reader_view_; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!right_anchor) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_anchor = star_view_; 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!right_anchor) 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) right_anchor = script_bubble_icon_view_; 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(right_anchor); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the page actions in reverse order, so that the child views are 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // inserted in left-to-right order for accessibility. 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = page_actions_.size() - 1; i >= 0; --i) { 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action_views_[i] = new PageActionWithBadgeView( 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->CreatePageActionImageView(this, page_actions_[i])); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action_views_[i]->SetVisible(false); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildViewAt(page_action_views_[i], GetIndexOf(right_anchor)); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!page_action_views_.empty() && contents) { 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents(contents); 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url = browser->tab_strip_model()->GetActiveWebContents()->GetURL(); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PageActionViews::const_iterator i(page_action_views_.begin()); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != page_action_views_.end(); ++i) { 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*i)->UpdateVisibility(model_->GetInputInProgress() ? NULL : contents, 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the visibility of the action changed and notify if it did. 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAction* action = (*i)->image_view()->page_action(); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_visibility.find(action) == old_visibility.end() || 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_visibility[action] != (*i)->visible()) { 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED, 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<ExtensionAction>(action), 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<WebContents>(contents)); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t LocationBarView::ScriptBubbleScriptsRunning() { 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = delegate_->GetWebContents(); 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!contents) 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::TabHelper* extensions_tab_helper = 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::TabHelper::FromWebContents(contents); 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extensions_tab_helper) 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ScriptBubbleController* script_bubble_controller = 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions_tab_helper->script_bubble_controller(); 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!script_bubble_controller) 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t script_count = 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) script_bubble_controller->extensions_running_scripts().size(); 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return script_count; 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocationBarView::RefreshScriptBubble() { 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!script_bubble_icon_view_) 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t script_count = ScriptBubbleScriptsRunning(); 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) script_bubble_icon_view_->SetVisible(script_count > 0); 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (script_count > 0) 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) script_bubble_icon_view_->SetScriptCount(script_count); 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnMouseEvent(const ui::MouseEvent& event, UINT msg) { 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxViewWin* omnibox_win = GetOmniboxViewWin(location_entry_.get()); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (omnibox_win) { 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT flags = event.native_event().wParam; 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_point(event.location()); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertPointToScreen(this, &screen_point); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) omnibox_win->HandleExternalMsg(msg, flags, screen_point.ToPOINT()); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::ShowFirstRunBubbleInternal() { 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS) 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First run bubble doesn't make sense for Chrome OS. 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser = GetBrowserFromDelegate(delegate_); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser) 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; // Possible when browser is shutting down. 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FirstRunBubble::ShowBubble(browser, location_icon_view_); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::PaintPageActionBackgrounds(gfx::Canvas* canvas) { 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = GetWebContents(); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // web_contents may be NULL while the browser is shutting down. 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int32 tab_id = SessionID::IdForTab(web_contents); 1266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const ToolbarModel::SecurityLevel security_level = 1267ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch model_->GetSecurityLevel(false); 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkColor text_color = GetColor(security_level, TEXT); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkColor background_color = GetColor(security_level, BACKGROUND); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PageActionViews::const_iterator 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action_view = page_action_views_.begin(); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action_view != page_action_views_.end(); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++page_action_view) { 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = (*page_action_view)->bounds(); 12763d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch int horizontal_padding = 12773d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch GetItemPadding() - GetBuiltInHorizontalPaddingForChildViews(); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the bounding rectangle include the whole vertical range of the 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // location bar, and the mid-point pixels between adjacent page actions. 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For odd horizontal_paddings, "horizontal_padding + 1" includes the 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mid-point between two page actions in the bounding rectangle. For even 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // paddings, the +1 is dropped, which is right since there is no pixel at 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the mid-point. 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.Inset(-(horizontal_padding + 1) / 2, 0); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_bar_util::PaintExtensionActionBackground( 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(*page_action_view)->image_view()->page_action(), 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_id, canvas, bounds, text_color, background_color); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1292b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* LocationBarView::GetClassName() const { 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kViewClassName; 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) { 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (views::FocusManager::IsTabTraversalKeyEvent(event)) { 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (location_entry_->model()->popup_model()->IsOpen()) { 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true so that the edit sees the tab and moves the selection. 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (keyword_hint_view_->visible() && !event.IsShiftDown()) { 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true so the edit gets the tab event and enters keyword mode. 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxViewWin* omnibox_win = GetOmniboxViewWin(location_entry_.get()); 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (omnibox_win) 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return omnibox_win->SkipDefaultKeyEventProcessing(event); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // USE_AURA 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_WIN 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method is not used for Linux ports. See FocusManager::OnKeyEvent() in 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // src/ui/views/focus/focus_manager.cc for details. 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::GetAccessibleState(ui::AccessibleViewState* state) { 13244c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) if (!location_entry_) 13254c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) return; 13264c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->role = ui::AccessibilityTypes::ROLE_LOCATION_BAR; 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_LOCATION); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->value = location_entry_->GetText(); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16::size_type entry_start; 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16::size_type entry_end; 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_->GetSelectionBounds(&entry_start, &entry_end); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->selection_start = entry_start; 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->selection_end = entry_end; 13364c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) 13374c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) if (is_popup_mode_) { 13384c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) state->state |= ui::AccessibilityTypes::STATE_READONLY; 13394c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) } else { 13404c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) state->set_value_callback = 13414c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) base::Bind(&LocationBarView::AccessibilitySetValue, 13424c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()); 13434c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) } 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::HasFocus() const { 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return location_entry_->model()->has_focus(); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocationBarView::OnBoundsChanged(const gfx::Rect& previous_bounds) { 1351a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (browser_ && browser_->instant_controller() && parent()) 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_->instant_controller()->SetOmniboxBounds(bounds()); 1353a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) OmniboxPopupView* popup = location_entry_->model()->popup_model()->view(); 1354a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (popup->IsOpen()) 1355a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) popup->UpdatePopupAppearance(); 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LocationBarView::ButtonPressed(views::Button* sender, 13597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const ui::Event& event) { 13607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_EQ(mic_search_view_, sender); 13617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command_updater_->ExecuteCommand(IDC_TOGGLE_SPEECH_INPUT); 13627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 13637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::WriteDragDataForView(views::View* sender, 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& press_pt, 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OSExchangeData* data) { 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(GetDragOperationsForView(sender, press_pt), 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DRAG_NONE); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = GetWebContents(); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconTabHelper* favicon_tab_helper = 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconTabHelper::FromWebContents(web_contents); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia favicon = favicon_tab_helper->GetFavicon().AsImageSkia(); 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_drag_utils::SetURLAndDragImage(web_contents->GetURL(), 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents->GetTitle(), 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon, 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data, 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sender->GetWidget()); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocationBarView::GetDragOperationsForView(views::View* sender, 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& p) { 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK((sender == location_icon_view_) || (sender == ev_bubble_view_)); 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = delegate_->GetWebContents(); 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (web_contents && web_contents->GetURL().is_valid() && 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetLocationEntry()->IsEditingOrEmpty()) ? 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_LINK) : 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DRAG_NONE; 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::CanStartDragForView(View* sender, 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& press_pt, 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& p) { 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LocationBarView, LocationBar implementation: 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::ShowFirstRunBubble() { 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait until search engines have loaded to show the first run bubble. 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLService* url_service = 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLServiceFactory::GetForProfile(profile_); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url_service->loaded()) { 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template_url_service_ = url_service; 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template_url_service_->AddObserver(this); 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template_url_service_->Load(); 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowFirstRunBubbleInternal(); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 LocationBarView::GetInputString() const { 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return location_input_; 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowOpenDisposition LocationBarView::GetWindowOpenDisposition() const { 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return disposition_; 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::PageTransition LocationBarView::GetPageTransition() const { 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return transition_; 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::AcceptInput() { 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_->model()->AcceptInput(CURRENT_TAB, false); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::FocusLocation(bool select_all) { 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_->SetFocus(); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (select_all) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_->SelectAll(true); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::FocusSearch() { 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_->SetFocus(); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_->SetForcedQuery(); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SaveStateToContents(WebContents* contents) { 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_->SaveStateToTab(contents); 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::Revert() { 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_entry_->RevertAll(); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const OmniboxView* LocationBarView::GetLocationEntry() const { 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return location_entry_.get(); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OmniboxView* LocationBarView::GetLocationEntry() { 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return location_entry_.get(); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocationBarTesting* LocationBarView::GetLocationBarForTesting() { 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocationBarView::PageActionCount() { 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_action_views_.size(); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocationBarView::PageActionVisibleCount() { 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = 0; 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < page_action_views_.size(); i++) { 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_action_views_[i]->visible()) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++result; 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionAction* LocationBarView::GetPageAction(size_t index) { 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < page_action_views_.size()) 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_action_views_[index]->image_view()->page_action(); 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionAction* LocationBarView::GetVisiblePageAction(size_t index) { 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t current = 0; 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < page_action_views_.size(); ++i) { 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_action_views_[i]->visible()) { 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current == index) 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_action_views_[i]->image_view()->page_action(); 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++current; 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::TestPageActionPressed(size_t index) { 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t current = 0; 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < page_action_views_.size(); ++i) { 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_action_views_[i]->visible()) { 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current == index) { 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action_views_[i]->image_view()->ExecuteAction( 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionPopup::SHOW); 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++current; 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::GetBookmarkStarVisibility() { 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(star_view_); 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return star_view_->visible(); 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::OnTemplateURLServiceChanged() { 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template_url_service_->RemoveObserver(this); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template_url_service_ = NULL; 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the browser is no longer active, let's not show the info bubble, as this 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // would make the browser the active window again. 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (location_entry_view_ && location_entry_view_->GetWidget()->IsActive()) 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowFirstRunBubble(); 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::Observe(int type, 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED: { 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only update if the updated action box was for the active tab contents. 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* target_tab = content::Details<WebContents>(details).ptr(); 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (target_tab == GetWebContents()) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdatePageActions(); 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unexpected notification."; 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LocationBarView::ModelChanged(const SearchModel::State& old_state, 15447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const SearchModel::State& new_state) { 15457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool visible = 15467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !model_->GetInputInProgress() && new_state.voice_search_supported; 15477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (mic_search_view_->visible() != visible) { 15487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mic_search_view_->SetVisible(visible); 15497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Layout(); 15507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 15517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 15527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocationBarView::GetInternalHeight(bool use_preferred_size) { 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int total_height = 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_preferred_size ? GetPreferredSize().height() : height(); 155690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return std::max(total_height - (vertical_edge_thickness() * 2), 0); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::HasValidSuggestText() const { 156090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return suggested_text_view_->visible() && 156190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) !suggested_text_view_->size().IsEmpty(); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15634c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) 15644c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles)void LocationBarView::AccessibilitySetValue(const string16& new_value) { 15654c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles) location_entry_->SetUserText(new_value); 15664c5337722b0050dc1a8f04eaa6e8dcdb69c14334Torne (Richard Coles)} 1567