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"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/location_bar_controller.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h"
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/search/instant_service.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/search/instant_service_factory.h"
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/search/search.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/translate/chrome_translate_client.h"
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/translate/translate_service.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_instant_controller.h"
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/location_bar_util.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_model.h"
39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_view.h"
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/passwords/manage_passwords_icon.h"
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/view_ids.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/browser_dialogs.h"
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/add_to_app_launcher_view.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/content_setting_image_view.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/ev_bubble_view.h"
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/views/location_bar/generated_credit_card_view.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/keyword_hint_view.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_layout.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_icon_view.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/open_pdf_in_reader_view.h"
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/origin_chip_view.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/page_action_image_view.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/page_action_with_badge_view.h"
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/search_button.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/selected_keyword_view.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/star_view.h"
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/translate_icon_view.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/zoom_bubble_view.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/zoom_view.h"
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/passwords/manage_passwords_bubble_view.h"
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/passwords/manage_passwords_icon_view.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/zoom/zoom_controller.h"
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/translate/core/browser/language_state.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/theme_provider.h"
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gfx/animation/slide_animation.h"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/color_utils.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h"
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/gfx/scoped_canvas.h"
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h"
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/text_utils.h"
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ui/native_theme/native_theme.h"
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/background.h"
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/border.h"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/button_drag_utils.h"
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/views/controls/button/image_button.h"
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/first_run_bubble.h"
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::View;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const gfx::Tween::Type kShowTweenType = gfx::Tween::LINEAR_OUT_SLOW_IN;
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const gfx::Tween::Type kHideTweenType = gfx::Tween::FAST_OUT_LINEAR_IN;
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The search button images are made to look as if they overlay the normal edge
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// images, but to align things, the search button needs to be inset horizontally
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// by 1 px.
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kSearchButtonInset = 1;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Given a containing |height| and a |base_font_list|, shrinks the font size
1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// until the font list will fit within |height| while having its cap height
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// vertically centered.  Returns the correctly-sized font list.
1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//
1190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// The expected layout:
1200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   +--------+-----------------------------------------------+------------+
1210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   |        | y offset                                      | space      |
1220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   |        +--------+-------------------+------------------+ above      |
1230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   |        |        |                   | internal leading | cap height |
1240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   | box    | font   | ascent (baseline) +------------------+------------+
1250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   | height | height |                   | cap height                    |
1260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   |        |        |-------------------+------------------+------------+
1270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   |        |        | descent (height - baseline)          | space      |
1280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   |        +--------+--------------------------------------+ below      |
1290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   |        | space at bottom                               | cap height |
1300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//   +--------+-----------------------------------------------+------------+
1310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Goal:
1320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//     center of box height == center of cap height
1330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//     (i.e. space above cap height == space below cap height)
1340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Restrictions:
1350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//     y offset >= 0
1360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//     space at bottom >= 0
1370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//     (i.e. Entire font must be visible inside the box.)
1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)gfx::FontList GetLargestFontListWithHeightBound(
1390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const gfx::FontList& base_font_list,
1400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    int height) {
1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::FontList font_list = base_font_list;
1420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  for (int font_size = font_list.GetFontSize(); font_size > 1; --font_size) {
1430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const int internal_leading =
1440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        font_list.GetBaseline() - font_list.GetCapHeight();
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Some platforms don't support getting the cap height, and simply return
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // the entire font ascent from GetCapHeight().  Centering the ascent makes
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // the font look too low, so if GetCapHeight() returns the ascent, center
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // the entire font height instead.
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const int space =
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        height - ((internal_leading != 0) ?
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                  font_list.GetCapHeight() : font_list.GetHeight());
1520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const int y_offset = space / 2 - internal_leading;
1530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const int space_at_bottom = height - (y_offset + font_list.GetHeight());
1540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if ((y_offset >= 0) && (space_at_bottom >= 0))
1550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      break;
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    font_list = font_list.DeriveWithSizeDelta(-1);
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return font_list;
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int GetEditLeadingInternalSpace() {
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The textfield has 1 px of whitespace before the text in the RTL case only.
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return base::i18n::IsRTL() ? 1 : 0;
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Functor for moving BookmarkManagerPrivate page actions to the right via
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// stable_partition.
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class IsPageActionViewRightAligned {
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit IsPageActionViewRightAligned(ExtensionService* extension_service)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : extension_service_(extension_service) {}
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool operator()(PageActionWithBadgeView* page_action_view) {
17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return extension_service_
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ->GetExtensionById(
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              page_action_view->image_view()->page_action()->extension_id(),
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              false)
17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ->permissions_data()
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ->HasAPIPermission(extensions::APIPermission::kBookmarkManagerPrivate);
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionService* extension_service_;
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NOTE: Can't DISALLOW_COPY_AND_ASSIGN as we pass this object by value to
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // std::stable_partition().
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// LocationBarView -----------------------------------------------------------
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int LocationBarView::kNormalEdgeThickness = 2;
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int LocationBarView::kPopupEdgeThickness = 1;
1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst int LocationBarView::kItemPadding = 3;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int LocationBarView::kIconInternalPadding = 2;
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int LocationBarView::kBubblePadding = 1;
200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char LocationBarView::kViewClassName[] = "LocationBarView";
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocationBarView::LocationBarView(Browser* browser,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Profile* profile,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 CommandUpdater* command_updater,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Delegate* delegate,
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 bool is_popup_mode)
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : LocationBar(profile),
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OmniboxEditController(command_updater),
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      browser_(browser),
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      omnibox_view_(NULL),
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(delegate),
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      origin_chip_view_(NULL),
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_icon_view_(NULL),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ev_bubble_view_(NULL),
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ime_inline_autocomplete_view_(NULL),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_keyword_view_(NULL),
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      suggested_text_view_(NULL),
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyword_hint_view_(NULL),
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      mic_search_view_(NULL),
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zoom_view_(NULL),
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      generated_credit_card_view_(NULL),
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      open_pdf_in_reader_view_(NULL),
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      manage_passwords_icon_view_(NULL),
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      translate_icon_view_(NULL),
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      add_to_app_launcher_view_(NULL),
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      star_view_(NULL),
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      search_button_(NULL),
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_popup_mode_(is_popup_mode),
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show_focus_rect_(false),
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      template_url_service_(NULL),
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      dropdown_animation_offset_(0),
23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      starting_omnibox_offset_(0),
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      current_omnibox_offset_(0),
23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      starting_omnibox_leading_inset_(0),
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      current_omnibox_leading_inset_(0),
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      current_omnibox_width_(0),
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ending_omnibox_width_(0),
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      weak_ptr_factory_(this) {
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  edit_bookmarks_enabled_.Init(
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prefs::kEditBookmarksEnabled, profile->GetPrefs(),
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&LocationBarView::Update, base::Unretained(this),
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 static_cast<content::WebContents*>(NULL)));
2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (browser_)
2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    browser_->search_model()->AddObserver(this);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocationBarView::~LocationBarView() {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (template_url_service_)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    template_url_service_->RemoveObserver(this);
2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (browser_)
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    browser_->search_model()->RemoveObserver(this);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, public:
257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::Init() {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to be in a Widget, otherwise GetNativeTheme() may change and we're
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not prepared for that.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(GetWidget());
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int kOmniboxPopupBorderImages[] =
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IMAGE_GRID(IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW);
265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int kOmniboxBorderImages[] = IMAGE_GRID(IDR_TEXTFIELD);
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  border_painter_.reset(views::Painter::CreateImageGridPainter(
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_popup_mode_ ? kOmniboxPopupBorderImages : kOmniboxBorderImages));
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_icon_view_ = new LocationIconView(this);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_icon_view_->set_drag_controller(this);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(location_icon_view_);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Determine the main font.
274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  gfx::FontList font_list = ResourceBundle::GetSharedInstance().GetFontList(
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      ResourceBundle::BaseFont);
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const int current_font_size = font_list.GetFontSize();
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int desired_font_size = browser_defaults::kOmniboxFontPixelSize;
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (current_font_size != desired_font_size) {
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    font_list =
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        font_list.DeriveWithSizeDelta(desired_font_size - current_font_size);
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Shrink large fonts to make them fit.
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // TODO(pkasting): Stretch the location bar instead in this case.
2840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const int location_height = GetInternalHeight(true);
2850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  font_list = GetLargestFontListWithHeightBound(font_list, location_height);
2860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Determine the font for use inside the bubbles.  The bubble background
2880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // images have 1 px thick edges, which we don't want to overlap.
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int kBubbleInteriorVerticalPadding = 1;
2900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const int bubble_vertical_padding =
2910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      (kBubblePadding + kBubbleInteriorVerticalPadding) * 2;
2920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const gfx::FontList bubble_font_list(
2930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      GetLargestFontListWithHeightBound(
2940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          font_list, location_height - bubble_vertical_padding));
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const SkColor background_color =
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetColor(ToolbarModel::NONE, LocationBarView::BACKGROUND);
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev_bubble_view_ = new EVBubbleView(
2990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      bubble_font_list, GetColor(ToolbarModel::EV_SECURE, SECURITY_TEXT),
3000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      background_color, this);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ev_bubble_view_->set_drag_controller(this);
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(ev_bubble_view_);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initialize the Omnibox view.
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  omnibox_view_ = new OmniboxViewViews(
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this, profile(), command_updater(),
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_popup_mode_ ||
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          (browser_->is_app() && CommandLine::ForCurrentProcess()->
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              HasSwitch(switches::kEnableStreamlinedHostedApps)),
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this, font_list);
311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  omnibox_view_->Init();
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  omnibox_view_->SetFocusable(true);
313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AddChildView(omnibox_view_);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initialize the inline autocomplete view which is visible only when IME is
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // turned on.  Use the same font with the omnibox and highlighted background.
317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ime_inline_autocomplete_view_ = new views::Label(base::string16(), font_list);
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetAutoColorReadabilityEnabled(false);
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->set_background(
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      views::Background::CreateSolidBackground(GetNativeTheme()->GetSystemColor(
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused)));
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetEnabledColor(
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetNativeTheme()->GetSystemColor(
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldSelectionColor));
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetVisible(false);
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddChildView(ime_inline_autocomplete_view_);
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  origin_chip_view_ = new OriginChipView(this, profile(), font_list);
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  origin_chip_view_->SetFocusable(false);
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  origin_chip_view_->set_drag_controller(this);
332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AddChildView(origin_chip_view_);
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SkColor text_color = GetColor(ToolbarModel::NONE, TEXT);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_keyword_view_ = new SelectedKeywordView(
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bubble_font_list, text_color, background_color, profile());
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(selected_keyword_view_);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  suggested_text_view_ = new views::Label(base::string16(), font_list);
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  suggested_text_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  suggested_text_view_->SetAutoColorReadabilityEnabled(false);
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  suggested_text_view_->SetEnabledColor(GetColor(
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ToolbarModel::NONE, LocationBarView::DEEMPHASIZED_TEXT));
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  suggested_text_view_->SetVisible(false);
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddChildView(suggested_text_view_);
34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  keyword_hint_view_ = new KeywordHintView(
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profile(), font_list,
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetColor(ToolbarModel::NONE, LocationBarView::DEEMPHASIZED_TEXT),
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      background_color);
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(keyword_hint_view_);
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  mic_search_view_ = new views::ImageButton(this);
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  mic_search_view_->set_id(VIEW_ID_MIC_SEARCH_BUTTON);
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  mic_search_view_->SetAccessibilityFocusable(true);
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  mic_search_view_->SetTooltipText(
357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      l10n_util::GetStringUTF16(IDS_TOOLTIP_MIC_SEARCH));
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  mic_search_view_->SetImage(
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      views::Button::STATE_NORMAL,
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          IDR_OMNIBOX_MIC_SEARCH));
362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  mic_search_view_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                      views::ImageButton::ALIGN_MIDDLE);
3647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  mic_search_view_->SetVisible(false);
3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  AddChildView(mic_search_view_);
3667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingImageView* content_blocked_view =
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new ContentSettingImageView(static_cast<ContentSettingsType>(i), this,
3700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                    bubble_font_list, text_color,
3710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                    background_color);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_setting_views_.push_back(content_blocked_view);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_blocked_view->SetVisible(false);
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddChildView(content_blocked_view);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  generated_credit_card_view_ = new GeneratedCreditCardView(delegate_);
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AddChildView(generated_credit_card_view_);
3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  zoom_view_ = new ZoomView(delegate_);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zoom_view_->set_id(VIEW_ID_ZOOM_BUTTON);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(zoom_view_);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  open_pdf_in_reader_view_ = new OpenPDFInReaderView();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(open_pdf_in_reader_view_);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  manage_passwords_icon_view_ = new ManagePasswordsIconView(command_updater());
388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AddChildView(manage_passwords_icon_view_);
389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  translate_icon_view_ = new TranslateIconView(command_updater());
391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  translate_icon_view_->SetVisible(false);
392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AddChildView(translate_icon_view_);
393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
394f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  add_to_app_launcher_view_ = new AddToAppLauncherView(
395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this, bubble_font_list, text_color, background_color);
396f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  add_to_app_launcher_view_->SetVisible(false);
397f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AddChildView(add_to_app_launcher_view_);
398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  star_view_ = new StarView(command_updater());
4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  star_view_->SetVisible(false);
4017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  AddChildView(star_view_);
4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  search_button_ = new SearchButton(this);
404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  search_button_->SetVisible(false);
405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddChildView(search_button_);
406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  show_url_animation_.reset(new gfx::SlideAnimation(this));
40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  show_url_animation_->SetTweenType(kShowTweenType);
409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  show_url_animation_->SetSlideDuration(200);
410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  hide_url_animation_.reset(new gfx::SlideAnimation(this));
41246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  hide_url_animation_->SetTweenType(kHideTweenType);
41346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  hide_url_animation_->SetSlideDuration(175);
414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::Source<Profile> profile_source = content::Source<Profile>(profile());
4160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  registrar_.Add(
4170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      this, chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, profile_source);
41823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  registrar_.Add(this,
41923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED,
42023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 profile_source);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the location entry. We do this to avoid a black flash which is
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // visible when the location entry has just been initialized.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Update(NULL);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::IsInitialized() const {
428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return omnibox_view_ != NULL;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor LocationBarView::GetColor(ToolbarModel::SecurityLevel security_level,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ColorKind kind) const {
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::NativeTheme* native_theme = GetNativeTheme();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (kind) {
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BACKGROUND:
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return native_theme->GetSystemColor(
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldDefaultBackground);
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case TEXT:
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return native_theme->GetSystemColor(
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldDefaultColor);
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SELECTED_TEXT:
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return native_theme->GetSystemColor(
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldSelectionColor);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DEEMPHASIZED_TEXT:
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return color_utils::AlphaBlend(
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetColor(security_level, TEXT),
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetColor(security_level, BACKGROUND),
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          128);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SECURITY_TEXT: {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColor color;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (security_level) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ToolbarModel::EV_SECURE:
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ToolbarModel::SECURE:
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color = SkColorSetRGB(7, 149, 0);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ToolbarModel::SECURITY_WARNING:
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        case ToolbarModel::SECURITY_POLICY_WARNING:
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return GetColor(security_level, DEEMPHASIZED_TEXT);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ToolbarModel::SECURITY_ERROR:
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color = SkColorSetRGB(162, 0, 0);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return GetColor(security_level, TEXT);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return color_utils::GetReadableColor(
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color, GetColor(security_level, BACKGROUND));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GetColor(security_level, TEXT);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::ZoomChangedForActiveTab(bool can_show_bubble) {
485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(zoom_view_);
486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (RefreshZoomView()) {
487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Layout();
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SchedulePaint();
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebContents* web_contents = GetWebContents();
4925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (can_show_bubble && zoom_view_->visible() && web_contents)
4935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ZoomBubbleView::ShowBubble(web_contents, true);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SetPreviewEnabledPageAction(ExtensionAction* page_action,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  bool preview_enabled) {
49890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_popup_mode_)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(page_action);
5025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebContents* web_contents = GetWebContents();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshPageActionViews();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PageActionWithBadgeView* page_action_view =
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<PageActionWithBadgeView*>(GetPageActionView(page_action));
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(page_action_view);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!page_action_view)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  page_action_view->image_view()->set_preview_enabled(preview_enabled);
5125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  page_action_view->UpdateVisibility(web_contents, GetToolbarModel()->GetURL());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Layout();
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SchedulePaint();
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)PageActionWithBadgeView* LocationBarView::GetPageActionView(
518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ExtensionAction* page_action) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(page_action);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (PageActionViews::const_iterator i(page_action_views_.begin());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != page_action_views_.end(); ++i) {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*i)->image_view()->page_action() == page_action)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return *i;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SetStarToggled(bool on) {
529ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (star_view_)
530ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    star_view_->SetToggled(on);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LocationBarView::SetTranslateIconToggled(bool on) {
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  translate_icon_view_->SetToggled(on);
535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Point LocationBarView::GetOmniboxViewOrigin() const {
538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Point origin(omnibox_view_->bounds().origin());
53946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  origin.set_x(GetMirroredXInView(origin.x() - current_omnibox_offset_));
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View::ConvertPointToScreen(this, &origin);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return origin;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LocationBarView::SetImeInlineAutocompletion(const base::string16& text) {
545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetText(text);
546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetVisible(!text.empty());
547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LocationBarView::SetGrayTextAutocompletion(const base::string16& text) {
55090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (suggested_text_view_->text() != text) {
55190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    suggested_text_view_->SetText(text);
55290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    suggested_text_view_->SetVisible(!text.empty());
55390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    Layout();
55490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SchedulePaint();
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 LocationBarView::GetGrayTextAutocompletion() const {
55946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return HasValidSuggestText() ?
56046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      suggested_text_view_->text() : base::string16();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
563c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::SetShowFocusRect(bool show) {
564c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  show_focus_rect_ = show;
565c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SchedulePaint();
566c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
567c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
568c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::SelectAll() {
569c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->SelectAll(true);
570c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
572c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochgfx::Point LocationBarView::GetLocationBarAnchorPoint() const {
573c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The +1 in the next line creates a 1-px gap between icon and arrow tip.
574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Point icon_bottom(0, location_icon_view_->GetImageBounds().bottom() -
575c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      LocationBarView::kIconInternalPadding + 1);
576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Point icon_center(location_icon_view_->GetImageBounds().CenterPoint());
577c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::Point point(icon_center.x(), icon_bottom.y());
578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ConvertPointToTarget(location_icon_view_, this, &point);
579c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return point;
580c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
581c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
582c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochviews::View* LocationBarView::generated_credit_card_view() {
583c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return generated_credit_card_view_;
584c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
585c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
586c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint LocationBarView::GetInternalHeight(bool use_preferred_size) {
587c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int total_height =
588c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      use_preferred_size ? GetPreferredSize().height() : height();
589c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return std::max(total_height - (vertical_edge_thickness() * 2), 0);
590c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
591c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
592c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::GetOmniboxPopupPositioningInfo(
593c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    gfx::Point* top_left_screen_coord,
594c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int* popup_width,
595c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int* left_margin,
596c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int* right_margin) {
597c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Because the popup might appear atop the attached bookmark bar, there won't
598c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // necessarily be a client edge separating it from the rest of the toolbar.
599c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Therefore we position the popup high enough so it can draw its own client
600c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // edge at the top, in the same place the toolbar would normally draw the
601c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // client edge.
602c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  *top_left_screen_coord = gfx::Point(
603c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0,
604c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      parent()->height() - views::NonClientFrameView::kClientEdgeThickness);
605c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::View::ConvertPointToScreen(parent(), top_left_screen_coord);
606c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  *popup_width = parent()->width();
607c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
608c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::Rect location_bar_bounds(bounds());
609c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  location_bar_bounds.Inset(kNormalEdgeThickness, 0);
610c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  *left_margin = location_bar_bounds.x();
611c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  *right_margin = *popup_width - location_bar_bounds.right();
612c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
613c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
614c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
615c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, public LocationBar implementation:
616c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
617c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::FocusLocation(bool select_all) {
618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->SetFocus();
619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (select_all)
620c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    omnibox_view_->SelectAll(true);
621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
623c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::Revert() {
624c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->RevertAll();
625c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
626c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
627c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochOmniboxView* LocationBarView::GetOmniboxView() {
628c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return omnibox_view_;
629c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
630c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
631c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
632c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, public views::View implementation:
633c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
634c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::HasFocus() const {
635c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return omnibox_view_->model()->has_focus();
636c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
637c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
638c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::GetAccessibleState(ui::AXViewState* state) {
639c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!IsInitialized())
640c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
641c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
642c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  state->role = ui::AX_ROLE_LOCATION_BAR;
643c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_LOCATION);
644c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  state->value = omnibox_view_->GetText();
645c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
646c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::string16::size_type entry_start;
647c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::string16::size_type entry_end;
648c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->GetSelectionBounds(&entry_start, &entry_end);
649c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  state->selection_start = entry_start;
650c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  state->selection_end = entry_end;
651c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
652c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (is_popup_mode_) {
653c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    state->AddStateFlag(ui::AX_STATE_READ_ONLY);
654c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else {
655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    state->set_value_callback =
656c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::Bind(&LocationBarView::AccessibilitySetValue,
657c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   weak_ptr_factory_.GetWeakPtr());
658c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
659c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
660c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size LocationBarView::GetPreferredSize() const {
662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Compute minimum height.
663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Size min_size(border_painter_->GetMinimumSize());
664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!IsInitialized())
665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return min_size;
666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Size search_button_min_size(search_button_->GetMinimumSize());
667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  min_size.SetToMax(search_button_min_size);
668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Compute width of omnibox-leading content.
670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int horizontal_edge_thickness = GetHorizontalEdgeThickness();
671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int leading_width = horizontal_edge_thickness;
672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(pkasting): Make the origin chip min width sane, and make the chip
673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // handle being shrunken down more gracefully; then uncomment this.
674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /*if (GetToolbarModel()->ShouldShowOriginChip())
675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    leading_width += origin_chip_view_->GetMinimumSize().width();*/
676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (ShouldShowKeywordBubble()) {
677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // The selected keyword view can collapse completely.
678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (ShouldShowEVBubble()) {
679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    leading_width += kBubblePadding +
680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ev_bubble_view_->GetMinimumSizeForLabelText(
681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            GetToolbarModel()->GetEVCertName()).width();
682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (!origin_chip_view_->visible()) {
683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    leading_width +=
684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        kItemPadding + location_icon_view_->GetMinimumSize().width();
685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  leading_width += kItemPadding - GetEditLeadingInternalSpace();
687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Compute width of omnibox-trailing content.
689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int trailing_width = search_button_->visible() ?
690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (search_button_->GetMinimumSize().width() + kSearchButtonInset) :
691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      horizontal_edge_thickness;
692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  trailing_width += IncrementalMinimumWidth(star_view_) +
693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IncrementalMinimumWidth(translate_icon_view_) +
694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IncrementalMinimumWidth(open_pdf_in_reader_view_) +
695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IncrementalMinimumWidth(manage_passwords_icon_view_) +
696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IncrementalMinimumWidth(zoom_view_) +
697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IncrementalMinimumWidth(generated_credit_card_view_) +
698f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      IncrementalMinimumWidth(mic_search_view_) +
699f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      IncrementalMinimumWidth(add_to_app_launcher_view_) + kItemPadding;
700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (PageActionViews::const_iterator i(page_action_views_.begin());
701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       i != page_action_views_.end(); ++i)
702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    trailing_width += IncrementalMinimumWidth((*i));
703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       i != content_setting_views_.end(); ++i)
705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    trailing_width += IncrementalMinimumWidth((*i));
706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  min_size.set_width(
708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      leading_width + omnibox_view_->GetMinimumSize().width() + trailing_width);
709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return min_size;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::Layout() {
713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!IsInitialized())
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  origin_chip_view_->SetVisible(GetToolbarModel()->ShouldShowOriginChip());
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selected_keyword_view_->SetVisible(false);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_icon_view_->SetVisible(false);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ev_bubble_view_->SetVisible(false);
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  keyword_hint_view_->SetVisible(false);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LocationBarLayout leading_decorations(
723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      LocationBarLayout::LEFT_EDGE,
724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kItemPadding - GetEditLeadingInternalSpace());
725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LocationBarLayout trailing_decorations(LocationBarLayout::RIGHT_EDGE,
7265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         kItemPadding);
727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
72846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int origin_chip_preferred_width =
72946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      origin_chip_view_->GetPreferredSize().width();
73046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int origin_chip_width =
73146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      origin_chip_view_->visible() ? origin_chip_preferred_width : 0;
73246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Always give the origin chip view its desired size and lay it out, even when
73346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // it's not visible, so we can calculate the correct animation values below
73446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // when switching to tabs that have the origin chip hidden.
73546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  origin_chip_view_->SetBounds(0, 0, origin_chip_preferred_width, height());
73646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  origin_chip_view_->Layout();
737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int bubble_location_y = vertical_edge_thickness() + kBubblePadding;
739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::string16 keyword(omnibox_view_->model()->keyword());
740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // In some cases (e.g. fullscreen mode) we may have 0 height.  We still want
741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // to position our child views in this case, because other things may be
742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // positioned relative to them (e.g. the "bookmark added" bubble if the user
743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // hits ctrl-d).
744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int location_height = GetInternalHeight(false);
745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int bubble_height = std::max(location_height - (kBubblePadding * 2), 0);
746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (ShouldShowKeywordBubble()) {
747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    leading_decorations.AddDecoration(bubble_location_y, bubble_height, true, 0,
7485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      kBubblePadding, kItemPadding,
749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      selected_keyword_view_);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (selected_keyword_view_->keyword() != keyword) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_keyword_view_->SetKeyword(keyword);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const TemplateURL* template_url =
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          TemplateURLServiceFactory::GetForProfile(profile())->
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetTemplateURLForKeyword(keyword);
7551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (template_url &&
7561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          (template_url->GetType() == TemplateURL::OMNIBOX_API_EXTENSION)) {
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gfx::Image image = extensions::OmniboxAPI::Get(profile())->
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetOmniboxIcon(template_url->GetExtensionId());
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selected_keyword_view_->SetImage(image.AsImageSkia());
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selected_keyword_view_->set_is_extension_icon(true);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selected_keyword_view_->SetImage(
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            *(GetThemeProvider()->GetImageSkiaNamed(IDR_OMNIBOX_SEARCH)));
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selected_keyword_view_->set_is_extension_icon(false);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (ShouldShowEVBubble()) {
7683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ev_bubble_view_->SetLabel(GetToolbarModel()->GetEVCertName());
769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // The largest fraction of the omnibox that can be taken by the EV bubble.
770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const double kMaxBubbleFraction = 0.5;
771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    leading_decorations.AddDecoration(bubble_location_y, bubble_height, false,
772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      kMaxBubbleFraction, kBubblePadding,
7735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      kItemPadding, ev_bubble_view_);
774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else if (!origin_chip_view_->visible()) {
77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    leading_decorations.AddDecoration(
77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        vertical_edge_thickness(), location_height,
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        location_icon_view_);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (star_view_->visible()) {
78190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    trailing_decorations.AddDecoration(
7825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        vertical_edge_thickness(), location_height, star_view_);
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
784f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (add_to_app_launcher_view_->visible()) {
785f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    trailing_decorations.AddDecoration(
786f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        vertical_edge_thickness(), location_height, add_to_app_launcher_view_);
787f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (translate_icon_view_->visible()) {
7891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    trailing_decorations.AddDecoration(
7905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        vertical_edge_thickness(), location_height, translate_icon_view_);
7911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (open_pdf_in_reader_view_->visible()) {
79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    trailing_decorations.AddDecoration(
7945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        vertical_edge_thickness(), location_height, open_pdf_in_reader_view_);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (manage_passwords_icon_view_->visible()) {
797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    trailing_decorations.AddDecoration(vertical_edge_thickness(),
7985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       location_height,
799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       manage_passwords_icon_view_);
800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (PageActionViews::const_iterator i(page_action_views_.begin());
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != page_action_views_.end(); ++i) {
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*i)->visible()) {
80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      trailing_decorations.AddDecoration(
8055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          vertical_edge_thickness(), location_height, (*i));
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (zoom_view_->visible()) {
80990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    trailing_decorations.AddDecoration(vertical_edge_thickness(),
8105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       location_height, zoom_view_);
81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
812868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (ContentSettingViews::const_reverse_iterator i(
813868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)           content_setting_views_.rbegin()); i != content_setting_views_.rend();
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++i) {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*i)->visible()) {
81690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      trailing_decorations.AddDecoration(
8175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          bubble_location_y, bubble_height, false, 0, kItemPadding,
8185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          kItemPadding, (*i));
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
821ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (generated_credit_card_view_->visible()) {
8227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    trailing_decorations.AddDecoration(vertical_edge_thickness(),
8235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       location_height,
824ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                       generated_credit_card_view_);
8257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
8267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (mic_search_view_->visible()) {
8277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    trailing_decorations.AddDecoration(vertical_edge_thickness(),
8285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       location_height, mic_search_view_);
8297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
8307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Because IMEs may eat the tab key, we don't show "press tab to search" while
8317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // IME composition is in progress.
832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!keyword.empty() && omnibox_view_->model()->is_keyword_hint() &&
833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      !omnibox_view_->IsImeComposing()) {
834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    trailing_decorations.AddDecoration(vertical_edge_thickness(),
8355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       location_height, true, 0, kItemPadding,
8365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       kItemPadding, keyword_hint_view_);
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (keyword_hint_view_->keyword() != keyword)
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      keyword_hint_view_->SetKeyword(keyword);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Perform layout.
84290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int horizontal_edge_thickness = GetHorizontalEdgeThickness();
843a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int full_width = width() - horizontal_edge_thickness - origin_chip_width;
844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
845a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const gfx::Size search_button_size(search_button_->GetPreferredSize());
846a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const int search_button_reserved_width =
847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      search_button_size.width() + kSearchButtonInset;
848a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  full_width -= search_button_->visible() ?
849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      search_button_reserved_width : horizontal_edge_thickness;
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int entry_width = full_width;
85190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  leading_decorations.LayoutPass1(&entry_width);
85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  trailing_decorations.LayoutPass1(&entry_width);
85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  leading_decorations.LayoutPass2(&entry_width);
85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  trailing_decorations.LayoutPass2(&entry_width);
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int location_needed_width = omnibox_view_->GetTextWidth();
857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int available_width = entry_width - location_needed_width;
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The bounds must be wide enough for all the decorations to fit.
85990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect location_bounds(
860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      origin_chip_width + horizontal_edge_thickness, vertical_edge_thickness(),
86190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      std::max(full_width, full_width - entry_width), location_height);
86290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  leading_decorations.LayoutPass3(&location_bounds, &available_width);
86390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  trailing_decorations.LayoutPass3(&location_bounds, &available_width);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Calculate the animation parameters (see comments on these members in the
86646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // header).  We have to do this in Layout, after |origin_chip_view_| is laid
86746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // out, because that may affect the host label offset in the origin chip.
86846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const base::string16& chip_text(origin_chip_view_->host_label_text());
86946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If the chip is clicked, the omnibox text will become the toolbar model's
87046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // formatted URL.  We can't ask the omnibox for its current text, because
87146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // while the chip is visible the current text is empty.
87246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t prefix_end = 0;
87346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const base::string16& omnibox_text(
87446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetToolbarModel()->GetFormattedURL(&prefix_end));
87546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Do a case-insensitive search to better match cases like
87646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // "Settings" <-> "chrome://settings".  Skip any pre-hostname text.
87746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t chip_text_offset = std::search(
87846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      omnibox_text.begin() + prefix_end, omnibox_text.end(),
87946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      chip_text.begin(), chip_text.end(),
88046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::CaseInsensitiveCompare<base::char16>()) - omnibox_text.begin();
88146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If we couldn't find the chip text, try checking whether the omnibox text
88246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // starts with it, as is true for e.g. file: URLs.
88346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if ((chip_text_offset >= omnibox_text.length()) &&
88446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      StartsWith(omnibox_text, chip_text, true))
88546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    chip_text_offset = 0;
88646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const gfx::FontList& font_list = omnibox_view_->GetFontList();
88746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int chip_text_width = gfx::GetStringWidth(chip_text, font_list);
88846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int old_starting_offset = starting_omnibox_offset_;
88946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int old_starting_leading_inset = starting_omnibox_leading_inset_;
89046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int old_ending_width = ending_omnibox_width_;
89146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  starting_omnibox_offset_ = current_omnibox_offset_ = 0;
89246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  starting_omnibox_leading_inset_ = current_omnibox_leading_inset_ = 0;
89346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ending_omnibox_width_ = gfx::GetStringWidth(omnibox_text, font_list);
89446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (chip_text_offset < omnibox_text.length()) {
89546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (base::i18n::IsRTL())
89646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      chip_text_offset += chip_text.length();
89746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    base::string16 extra_omnibox_text(base::i18n::IsRTL() ?
89846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        omnibox_text.substr(chip_text_offset) :
89946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        omnibox_text.substr(0, chip_text_offset));
90046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    starting_omnibox_leading_inset_ =
90146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        gfx::GetStringWidth(extra_omnibox_text, font_list);
90246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    starting_omnibox_offset_ = origin_chip_view_->HostLabelOffset() -
90346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        starting_omnibox_leading_inset_;
90446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_width_ = chip_text_width;
90546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else {
90646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // If the chip text wasn't found in the omnibox text, then instead of
90746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // starting the show animation clipped to the "hostname", we'll start with
90846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // the entire omnibox text visible, clipped to the remaining chip width, and
90946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // only animate any necessary expansion of that width, without moving the
91046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // omnibox bounds.
91146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_width_ = origin_chip_view_->WidthFromStartOfLabels();
91246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
91346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
91446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // End the animations immediately if the parameters have changed.
91546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if ((starting_omnibox_offset_ != old_starting_offset) ||
91646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (starting_omnibox_leading_inset_ != old_starting_leading_inset) ||
91746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (ending_omnibox_width_ != old_ending_width))
91846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EndOriginChipAnimations(true);
91946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
92046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Also end the animations immediately if there's nothing to animate (but do
92146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // allow the chip to fade back in).
92246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const ui::NativeTheme* native_theme = GetNativeTheme();
92346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const SkColor ending_selection_text_color = native_theme->GetSystemColor(
92446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ui::NativeTheme::kColorId_TextfieldSelectionColor);
92546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const SkColor ending_selection_background_color =
92646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      native_theme->GetSystemColor(
92746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused);
92846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if ((starting_omnibox_offset_ == 0) &&
92946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (starting_omnibox_leading_inset_ == 0) &&
93046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (ending_omnibox_width_ == chip_text_width) &&
93146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (hide_url_animation_->is_animating() ||
93246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ((ending_selection_text_color ==
93346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            origin_chip_view_->pressed_text_color()) &&
93446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        (ending_selection_background_color ==
93546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            origin_chip_view_->pressed_background_color()))))
93646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EndOriginChipAnimations(false);
93746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
93846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (show_url_animation_->is_animating()) {
93946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    omnibox_view_->SetSelectionTextColor(gfx::Tween::ColorValueBetween(
94046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        show_url_animation_->GetCurrentValue(),
94146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        origin_chip_view_->pressed_text_color(),
94246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ending_selection_text_color));
94346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    omnibox_view_->SetSelectionBackgroundColor(gfx::Tween::ColorValueBetween(
94446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        show_url_animation_->GetCurrentValue(),
94546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        origin_chip_view_->pressed_background_color(),
94646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ending_selection_background_color));
94746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_offset_ =
94846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        show_url_animation_->CurrentValueBetween(starting_omnibox_offset_, 0);
94946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_leading_inset_ = show_url_animation_->CurrentValueBetween(
95046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        starting_omnibox_leading_inset_, 0);
95146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_width_ = show_url_animation_->CurrentValueBetween(
95246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        chip_text_width, ending_omnibox_width_);
95346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else if (hide_url_animation_->is_animating()) {
95446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_offset_ =
95546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        hide_url_animation_->CurrentValueBetween(0, starting_omnibox_offset_);
95646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_leading_inset_ = hide_url_animation_->CurrentValueBetween(
95746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        0, starting_omnibox_leading_inset_);
95846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_width_ = hide_url_animation_->CurrentValueBetween(
95946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ending_omnibox_width_, chip_text_width);
96046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
96146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Contract |available_width| as necessary, but never expand it.  This way,
96246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // we'll never draw suggested text at first and then have it disappear
96346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // midway through the animation.
96446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (current_omnibox_offset_ > 0)
96546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    available_width -= current_omnibox_offset_;
96646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  location_bounds.Inset(current_omnibox_offset_, 0, 0, 0);
96746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout out the suggested text view right aligned to the location
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // entry. Only show the suggested text if we can fit the text from one
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // character before the end of the selection to the end of the text and the
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // suggested text. If we can't it means either the suggested text is too big,
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or the user has scrolled.
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(sky): We could potentially adjust this to take into account suggested
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // text to force using minimum size if necessary, but currently the chance of
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // showing keyword hints and suggested text is minimal and we're not confident
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this is the right approach for suggested text.
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int omnibox_view_margin = 0;
98090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (suggested_text_view_->visible()) {
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We do not display the suggested text when it contains a mix of RTL and
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // LTR characters since this could mean the suggestion should be displayed
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // in the middle of the string.
98490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::i18n::TextDirection text_direction =
985f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::i18n::GetStringDirection(omnibox_view_->GetText());
98690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (text_direction !=
98790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::i18n::GetStringDirection(suggested_text_view_->text()))
98890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      text_direction = base::i18n::UNKNOWN_DIRECTION;
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(sky): need to layout when the user changes caret position.
99190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gfx::Size suggested_text_size(suggested_text_view_->GetPreferredSize());
99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (suggested_text_size.width() > available_width ||
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        text_direction == base::i18n::UNKNOWN_DIRECTION) {
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Hide the suggested text if the user has scrolled or we can't fit all
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // the suggested text, or we have a mix of RTL and LTR characters.
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      suggested_text_view_->SetBounds(0, 0, 0, 0);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      location_needed_width =
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          std::min(location_needed_width,
100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   location_bounds.width() - suggested_text_size.width());
10010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      gfx::Rect suggested_text_bounds(location_bounds.x(), location_bounds.y(),
10020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      suggested_text_size.width(),
10030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      location_bounds.height());
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(sky): figure out why this needs the -1.
100590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      suggested_text_bounds.Offset(location_needed_width - 1, 0);
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // We reverse the order of the location entry and suggested text if:
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // - Chrome is RTL but the text is fully LTR, or
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // - Chrome is LTR but the text is fully RTL.
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // This ensures the suggested text is correctly displayed to the right
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // (or left) of the user text.
101290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (text_direction == (base::i18n::IsRTL() ?
101390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::i18n::LEFT_TO_RIGHT : base::i18n::RIGHT_TO_LEFT)) {
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // TODO(sky): Figure out why we need the +1.
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        suggested_text_bounds.set_x(location_bounds.x() + 1);
1016f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // Use a margin to prevent omnibox text from overlapping suggest text.
1017f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        omnibox_view_margin = suggested_text_bounds.width();
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      suggested_text_view_->SetBoundsRect(suggested_text_bounds);
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Insets insets = omnibox_view_->GetInsets();
10245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  omnibox_view_->SetBorder(views::Border::CreateEmptyBorder(
10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      insets.top(), insets.left(), insets.bottom(), omnibox_view_margin));
1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1027868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Layout |ime_inline_autocomplete_view_| next to the user input.
1028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (ime_inline_autocomplete_view_->visible()) {
1029868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int width =
10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gfx::GetStringWidth(ime_inline_autocomplete_view_->text(),
10315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            ime_inline_autocomplete_view_->font_list()) +
1032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ime_inline_autocomplete_view_->GetInsets().width();
1033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // All the target languages (IMEs) are LTR, and we do not need to support
1034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // RTL so far.  In other words, no testable RTL environment so far.
1035868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int x = location_needed_width;
1036868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (width > entry_width)
1037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      x = 0;
1038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    else if (location_needed_width + width > entry_width)
1039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      x = entry_width - width;
1040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    location_bounds.set_width(x);
1041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ime_inline_autocomplete_view_->SetBounds(
1042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        location_bounds.right(), location_bounds.y(),
10430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        std::min(width, entry_width), location_bounds.height());
1044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  omnibox_view_->SetBoundsRect(location_bounds);
1047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  search_button_->SetBoundsRect(gfx::Rect(
1049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      gfx::Point(width() - search_button_reserved_width, 0),
1050a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      search_button_size));
1051a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1052a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1053c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1054c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, public OmniboxEditController implementation:
10557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void LocationBarView::Update(const WebContents* contents) {
10574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  mic_search_view_->SetVisible(
10584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      !GetToolbarModel()->input_in_progress() && browser_ &&
10594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      browser_->search_model()->voice_search_supported());
1060f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RefreshContentSettingViews();
10614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  generated_credit_card_view_->Update();
10624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ZoomBubbleView::CloseBubble();
10634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RefreshZoomView();
10644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RefreshPageActionViews();
10651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RefreshTranslateIcon();
1066f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RefreshManagePasswordsIconView();
1067f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  content::WebContents* web_contents_for_sub_views =
1068f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GetToolbarModel()->input_in_progress() ? NULL : GetWebContents();
1069f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  open_pdf_in_reader_view_->Update(web_contents_for_sub_views);
1070f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  add_to_app_launcher_view_->Update(web_contents_for_sub_views);
10714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (star_view_) {
10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    star_view_->SetVisible(
10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        browser_defaults::bookmarks_enabled && !is_popup_mode_ &&
10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        !GetToolbarModel()->input_in_progress() &&
10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        edit_bookmarks_enabled_.GetValue() &&
10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        !IsBookmarkStarHiddenByExtension());
10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
10794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (contents)
1081f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    omnibox_view_->OnTabChanged(contents);
10824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  else
1083f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    omnibox_view_->Update();
10844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  OnChanged();  // NOTE: Calls Layout().
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1088effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid LocationBarView::ShowURL() {
108946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Start the animation before calling ShowURL(), since the latter eventually
109046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // calls back to Layout(), and if the animation is not marked as "running",
109146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // we'll draw the omnibox in its final position briefly until the first
109246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // animation callback reaches us.
1093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (chrome::ShouldDisplayOriginChip()) {
109446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // If we're currently hiding, reverse the hide by swapping to the show
109546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // animation, offset so that the text is in the same position.
109646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (hide_url_animation_->is_animating()) {
109746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const double show_value = GetValueForAnimation(false);
109846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      hide_url_animation_->Reset();
109946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      show_url_animation_->Show();
110046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      // This must be done after calling Show() and is not equivalent to
110146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      // calling Reset(n) before Show(); Reset() would have caused the entire
110246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      // animation curve (and time) to run between this value and the final
110346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      // value, whereas Show() + SetCurrentValue() skips the animation forward
110446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      // to the supplied value.
110546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      show_url_animation_->SetCurrentValue(show_value);
110646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    } else {
110746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      show_url_animation_->Show();
110846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
1109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
111046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  omnibox_view_->ShowURL();
111146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
111246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
111346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LocationBarView::EndOriginChipAnimations(bool cancel_fade) {
111446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  show_url_animation_->End();
111546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  hide_url_animation_->End();
111646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (cancel_fade)
111746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    origin_chip_view_->CancelFade();
1118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochToolbarModel* LocationBarView::GetToolbarModel() {
1121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return delegate_->GetToolbarModel();
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)WebContents* LocationBarView::GetWebContents() {
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return delegate_->GetWebContents();
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private:
11303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
1132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int LocationBarView::IncrementalMinimumWidth(views::View* view) {
1133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return view->visible() ? (kItemPadding + view->GetMinimumSize().width()) : 0;
1134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint LocationBarView::GetHorizontalEdgeThickness() const {
1137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // In maximized popup mode, there isn't any edge.
1138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return (is_popup_mode_ && browser_ && browser_->window() &&
1139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      browser_->window()->IsMaximized()) ? 0 : vertical_edge_thickness();
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::RefreshContentSettingViews() {
1143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool visibility_changed = false;
1144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
1145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       i != content_setting_views_.end(); ++i) {
1146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const bool was_visible = (*i)->visible();
1147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    (*i)->Update(GetToolbarModel()->input_in_progress() ?
1148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        NULL : GetWebContents());
1149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (was_visible != (*i)->visible())
1150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      visibility_changed = true;
1151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return visibility_changed;
1153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::DeletePageActionViews() {
1156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (PageActionViews::const_iterator i(page_action_views_.begin());
1157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       i != page_action_views_.end(); ++i)
1158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    RemoveChildView(*i);
1159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  STLDeleteElements(&page_action_views_);
1160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
116158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::RefreshPageActionViews() {
1163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (is_popup_mode_)
1164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool changed = false;
116758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Remember the previous visibility of the page actions so that we can
1169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // notify when this changes.
1170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::map<ExtensionAction*, bool> old_visibility;
1171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (PageActionViews::const_iterator i(page_action_views_.begin());
1172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       i != page_action_views_.end(); ++i) {
1173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    old_visibility[(*i)->image_view()->page_action()] = (*i)->visible();
117458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
11755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PageActions new_page_actions;
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebContents* web_contents = GetWebContents();
11795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (web_contents) {
1180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    extensions::TabHelper* extensions_tab_helper =
11815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        extensions::TabHelper::FromWebContents(web_contents);
1182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    extensions::LocationBarController* controller =
1183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        extensions_tab_helper->location_bar_controller();
1184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    new_page_actions = controller->GetCurrentActions();
1185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
1186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // On startup we sometimes haven't loaded any extensions. This makes sure
1188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // we catch up when the extensions (and any page actions) load.
1189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (page_actions_ != new_page_actions) {
1190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    changed = true;
11917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    page_actions_.swap(new_page_actions);
1193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DeletePageActionViews();  // Delete the old views (if any).
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Create the page action views.
1196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (PageActions::const_iterator i = page_actions_.begin();
1197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         i != page_actions_.end(); ++i) {
1198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      PageActionWithBadgeView* page_action_view = new PageActionWithBadgeView(
1199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          delegate_->CreatePageActionImageView(this, *i));
1200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      page_action_view->SetVisible(false);
1201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      page_action_views_.push_back(page_action_view);
1202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
1203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Move rightmost extensions to the start.
1205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    std::stable_partition(
1206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        page_action_views_.begin(),
1207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        page_action_views_.end(),
1208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        IsPageActionViewRightAligned(
1209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            extensions::ExtensionSystem::Get(profile())->extension_service()));
1210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    View* right_anchor = open_pdf_in_reader_view_;
1212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (!right_anchor)
1213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      right_anchor = star_view_;
1214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DCHECK(right_anchor);
1215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // |page_action_views_| are ordered right-to-left.  Add them as children in
1217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // reverse order so the logical order and visual order match for
1218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // accessibility purposes.
1219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (PageActionViews::reverse_iterator i = page_action_views_.rbegin();
1220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         i != page_action_views_.rend(); ++i)
1221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      AddChildViewAt(*i, GetIndexOf(right_anchor));
1222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
12245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!page_action_views_.empty() && web_contents) {
12255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
1226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    GURL url = browser->tab_strip_model()->GetActiveWebContents()->GetURL();
1227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (PageActionViews::const_iterator i(page_action_views_.begin());
1229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         i != page_action_views_.end(); ++i) {
1230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      (*i)->UpdateVisibility(
12315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          GetToolbarModel()->input_in_progress() ? NULL : web_contents, url);
1232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // Check if the visibility of the action changed and notify if it did.
1234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ExtensionAction* action = (*i)->image_view()->page_action();
1235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (old_visibility.find(action) == old_visibility.end() ||
1236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          old_visibility[action] != (*i)->visible()) {
1237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        changed = true;
1238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        content::NotificationService::current()->Notify(
1239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED,
1240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            content::Source<ExtensionAction>(action),
12415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            content::Details<WebContents>(web_contents));
1242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      }
1243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
1244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return changed;
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::RefreshZoomView() {
1249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(zoom_view_);
1250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebContents* web_contents = GetWebContents();
1251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!web_contents)
1252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
1253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const bool was_visible = zoom_view_->visible();
1254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  zoom_view_->Update(ZoomController::FromWebContents(web_contents));
1255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return was_visible != zoom_view_->visible();
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::RefreshTranslateIcon() {
1259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!TranslateService::IsTranslateBubbleEnabled())
1260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebContents* web_contents = GetWebContents();
1263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!web_contents)
1264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
126546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  LanguageState& language_state =
126646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ChromeTranslateClient::FromWebContents(web_contents)->GetLanguageState();
1267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool enabled = language_state.translate_enabled();
1268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  command_updater()->UpdateCommandEnabled(IDC_TRANSLATE_PAGE, enabled);
1269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  translate_icon_view_->SetVisible(enabled);
1270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  translate_icon_view_->SetToggled(language_state.IsPageTranslated());
1271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::RefreshManagePasswordsIconView() {
1274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(manage_passwords_icon_view_);
1275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebContents* web_contents = GetWebContents();
1276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!web_contents)
1277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
1278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const bool was_visible = manage_passwords_icon_view_->visible();
1279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ManagePasswordsUIController::FromWebContents(
12805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      web_contents)->UpdateIconAndBubbleState(manage_passwords_icon_view_);
1281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return was_visible != manage_passwords_icon_view_->visible();
1282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::ShowFirstRunBubbleInternal() {
1285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // First run bubble doesn't make sense for Chrome OS.
1286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_CHROMEOS)
1287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebContents* web_contents = delegate_->GetWebContents();
1288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!web_contents)
1289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
1291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (browser)
1292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    FirstRunBubble::ShowBubble(browser, location_icon_view_);
1293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::AccessibilitySetValue(const base::string16& new_value) {
1297c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->SetUserText(new_value, new_value, true);
1298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1300c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::HasValidSuggestText() const {
1301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return suggested_text_view_->visible() &&
1302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      !suggested_text_view_->size().IsEmpty();
1303c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool LocationBarView::ShouldShowKeywordBubble() const {
1306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return !omnibox_view_->model()->keyword().empty() &&
1307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      !omnibox_view_->model()->is_keyword_hint();
1308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool LocationBarView::ShouldShowEVBubble() const {
1311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return !chrome::ShouldDisplayOriginChip() &&
1312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (GetToolbarModel()->GetSecurityLevel(false) == ToolbarModel::EV_SECURE);
1313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
131546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)double LocationBarView::GetValueForAnimation(bool hide) const {
131646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int calculated_offset;
131746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const gfx::Tween::Type tween_type = hide ? kHideTweenType : kShowTweenType;
131846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int start_offset = starting_omnibox_offset_, end_offset = 0;
131946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (hide)
132046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    std::swap(start_offset, end_offset);
132146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int desired_offset = abs(current_omnibox_offset_);
132246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Binary-search the value space (0 <= value <= 1) to find the appropriate
132346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // position.  We only bother to iterate to within 1/64 of the desired value,
132446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // because the longer of the two animations will only run for twelve frames
132546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // anyway (200 ms * 60 Hz), so at this point we'll have a maximum error of
132646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // less than a fifth of an animation frame, which the user isn't going to
132746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // notice.
132846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  //
132946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // We have to use this method because Tween::CalculateValue() is not
133046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // necessarily easily invertible.  Luckily, this only runs when the user
133146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // reverses the animation (rare), and the limit on how many iterations we'll
133246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // do ensures the cost is unnoticeable.
133346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  double value = 0.5;
133446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  double step = value / 2;
133546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  do {
133646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    calculated_offset = abs(gfx::Tween::IntValueBetween(
133746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        gfx::Tween::CalculateValue(tween_type, value), start_offset,
133846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        end_offset));
133946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (calculated_offset < desired_offset)
134046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      value += step;
134146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    else if (calculated_offset > desired_offset)
134246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      value -= step;
134346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    step /= 2;
134446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } while ((calculated_offset != desired_offset) && (step >= (1.0 / 64)));
134546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return value;
134646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
134746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
134846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LocationBarView::ResetShowAnimationAndColors() {
134946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  show_url_animation_->Reset();
135046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  omnibox_view_->UseDefaultSelectionTextColor();
135146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  omnibox_view_->UseDefaultSelectionBackgroundColor();
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private LocationBar implementation:
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::ShowFirstRunBubble() {
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until search engines have loaded to show the first run bubble.
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* url_service =
13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(profile());
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url_service->loaded()) {
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    template_url_service_ = url_service;
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    template_url_service_->AddObserver(this);
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    template_url_service_->Load();
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowFirstRunBubbleInternal();
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)GURL LocationBarView::GetDestinationURL() const {
13714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return destination_url();
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowOpenDisposition LocationBarView::GetWindowOpenDisposition() const {
13754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return disposition();
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::PageTransition LocationBarView::GetPageTransition() const {
13794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return transition();
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::AcceptInput() {
1383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  omnibox_view_->model()->AcceptInput(CURRENT_TAB, false);
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::FocusSearch() {
1387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  omnibox_view_->SetFocus();
1388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  omnibox_view_->SetForcedQuery();
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::UpdateContentSettingsIcons() {
1392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (RefreshContentSettingViews()) {
1393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Layout();
1394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SchedulePaint();
1395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::UpdateManagePasswordsIconAndBubble() {
1399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (RefreshManagePasswordsIconView()) {
1400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Layout();
1401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SchedulePaint();
1402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::UpdatePageActions() {
1406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  size_t count_before = page_action_views_.size();
1407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool changed = RefreshPageActionViews();
1408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (page_action_views_.size() != count_before) {
1409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    content::NotificationService::current()->Notify(
1410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_COUNT_CHANGED,
1411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        content::Source<LocationBar>(this),
1412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        content::NotificationService::NoDetails());
1413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (changed) {
1416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Layout();
1417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SchedulePaint();
1418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::InvalidatePageActions() {
1422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  size_t count_before = page_action_views_.size();
1423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DeletePageActionViews();
1424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (page_action_views_.size() != count_before) {
1425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    content::NotificationService::current()->Notify(
1426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_COUNT_CHANGED,
1427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        content::Source<LocationBar>(this),
1428c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        content::NotificationService::NoDetails());
1429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::UpdateOpenPDFInReaderPrompt() {
1433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  open_pdf_in_reader_view_->Update(
1434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GetToolbarModel()->input_in_progress() ? NULL : GetWebContents());
1435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Layout();
1436c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SchedulePaint();
1437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1439c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::UpdateGeneratedCreditCardView() {
1440c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  generated_credit_card_view_->Update();
1441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Layout();
1442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SchedulePaint();
1443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::SaveStateToContents(WebContents* contents) {
144646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If we're about to switch tabs, complete any current animations, so that if
144746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // the user is in the midst of hiding the URL, when he returns to this tab,
144846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // the URL will be hidden rather than shown.
144946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // NOTE: This must be called before SaveStateToTab().
145046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EndOriginChipAnimations(true);
1451c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->SaveStateToTab(contents);
1452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst OmniboxView* LocationBarView::GetOmniboxView() const {
1455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return omnibox_view_;
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocationBarTesting* LocationBarView::GetLocationBarForTesting() {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1463c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private LocationBarTesting implementation:
1464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocationBarView::PageActionCount() {
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return page_action_views_.size();
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocationBarView::PageActionVisibleCount() {
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = 0;
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < page_action_views_.size(); i++) {
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (page_action_views_[i]->visible())
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++result;
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionAction* LocationBarView::GetPageAction(size_t index) {
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index < page_action_views_.size())
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return page_action_views_[index]->image_view()->page_action();
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionAction* LocationBarView::GetVisiblePageAction(size_t index) {
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t current = 0;
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < page_action_views_.size(); ++i) {
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (page_action_views_[i]->visible()) {
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (current == index)
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return page_action_views_[i]->image_view()->page_action();
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++current;
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::TestPageActionPressed(size_t index) {
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t current = 0;
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < page_action_views_.size(); ++i) {
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (page_action_views_[i]->visible()) {
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (current == index) {
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        page_action_views_[i]->image_view()->ExecuteAction(
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExtensionPopup::SHOW);
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++current;
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::GetBookmarkStarVisibility() {
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(star_view_);
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return star_view_->visible();
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1523c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private views::View implementation:
1524c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1525c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char* LocationBarView::GetClassName() const {
1526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return kViewClassName;
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
1530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  InstantServiceFactory::GetForProfile(profile())->OnOmniboxStartMarginChanged(
1531c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      bounds().x());
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1533c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  OmniboxPopupView* popup = omnibox_view_->model()->popup_model()->view();
1534c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (popup->IsOpen())
1535c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    popup->UpdatePopupAppearance();
1536c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
15375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
153846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LocationBarView::OnFocus() {
153946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Explicitly focus the omnibox so a focus ring will be displayed around it on
154046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Windows.
154146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  omnibox_view_->SetFocus();
154246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
154346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1544c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::OnPaint(gfx::Canvas* canvas) {
1545c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  View::OnPaint(canvas);
1546c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1547c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Fill the location bar background color behind the border.  Parts of the
1548c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // border images are meant to rest atop the toolbar background and parts atop
1549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // the omnibox background, so we can't just blindly fill our entire bounds.
1550c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::Rect bounds(GetContentsBounds());
1551c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bounds.Inset(GetHorizontalEdgeThickness(), vertical_edge_thickness());
1552c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SkColor color(GetColor(ToolbarModel::NONE, BACKGROUND));
1553c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (is_popup_mode_) {
1554c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    canvas->FillRect(bounds, color);
1555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else {
1556c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SkPaint paint;
1557c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    paint.setStyle(SkPaint::kFill_Style);
1558c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    paint.setColor(color);
1559c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const int kBorderCornerRadius = 2;
1560c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    canvas->DrawRoundRect(bounds, kBorderCornerRadius, paint);
15617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1562c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1563c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The border itself will be drawn in PaintChildren() since it includes an
1564c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // inner shadow which should be drawn over the contents.
15657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
15667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LocationBarView::PaintChildren(gfx::Canvas* canvas,
1568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    const views::CullSet& cull_set) {
156946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Paint all the children except for the omnibox itself, which may need to be
157046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // clipped if it's animating in, and the origin chip and the search button,
1571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // which will be painted after the border.
15720de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  for (int i = 0, count = child_count(); i < count; ++i) {
157346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    views::View* child = child_at(i);
157446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!child->layer() && (child != omnibox_view_) &&
157546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        (child != origin_chip_view_) && (child != search_button_))
157646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      child->Paint(canvas, cull_set);
157746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
157846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
157946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  {
158046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    gfx::ScopedCanvas scoped_canvas(canvas);
158146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (show_url_animation_->is_animating() ||
158246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        hide_url_animation_->is_animating()) {
158346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      gfx::Rect clip_rect(omnibox_view_->bounds());
158446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      clip_rect.Inset(current_omnibox_leading_inset_, 0, 0, 0);
158546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      clip_rect.set_width(current_omnibox_width_);
158646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      clip_rect.set_x(GetMirroredXForRect(clip_rect));
158746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      canvas->ClipRect(clip_rect);
158846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
158946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    omnibox_view_->Paint(canvas, cull_set);
15900de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  }
1591c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1592c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // For non-InstantExtendedAPI cases, if necessary, show focus rect. As we need
1593c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // the focus rect to appear on top of children we paint here rather than
1594c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // OnPaint().
1595c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Note: |Canvas::DrawFocusRect| paints a dashed rect with gray color.
1596c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (show_focus_rect_ && HasFocus())
1597c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    canvas->DrawFocusRect(omnibox_view_->bounds());
1598c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1599c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Maximized popup windows don't draw the horizontal edges.  We implement this
1600c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // by simply expanding the paint area outside the view by the edge thickness.
1601c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::Rect border_rect(GetContentsBounds());
1602c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (is_popup_mode_ && (GetHorizontalEdgeThickness() == 0))
1603c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    border_rect.Inset(-kPopupEdgeThickness, 0);
1604c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::Painter::PaintPainterAt(canvas, border_painter_.get(), border_rect);
1605c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1606c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The origin chip and the search button must be painted after the border so
1607c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // that the border shadow is not drawn over them.
1608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  origin_chip_view_->Paint(canvas, cull_set);
1609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  search_button_->Paint(canvas, cull_set);
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1613c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private views::ButtonListener implementation:
161458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1615c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::ButtonPressed(views::Button* sender,
1616c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                    const ui::Event& event) {
1617c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (sender == mic_search_view_) {
1618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    command_updater()->ExecuteCommand(IDC_TOGGLE_SPEECH_INPUT);
1619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1620c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK_EQ(search_button_, sender);
1623c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // TODO(pkasting): When macourteau adds UMA stats for this, wire them up here.
1624c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->model()->AcceptInput(
1625c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ui::DispositionFromEventFlags(event.flags()), false);
162658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
162758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1628c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1629c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private views::DragController implementation:
1630c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1631c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::WriteDragDataForView(views::View* sender,
1632c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                           const gfx::Point& press_pt,
1633c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                           OSExchangeData* data) {
1634c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK_NE(GetDragOperationsForView(sender, press_pt),
1635c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            ui::DragDropTypes::DRAG_NONE);
1636c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1637c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebContents* web_contents = GetWebContents();
1638c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FaviconTabHelper* favicon_tab_helper =
1639c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FaviconTabHelper::FromWebContents(web_contents);
1640c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::ImageSkia favicon = favicon_tab_helper->GetFavicon().AsImageSkia();
1641c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  button_drag_utils::SetURLAndDragImage(web_contents->GetURL(),
1642c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        web_contents->GetTitle(),
1643c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        favicon,
1644f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                        NULL,
1645c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        data,
1646c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        sender->GetWidget());
164758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
164858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1649c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint LocationBarView::GetDragOperationsForView(views::View* sender,
1650c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                              const gfx::Point& p) {
1651c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK((sender == location_icon_view_) || (sender == ev_bubble_view_) ||
1652c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         (sender == origin_chip_view_));
1653c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebContents* web_contents = delegate_->GetWebContents();
1654c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return (web_contents && web_contents->GetURL().is_valid() &&
1655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          (!GetOmniboxView()->IsEditingOrEmpty() ||
1656c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch           sender == origin_chip_view_)) ?
1657c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      (ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_LINK) :
1658c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ui::DragDropTypes::DRAG_NONE;
165958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
166058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1661c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::CanStartDragForView(View* sender,
1662c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                          const gfx::Point& press_pt,
1663c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                          const gfx::Point& p) {
1664c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return true;
166558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
166658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1667c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1668c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private OmniboxEditController implementation:
1669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1670c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::OnChanged() {
1671c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int icon_id = omnibox_view_->GetIcon();
1672c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  location_icon_view_->SetImage(GetThemeProvider()->GetImageSkiaNamed(icon_id));
1673c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  location_icon_view_->ShowTooltip(!GetOmniboxView()->IsEditingOrEmpty());
167458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1675c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ToolbarModel* toolbar_model = GetToolbarModel();
1676c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  chrome::DisplaySearchButtonConditions conditions =
1677c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      chrome::GetDisplaySearchButtonConditions();
1678c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool meets_conditions =
1679c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      (conditions == chrome::DISPLAY_SEARCH_BUTTON_ALWAYS) ||
1680c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ((conditions != chrome::DISPLAY_SEARCH_BUTTON_NEVER) &&
1681c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       (toolbar_model->WouldPerformSearchTermReplacement(true) ||
1682c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        ((conditions == chrome::DISPLAY_SEARCH_BUTTON_FOR_STR_OR_IIP) &&
1683c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         toolbar_model->input_in_progress())));
1684c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  search_button_->SetVisible(!is_popup_mode_ && meets_conditions);
1685f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  search_button_->UpdateIcon(icon_id == IDR_OMNIBOX_SEARCH);
168658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
168746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  origin_chip_view_->OnChanged();
168858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1689c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Layout();
1690c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SchedulePaint();
1691c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1693c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::OnSetFocus() {
1694c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GetFocusManager()->SetFocusedView(this);
1695c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
169658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1697c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochInstantController* LocationBarView::GetInstant() {
1698c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return delegate_->GetInstant();
1699c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
17005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1701c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst ToolbarModel* LocationBarView::GetToolbarModel() const {
1702c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return delegate_->GetToolbarModel();
1703c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
17045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1705c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::HideURL() {
170646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(chrome::ShouldDisplayOriginChip());
170746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
170846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If we're currently showing, reverse the hide by swapping to the hide
170946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // animation, offset so that the text is in the same position.
171046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (show_url_animation_->is_animating()) {
171146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const double hide_value = GetValueForAnimation(true);
171246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ResetShowAnimationAndColors();
171346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    hide_url_animation_->Show();
171446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // This must be done after calling Show() and is not equivalent to Reset(n);
171546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // see comments in ShowURL().
171646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    hide_url_animation_->SetCurrentValue(hide_value);
171746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else {
171846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    hide_url_animation_->Show();
171946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
1720c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
172158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1722c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1723c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private DropdownBarHostDelegate implementation:
172458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1725c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::SetFocusAndSelection(bool select_all) {
1726c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FocusLocation(select_all);
1727c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
172858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1729c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::SetAnimationOffset(int offset) {
1730c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  dropdown_animation_offset_ = offset;
1731c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
173258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1733c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1734c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private gfx::AnimationDelegate implementation:
1735c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1736c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::AnimationProgressed(const gfx::Animation* animation) {
173746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK((animation == show_url_animation_.get()) ||
173846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (animation == hide_url_animation_.get()));
173946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Layout();
174046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SchedulePaint();
174158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
174258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1743c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::AnimationEnded(const gfx::Animation* animation) {
1744c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (animation == show_url_animation_.get()) {
174546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ResetShowAnimationAndColors();
174646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Layout();
174746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SchedulePaint();
174846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else {
174946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DCHECK(animation == hide_url_animation_.get());
1750c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    hide_url_animation_->Reset();
175146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    origin_chip_view_->FadeIn();
175246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    omnibox_view_->HideURL();  // Calls OnChanged(), triggering layout.
1753c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
175558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1756c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1757c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private TemplateURLServiceObserver implementation:
1758c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1759c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::OnTemplateURLServiceChanged() {
1760c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  template_url_service_->RemoveObserver(this);
1761c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  template_url_service_ = NULL;
1762c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // If the browser is no longer active, let's not show the info bubble, as this
1763c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // would make the browser the active window again.
1764c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (omnibox_view_ && omnibox_view_->GetWidget()->IsActive())
1765c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ShowFirstRunBubble();
176658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
176758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1768c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1769c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private content::NotificationObserver implementation:
17705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1771c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::Observe(int type,
1772c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              const content::NotificationSource& source,
1773c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              const content::NotificationDetails& details) {
1774c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  switch (type) {
17750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED:
1776c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED:
1777c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      Update(NULL);
1778c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      break;
177958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1780c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    default:
1781c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      NOTREACHED() << "Unexpected notification.";
1782c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
178458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1785c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1786c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private SearchModelObserver implementation:
178758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1788c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::ModelChanged(const SearchModel::State& old_state,
1789c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                   const SearchModel::State& new_state) {
1790c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const bool visible = !GetToolbarModel()->input_in_progress() &&
1791c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new_state.voice_search_supported;
1792c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (mic_search_view_->visible() != visible) {
1793c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    mic_search_view_->SetVisible(visible);
1794c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Layout();
1795c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
179658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
179758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1798