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