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)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_updater.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/omnibox/omnibox_api.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/extensions/extension_action.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_action_manager.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_util.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_service_factory.h"
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/translate/chrome_translate_client.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/translate/translate_service.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_instant_controller.h"
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_model.h"
36a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_view.h"
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/passwords/manage_passwords_icon.h"
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/view_ids.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/browser_dialogs.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/content_setting_image_view.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/ev_bubble_view.h"
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/views/location_bar/generated_credit_card_view.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/keyword_hint_view.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_layout.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_icon_view.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/open_pdf_in_reader_view.h"
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/origin_chip_view.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/page_action_image_view.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/page_action_with_badge_view.h"
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/search_button.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/selected_keyword_view.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/star_view.h"
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/translate_icon_view.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/zoom_bubble_view.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/zoom_view.h"
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/passwords/manage_passwords_bubble_view.h"
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/passwords/manage_passwords_icon_view.h"
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/ui/views/translate/translate_bubble_view.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/zoom/zoom_controller.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h"
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/translate/core/browser/language_state.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/extension_registry.h"
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_scaled_resources.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/theme_provider.h"
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gfx/animation/slide_animation.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/color_utils.h"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h"
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/gfx/scoped_canvas.h"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h"
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/text_utils.h"
88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ui/native_theme/native_theme.h"
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/background.h"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/border.h"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/button_drag_utils.h"
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/views/controls/button/image_button.h"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/first_run_bubble.h"
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::View;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const gfx::Tween::Type kShowTweenType = gfx::Tween::LINEAR_OUT_SLOW_IN;
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const gfx::Tween::Type kHideTweenType = gfx::Tween::FAST_OUT_LINEAR_IN;
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The search button images are made to look as if they overlay the normal edge
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// images, but to align things, the search button needs to be inset horizontally
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// by 1 px.
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kSearchButtonInset = 1;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int GetEditLeadingInternalSpace() {
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The textfield has 1 px of whitespace before the text in the RTL case only.
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return base::i18n::IsRTL() ? 1 : 0;
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Functor for moving BookmarkManagerPrivate page actions to the right via
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// stable_partition.
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class IsPageActionViewRightAligned {
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit IsPageActionViewRightAligned(
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::ExtensionRegistry* extension_registry)
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      : extension_registry_(extension_registry) {}
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool operator()(PageActionWithBadgeView* page_action_view) {
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return extension_registry_->enabled_extensions().GetByID(
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        page_action_view->image_view()->extension_action()->extension_id())->
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        permissions_data()->
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        HasAPIPermission(extensions::APIPermission::kBookmarkManagerPrivate);
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extensions::ExtensionRegistry* extension_registry_;
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NOTE: Can't DISALLOW_COPY_AND_ASSIGN as we pass this object by value to
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // std::stable_partition().
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// LocationBarView -----------------------------------------------------------
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int LocationBarView::kNormalEdgeThickness = 2;
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int LocationBarView::kPopupEdgeThickness = 1;
1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst int LocationBarView::kItemPadding = 3;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int LocationBarView::kIconInternalPadding = 2;
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int LocationBarView::kBubblePadding = 1;
151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char LocationBarView::kViewClassName[] = "LocationBarView";
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocationBarView::LocationBarView(Browser* browser,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Profile* profile,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 CommandUpdater* command_updater,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Delegate* delegate,
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 bool is_popup_mode)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : LocationBar(profile),
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OmniboxEditController(command_updater),
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      browser_(browser),
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      omnibox_view_(NULL),
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(delegate),
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      origin_chip_view_(NULL),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_icon_view_(NULL),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ev_bubble_view_(NULL),
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ime_inline_autocomplete_view_(NULL),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_keyword_view_(NULL),
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      suggested_text_view_(NULL),
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyword_hint_view_(NULL),
1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      mic_search_view_(NULL),
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zoom_view_(NULL),
172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      generated_credit_card_view_(NULL),
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      open_pdf_in_reader_view_(NULL),
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      manage_passwords_icon_view_(NULL),
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      translate_icon_view_(NULL),
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      star_view_(NULL),
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      search_button_(NULL),
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_popup_mode_(is_popup_mode),
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show_focus_rect_(false),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      template_url_service_(NULL),
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      dropdown_animation_offset_(0),
18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      starting_omnibox_offset_(0),
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      current_omnibox_offset_(0),
18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      starting_omnibox_leading_inset_(0),
18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      current_omnibox_leading_inset_(0),
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      current_omnibox_width_(0),
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ending_omnibox_width_(0) {
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  edit_bookmarks_enabled_.Init(
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bookmarks::prefs::kEditBookmarksEnabled, profile->GetPrefs(),
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&LocationBarView::Update, base::Unretained(this),
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 static_cast<content::WebContents*>(NULL)));
1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (browser_)
1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    browser_->search_model()->AddObserver(this);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocationBarView::~LocationBarView() {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (template_url_service_)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    template_url_service_->RemoveObserver(this);
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (browser_)
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    browser_->search_model()->RemoveObserver(this);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, public:
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::Init() {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to be in a Widget, otherwise GetNativeTheme() may change and we're
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not prepared for that.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(GetWidget());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int kOmniboxPopupBorderImages[] =
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IMAGE_GRID(IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW);
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int kOmniboxBorderImages[] = IMAGE_GRID(IDR_TEXTFIELD);
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  border_painter_.reset(views::Painter::CreateImageGridPainter(
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_popup_mode_ ? kOmniboxPopupBorderImages : kOmniboxBorderImages));
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_icon_view_ = new LocationIconView(this);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_icon_view_->set_drag_controller(this);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(location_icon_view_);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Determine the main font.
223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  gfx::FontList font_list = ResourceBundle::GetSharedInstance().GetFontList(
224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      ResourceBundle::BaseFont);
225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const int current_font_size = font_list.GetFontSize();
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int desired_font_size = browser_defaults::kOmniboxFontPixelSize;
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (current_font_size != desired_font_size) {
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    font_list =
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        font_list.DeriveWithSizeDelta(desired_font_size - current_font_size);
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Shrink large fonts to make them fit.
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // TODO(pkasting): Stretch the location bar instead in this case.
2330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const int location_height = GetInternalHeight(true);
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  font_list = font_list.DeriveWithHeightUpperBound(location_height);
2350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Determine the font for use inside the bubbles.  The bubble background
2370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // images have 1 px thick edges, which we don't want to overlap.
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int kBubbleInteriorVerticalPadding = 1;
2390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const int bubble_vertical_padding =
2400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      (kBubblePadding + kBubbleInteriorVerticalPadding) * 2;
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gfx::FontList bubble_font_list(font_list.DeriveWithHeightUpperBound(
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      location_height - bubble_vertical_padding));
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const SkColor background_color =
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetColor(ToolbarModel::NONE, LocationBarView::BACKGROUND);
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev_bubble_view_ = new EVBubbleView(
2470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      bubble_font_list, GetColor(ToolbarModel::EV_SECURE, SECURITY_TEXT),
2480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      background_color, this);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ev_bubble_view_->set_drag_controller(this);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(ev_bubble_view_);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initialize the Omnibox view.
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  omnibox_view_ = new OmniboxViewViews(
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this, profile(), command_updater(),
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_popup_mode_ ||
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (browser_->is_app() &&
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           extensions::util::IsStreamlinedHostedAppsEnabled()),
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this, font_list);
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  omnibox_view_->Init();
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  omnibox_view_->SetFocusable(true);
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AddChildView(omnibox_view_);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initialize the inline autocomplete view which is visible only when IME is
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // turned on.  Use the same font with the omnibox and highlighted background.
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ime_inline_autocomplete_view_ = new views::Label(base::string16(), font_list);
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetAutoColorReadabilityEnabled(false);
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->set_background(
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      views::Background::CreateSolidBackground(GetNativeTheme()->GetSystemColor(
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused)));
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetEnabledColor(
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetNativeTheme()->GetSystemColor(
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldSelectionColor));
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetVisible(false);
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddChildView(ime_inline_autocomplete_view_);
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  origin_chip_view_ = new OriginChipView(this, profile(), font_list);
278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  origin_chip_view_->SetFocusable(false);
279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  origin_chip_view_->set_drag_controller(this);
280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AddChildView(origin_chip_view_);
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SkColor text_color = GetColor(ToolbarModel::NONE, TEXT);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_keyword_view_ = new SelectedKeywordView(
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bubble_font_list, text_color, background_color, profile());
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(selected_keyword_view_);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  suggested_text_view_ = new views::Label(base::string16(), font_list);
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  suggested_text_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  suggested_text_view_->SetAutoColorReadabilityEnabled(false);
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  suggested_text_view_->SetEnabledColor(GetColor(
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ToolbarModel::NONE, LocationBarView::DEEMPHASIZED_TEXT));
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  suggested_text_view_->SetVisible(false);
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddChildView(suggested_text_view_);
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  keyword_hint_view_ = new KeywordHintView(
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profile(), font_list,
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetColor(ToolbarModel::NONE, LocationBarView::DEEMPHASIZED_TEXT),
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      background_color);
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(keyword_hint_view_);
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  mic_search_view_ = new views::ImageButton(this);
302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  mic_search_view_->set_id(VIEW_ID_MIC_SEARCH_BUTTON);
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  mic_search_view_->SetAccessibilityFocusable(true);
304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  mic_search_view_->SetTooltipText(
305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      l10n_util::GetStringUTF16(IDS_TOOLTIP_MIC_SEARCH));
306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  mic_search_view_->SetImage(
307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      views::Button::STATE_NORMAL,
308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          IDR_OMNIBOX_MIC_SEARCH));
310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  mic_search_view_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                      views::ImageButton::ALIGN_MIDDLE);
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  mic_search_view_->SetVisible(false);
3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  AddChildView(mic_search_view_);
3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingImageView* content_blocked_view =
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new ContentSettingImageView(static_cast<ContentSettingsType>(i), this,
3180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                    bubble_font_list, text_color,
3190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                    background_color);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_setting_views_.push_back(content_blocked_view);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_blocked_view->SetVisible(false);
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddChildView(content_blocked_view);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  generated_credit_card_view_ = new GeneratedCreditCardView(delegate_);
326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AddChildView(generated_credit_card_view_);
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  zoom_view_ = new ZoomView(delegate_);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zoom_view_->set_id(VIEW_ID_ZOOM_BUTTON);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(zoom_view_);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  open_pdf_in_reader_view_ = new OpenPDFInReaderView();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(open_pdf_in_reader_view_);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  manage_passwords_icon_view_ = new ManagePasswordsIconView(command_updater());
336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AddChildView(manage_passwords_icon_view_);
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  translate_icon_view_ = new TranslateIconView(command_updater());
339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  translate_icon_view_->SetVisible(false);
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AddChildView(translate_icon_view_);
341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  star_view_ = new StarView(command_updater());
3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  star_view_->SetVisible(false);
3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  AddChildView(star_view_);
3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  search_button_ = new SearchButton(this);
347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  search_button_->SetVisible(false);
348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddChildView(search_button_);
349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  show_url_animation_.reset(new gfx::SlideAnimation(this));
35146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  show_url_animation_->SetTweenType(kShowTweenType);
352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  show_url_animation_->SetSlideDuration(200);
353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  hide_url_animation_.reset(new gfx::SlideAnimation(this));
35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  hide_url_animation_->SetTweenType(kHideTweenType);
35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  hide_url_animation_->SetSlideDuration(175);
357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the location entry. We do this to avoid a black flash which is
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // visible when the location entry has just been initialized.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Update(NULL);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::IsInitialized() const {
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return omnibox_view_ != NULL;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor LocationBarView::GetColor(ToolbarModel::SecurityLevel security_level,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ColorKind kind) const {
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::NativeTheme* native_theme = GetNativeTheme();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (kind) {
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BACKGROUND:
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return native_theme->GetSystemColor(
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldDefaultBackground);
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case TEXT:
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return native_theme->GetSystemColor(
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldDefaultColor);
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SELECTED_TEXT:
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return native_theme->GetSystemColor(
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldSelectionColor);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DEEMPHASIZED_TEXT:
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return color_utils::AlphaBlend(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetColor(security_level, TEXT),
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetColor(security_level, BACKGROUND),
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          128);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SECURITY_TEXT: {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColor color;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (security_level) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ToolbarModel::EV_SECURE:
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ToolbarModel::SECURE:
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color = SkColorSetRGB(7, 149, 0);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ToolbarModel::SECURITY_WARNING:
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        case ToolbarModel::SECURITY_POLICY_WARNING:
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return GetColor(security_level, DEEMPHASIZED_TEXT);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ToolbarModel::SECURITY_ERROR:
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color = SkColorSetRGB(162, 0, 0);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED();
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return GetColor(security_level, TEXT);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return color_utils::GetReadableColor(
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color, GetColor(security_level, BACKGROUND));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GetColor(security_level, TEXT);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::ZoomChangedForActiveTab(bool can_show_bubble) {
421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(zoom_view_);
422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (RefreshZoomView()) {
423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Layout();
424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SchedulePaint();
425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebContents* web_contents = GetWebContents();
4285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (can_show_bubble && zoom_view_->visible() && web_contents)
4295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ZoomBubbleView::ShowBubble(web_contents, true);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SetPreviewEnabledPageAction(ExtensionAction* page_action,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  bool preview_enabled) {
43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_popup_mode_)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(page_action);
4385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebContents* web_contents = GetWebContents();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshPageActionViews();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PageActionWithBadgeView* page_action_view =
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<PageActionWithBadgeView*>(GetPageActionView(page_action));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(page_action_view);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!page_action_view)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  page_action_view->image_view()->set_preview_enabled(preview_enabled);
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  page_action_view->UpdateVisibility(web_contents);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Layout();
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SchedulePaint();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)PageActionWithBadgeView* LocationBarView::GetPageActionView(
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ExtensionAction* page_action) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(page_action);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (PageActionViews::const_iterator i(page_action_views_.begin());
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != page_action_views_.end(); ++i) {
4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if ((*i)->image_view()->extension_action() == page_action)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return *i;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::SetStarToggled(bool on) {
465ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (star_view_)
466ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    star_view_->SetToggled(on);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LocationBarView::SetTranslateIconToggled(bool on) {
470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  translate_icon_view_->SetToggled(on);
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Point LocationBarView::GetOmniboxViewOrigin() const {
474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Point origin(omnibox_view_->bounds().origin());
47546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  origin.set_x(GetMirroredXInView(origin.x() - current_omnibox_offset_));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View::ConvertPointToScreen(this, &origin);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return origin;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LocationBarView::SetImeInlineAutocompletion(const base::string16& text) {
481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetText(text);
482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ime_inline_autocomplete_view_->SetVisible(!text.empty());
483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LocationBarView::SetGrayTextAutocompletion(const base::string16& text) {
48690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (suggested_text_view_->text() != text) {
48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    suggested_text_view_->SetText(text);
48890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    suggested_text_view_->SetVisible(!text.empty());
48990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    Layout();
49090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SchedulePaint();
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 LocationBarView::GetGrayTextAutocompletion() const {
49546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return HasValidSuggestText() ?
49646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      suggested_text_view_->text() : base::string16();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
499c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::SetShowFocusRect(bool show) {
500c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  show_focus_rect_ = show;
501c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SchedulePaint();
502c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
503c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
504c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::SelectAll() {
505c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->SelectAll(true);
506c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
508c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochgfx::Point LocationBarView::GetLocationBarAnchorPoint() const {
509c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The +1 in the next line creates a 1-px gap between icon and arrow tip.
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Point icon_bottom(0, location_icon_view_->GetImageBounds().bottom() -
511c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      LocationBarView::kIconInternalPadding + 1);
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Point icon_center(location_icon_view_->GetImageBounds().CenterPoint());
513c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::Point point(icon_center.x(), icon_bottom.y());
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ConvertPointToTarget(location_icon_view_, this, &point);
515c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return point;
516c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
517c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
518c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochviews::View* LocationBarView::generated_credit_card_view() {
519c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return generated_credit_card_view_;
520c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
521c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint LocationBarView::GetInternalHeight(bool use_preferred_size) {
523c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int total_height =
524c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      use_preferred_size ? GetPreferredSize().height() : height();
525c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return std::max(total_height - (vertical_edge_thickness() * 2), 0);
526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
527c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
528c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::GetOmniboxPopupPositioningInfo(
529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    gfx::Point* top_left_screen_coord,
530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int* popup_width,
531c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int* left_margin,
532c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int* right_margin) {
533c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Because the popup might appear atop the attached bookmark bar, there won't
534c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // necessarily be a client edge separating it from the rest of the toolbar.
535c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Therefore we position the popup high enough so it can draw its own client
536c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // edge at the top, in the same place the toolbar would normally draw the
537c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // client edge.
538c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  *top_left_screen_coord = gfx::Point(
539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0,
540c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      parent()->height() - views::NonClientFrameView::kClientEdgeThickness);
541c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::View::ConvertPointToScreen(parent(), top_left_screen_coord);
542c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  *popup_width = parent()->width();
543c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
544c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::Rect location_bar_bounds(bounds());
545c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  location_bar_bounds.Inset(kNormalEdgeThickness, 0);
546c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  *left_margin = location_bar_bounds.x();
547c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  *right_margin = *popup_width - location_bar_bounds.right();
548c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
550c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
551c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, public LocationBar implementation:
552c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
553c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::FocusLocation(bool select_all) {
554c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->SetFocus();
555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (select_all)
556c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    omnibox_view_->SelectAll(true);
557c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
558c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
559c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::Revert() {
560c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->RevertAll();
561c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
562c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
563c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochOmniboxView* LocationBarView::GetOmniboxView() {
564c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return omnibox_view_;
565c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
566c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
567c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
568c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, public views::View implementation:
569c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
570c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::HasFocus() const {
571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return omnibox_view_->model()->has_focus();
572c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
573c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
574c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::GetAccessibleState(ui::AXViewState* state) {
5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->role = ui::AX_ROLE_GROUP;
576c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
577c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size LocationBarView::GetPreferredSize() const {
579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Compute minimum height.
580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Size min_size(border_painter_->GetMinimumSize());
581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!IsInitialized())
582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return min_size;
583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Size search_button_min_size(search_button_->GetMinimumSize());
584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  min_size.SetToMax(search_button_min_size);
585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Compute width of omnibox-leading content.
587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int horizontal_edge_thickness = GetHorizontalEdgeThickness();
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int leading_width = horizontal_edge_thickness;
589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(pkasting): Make the origin chip min width sane, and make the chip
590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // handle being shrunken down more gracefully; then uncomment this.
591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /*if (GetToolbarModel()->ShouldShowOriginChip())
592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    leading_width += origin_chip_view_->GetMinimumSize().width();*/
593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (ShouldShowKeywordBubble()) {
594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // The selected keyword view can collapse completely.
595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (ShouldShowEVBubble()) {
596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    leading_width += kBubblePadding +
597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ev_bubble_view_->GetMinimumSizeForLabelText(
598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            GetToolbarModel()->GetEVCertName()).width();
599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (!origin_chip_view_->visible()) {
600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    leading_width +=
601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        kItemPadding + location_icon_view_->GetMinimumSize().width();
602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Compute width of omnibox-trailing content.
605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int trailing_width = search_button_->visible() ?
606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (search_button_->GetMinimumSize().width() + kSearchButtonInset) :
607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      horizontal_edge_thickness;
608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  trailing_width += IncrementalMinimumWidth(star_view_) +
609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IncrementalMinimumWidth(translate_icon_view_) +
610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IncrementalMinimumWidth(open_pdf_in_reader_view_) +
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IncrementalMinimumWidth(manage_passwords_icon_view_) +
612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IncrementalMinimumWidth(zoom_view_) +
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IncrementalMinimumWidth(generated_credit_card_view_) +
6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      IncrementalMinimumWidth(mic_search_view_);
615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (PageActionViews::const_iterator i(page_action_views_.begin());
616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       i != page_action_views_.end(); ++i)
617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    trailing_width += IncrementalMinimumWidth((*i));
618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       i != content_setting_views_.end(); ++i)
620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    trailing_width += IncrementalMinimumWidth((*i));
621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  min_size.set_width(leading_width + omnibox_view_->GetMinimumSize().width() +
6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      2 * kItemPadding - omnibox_view_->GetInsets().width() + trailing_width);
624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return min_size;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::Layout() {
628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!IsInitialized())
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  origin_chip_view_->SetVisible(GetToolbarModel()->ShouldShowOriginChip());
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selected_keyword_view_->SetVisible(false);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_icon_view_->SetVisible(false);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ev_bubble_view_->SetVisible(false);
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  keyword_hint_view_->SetVisible(false);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
637868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LocationBarLayout leading_decorations(
638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      LocationBarLayout::LEFT_EDGE,
6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kItemPadding - omnibox_view_->GetInsets().left() -
6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          GetEditLeadingInternalSpace());
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  LocationBarLayout trailing_decorations(
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      LocationBarLayout::RIGHT_EDGE,
6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kItemPadding - omnibox_view_->GetInsets().right());
644868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
64546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int origin_chip_preferred_width =
64646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      origin_chip_view_->GetPreferredSize().width();
64746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int origin_chip_width =
64846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      origin_chip_view_->visible() ? origin_chip_preferred_width : 0;
64946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Always give the origin chip view its desired size and lay it out, even when
65046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // it's not visible, so we can calculate the correct animation values below
65146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // when switching to tabs that have the origin chip hidden.
65246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  origin_chip_view_->SetBounds(0, 0, origin_chip_preferred_width, height());
65346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  origin_chip_view_->Layout();
654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int bubble_location_y = vertical_edge_thickness() + kBubblePadding;
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::string16 keyword(omnibox_view_->model()->keyword());
657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // In some cases (e.g. fullscreen mode) we may have 0 height.  We still want
658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // to position our child views in this case, because other things may be
659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // positioned relative to them (e.g. the "bookmark added" bubble if the user
660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // hits ctrl-d).
661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int location_height = GetInternalHeight(false);
662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int bubble_height = std::max(location_height - (kBubblePadding * 2), 0);
663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (ShouldShowKeywordBubble()) {
664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    leading_decorations.AddDecoration(bubble_location_y, bubble_height, true, 0,
6655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      kBubblePadding, kItemPadding,
666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      selected_keyword_view_);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (selected_keyword_view_->keyword() != keyword) {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_keyword_view_->SetKeyword(keyword);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const TemplateURL* template_url =
6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          TemplateURLServiceFactory::GetForProfile(profile())->
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetTemplateURLForKeyword(keyword);
6721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (template_url &&
6731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          (template_url->GetType() == TemplateURL::OMNIBOX_API_EXTENSION)) {
6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gfx::Image image = extensions::OmniboxAPI::Get(profile())->
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetOmniboxIcon(template_url->GetExtensionId());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selected_keyword_view_->SetImage(image.AsImageSkia());
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selected_keyword_view_->set_is_extension_icon(true);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selected_keyword_view_->SetImage(
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            *(GetThemeProvider()->GetImageSkiaNamed(IDR_OMNIBOX_SEARCH)));
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selected_keyword_view_->set_is_extension_icon(false);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (ShouldShowEVBubble()) {
6853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ev_bubble_view_->SetLabel(GetToolbarModel()->GetEVCertName());
686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // The largest fraction of the omnibox that can be taken by the EV bubble.
687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const double kMaxBubbleFraction = 0.5;
688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    leading_decorations.AddDecoration(bubble_location_y, bubble_height, false,
689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      kMaxBubbleFraction, kBubblePadding,
6905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      kItemPadding, ev_bubble_view_);
691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else if (!origin_chip_view_->visible()) {
69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    leading_decorations.AddDecoration(
69390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        vertical_edge_thickness(), location_height,
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        location_icon_view_);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (star_view_->visible()) {
69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    trailing_decorations.AddDecoration(
6995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        vertical_edge_thickness(), location_height, star_view_);
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (translate_icon_view_->visible()) {
7021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    trailing_decorations.AddDecoration(
7035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        vertical_edge_thickness(), location_height, translate_icon_view_);
7041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (open_pdf_in_reader_view_->visible()) {
70690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    trailing_decorations.AddDecoration(
7075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        vertical_edge_thickness(), location_height, open_pdf_in_reader_view_);
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (manage_passwords_icon_view_->visible()) {
710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    trailing_decorations.AddDecoration(vertical_edge_thickness(),
7115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       location_height,
712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       manage_passwords_icon_view_);
713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (PageActionViews::const_iterator i(page_action_views_.begin());
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != page_action_views_.end(); ++i) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*i)->visible()) {
71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      trailing_decorations.AddDecoration(
7185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          vertical_edge_thickness(), location_height, (*i));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
72190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (zoom_view_->visible()) {
72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    trailing_decorations.AddDecoration(vertical_edge_thickness(),
7235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       location_height, zoom_view_);
72490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (ContentSettingViews::const_reverse_iterator i(
726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)           content_setting_views_.rbegin()); i != content_setting_views_.rend();
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++i) {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*i)->visible()) {
72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      trailing_decorations.AddDecoration(
7305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          bubble_location_y, bubble_height, false, 0, kItemPadding,
7315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          kItemPadding, (*i));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
734ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (generated_credit_card_view_->visible()) {
7357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    trailing_decorations.AddDecoration(vertical_edge_thickness(),
7365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       location_height,
737ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                       generated_credit_card_view_);
7387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
7397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (mic_search_view_->visible()) {
7407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    trailing_decorations.AddDecoration(vertical_edge_thickness(),
7415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       location_height, mic_search_view_);
7427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
7437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Because IMEs may eat the tab key, we don't show "press tab to search" while
7447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // IME composition is in progress.
745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!keyword.empty() && omnibox_view_->model()->is_keyword_hint() &&
746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      !omnibox_view_->IsImeComposing()) {
747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    trailing_decorations.AddDecoration(vertical_edge_thickness(),
7485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       location_height, true, 0, kItemPadding,
7495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       kItemPadding, keyword_hint_view_);
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (keyword_hint_view_->keyword() != keyword)
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      keyword_hint_view_->SetKeyword(keyword);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Perform layout.
75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int horizontal_edge_thickness = GetHorizontalEdgeThickness();
756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int full_width = width() - horizontal_edge_thickness - origin_chip_width;
757a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const gfx::Size search_button_size(search_button_->GetPreferredSize());
759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const int search_button_reserved_width =
760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      search_button_size.width() + kSearchButtonInset;
761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  full_width -= search_button_->visible() ?
762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      search_button_reserved_width : horizontal_edge_thickness;
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int entry_width = full_width;
76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  leading_decorations.LayoutPass1(&entry_width);
76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  trailing_decorations.LayoutPass1(&entry_width);
76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  leading_decorations.LayoutPass2(&entry_width);
76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  trailing_decorations.LayoutPass2(&entry_width);
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int location_needed_width = omnibox_view_->GetTextWidth();
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int available_width = entry_width - location_needed_width;
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The bounds must be wide enough for all the decorations to fit.
77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect location_bounds(
773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      origin_chip_width + horizontal_edge_thickness, vertical_edge_thickness(),
77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      std::max(full_width, full_width - entry_width), location_height);
77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  leading_decorations.LayoutPass3(&location_bounds, &available_width);
77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  trailing_decorations.LayoutPass3(&location_bounds, &available_width);
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Calculate the animation parameters (see comments on these members in the
77946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // header).  We have to do this in Layout, after |origin_chip_view_| is laid
78046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // out, because that may affect the host label offset in the origin chip.
78146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const base::string16& chip_text(origin_chip_view_->host_label_text());
78246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If the chip is clicked, the omnibox text will become the toolbar model's
78346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // formatted URL.  We can't ask the omnibox for its current text, because
78446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // while the chip is visible the current text is empty.
78546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t prefix_end = 0;
78646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const base::string16& omnibox_text(
78746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetToolbarModel()->GetFormattedURL(&prefix_end));
78846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Do a case-insensitive search to better match cases like
78946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // "Settings" <-> "chrome://settings".  Skip any pre-hostname text.
79046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t chip_text_offset = std::search(
79146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      omnibox_text.begin() + prefix_end, omnibox_text.end(),
79246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      chip_text.begin(), chip_text.end(),
79346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::CaseInsensitiveCompare<base::char16>()) - omnibox_text.begin();
79446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If we couldn't find the chip text, try checking whether the omnibox text
79546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // starts with it, as is true for e.g. file: URLs.
79646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if ((chip_text_offset >= omnibox_text.length()) &&
79746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      StartsWith(omnibox_text, chip_text, true))
79846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    chip_text_offset = 0;
79946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const gfx::FontList& font_list = omnibox_view_->GetFontList();
80046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int chip_text_width = gfx::GetStringWidth(chip_text, font_list);
80146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int old_starting_offset = starting_omnibox_offset_;
80246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int old_starting_leading_inset = starting_omnibox_leading_inset_;
80346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int old_ending_width = ending_omnibox_width_;
80446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  starting_omnibox_offset_ = current_omnibox_offset_ = 0;
80546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  starting_omnibox_leading_inset_ = current_omnibox_leading_inset_ = 0;
80646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ending_omnibox_width_ = gfx::GetStringWidth(omnibox_text, font_list);
80746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (chip_text_offset < omnibox_text.length()) {
80846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (base::i18n::IsRTL())
80946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      chip_text_offset += chip_text.length();
81046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    base::string16 extra_omnibox_text(base::i18n::IsRTL() ?
81146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        omnibox_text.substr(chip_text_offset) :
81246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        omnibox_text.substr(0, chip_text_offset));
81346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    starting_omnibox_leading_inset_ =
81446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        gfx::GetStringWidth(extra_omnibox_text, font_list);
81546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    starting_omnibox_offset_ = origin_chip_view_->HostLabelOffset() -
81646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        starting_omnibox_leading_inset_;
81746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_width_ = chip_text_width;
81846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else {
81946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // If the chip text wasn't found in the omnibox text, then instead of
82046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // starting the show animation clipped to the "hostname", we'll start with
82146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // the entire omnibox text visible, clipped to the remaining chip width, and
82246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // only animate any necessary expansion of that width, without moving the
82346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // omnibox bounds.
82446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_width_ = origin_chip_view_->WidthFromStartOfLabels();
82546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
82646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
82746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // End the animations immediately if the parameters have changed.
82846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if ((starting_omnibox_offset_ != old_starting_offset) ||
82946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (starting_omnibox_leading_inset_ != old_starting_leading_inset) ||
83046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (ending_omnibox_width_ != old_ending_width))
83146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EndOriginChipAnimations(true);
83246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
83346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Also end the animations immediately if there's nothing to animate (but do
83446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // allow the chip to fade back in).
83546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const ui::NativeTheme* native_theme = GetNativeTheme();
83646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const SkColor ending_selection_text_color = native_theme->GetSystemColor(
83746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ui::NativeTheme::kColorId_TextfieldSelectionColor);
83846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const SkColor ending_selection_background_color =
83946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      native_theme->GetSystemColor(
84046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused);
84146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if ((starting_omnibox_offset_ == 0) &&
84246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (starting_omnibox_leading_inset_ == 0) &&
84346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (ending_omnibox_width_ == chip_text_width) &&
84446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (hide_url_animation_->is_animating() ||
84546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ((ending_selection_text_color ==
84646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            origin_chip_view_->pressed_text_color()) &&
84746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        (ending_selection_background_color ==
84846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            origin_chip_view_->pressed_background_color()))))
84946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EndOriginChipAnimations(false);
85046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
85146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (show_url_animation_->is_animating()) {
85246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    omnibox_view_->SetSelectionTextColor(gfx::Tween::ColorValueBetween(
85346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        show_url_animation_->GetCurrentValue(),
85446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        origin_chip_view_->pressed_text_color(),
85546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ending_selection_text_color));
85646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    omnibox_view_->SetSelectionBackgroundColor(gfx::Tween::ColorValueBetween(
85746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        show_url_animation_->GetCurrentValue(),
85846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        origin_chip_view_->pressed_background_color(),
85946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ending_selection_background_color));
86046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_offset_ =
86146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        show_url_animation_->CurrentValueBetween(starting_omnibox_offset_, 0);
86246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_leading_inset_ = show_url_animation_->CurrentValueBetween(
86346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        starting_omnibox_leading_inset_, 0);
86446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_width_ = show_url_animation_->CurrentValueBetween(
86546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        chip_text_width, ending_omnibox_width_);
86646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else if (hide_url_animation_->is_animating()) {
86746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_offset_ =
86846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        hide_url_animation_->CurrentValueBetween(0, starting_omnibox_offset_);
86946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_leading_inset_ = hide_url_animation_->CurrentValueBetween(
87046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        0, starting_omnibox_leading_inset_);
87146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_omnibox_width_ = hide_url_animation_->CurrentValueBetween(
87246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ending_omnibox_width_, chip_text_width);
87346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
87446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Contract |available_width| as necessary, but never expand it.  This way,
87546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // we'll never draw suggested text at first and then have it disappear
87646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // midway through the animation.
87746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (current_omnibox_offset_ > 0)
87846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    available_width -= current_omnibox_offset_;
87946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  location_bounds.Inset(current_omnibox_offset_, 0, 0, 0);
88046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout out the suggested text view right aligned to the location
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // entry. Only show the suggested text if we can fit the text from one
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // character before the end of the selection to the end of the text and the
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // suggested text. If we can't it means either the suggested text is too big,
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or the user has scrolled.
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(sky): We could potentially adjust this to take into account suggested
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // text to force using minimum size if necessary, but currently the chance of
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // showing keyword hints and suggested text is minimal and we're not confident
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this is the right approach for suggested text.
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int omnibox_view_margin = 0;
89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (suggested_text_view_->visible()) {
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We do not display the suggested text when it contains a mix of RTL and
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // LTR characters since this could mean the suggestion should be displayed
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // in the middle of the string.
89790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::i18n::TextDirection text_direction =
898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::i18n::GetStringDirection(omnibox_view_->GetText());
89990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (text_direction !=
90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::i18n::GetStringDirection(suggested_text_view_->text()))
90190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      text_direction = base::i18n::UNKNOWN_DIRECTION;
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(sky): need to layout when the user changes caret position.
90490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gfx::Size suggested_text_size(suggested_text_view_->GetPreferredSize());
90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (suggested_text_size.width() > available_width ||
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        text_direction == base::i18n::UNKNOWN_DIRECTION) {
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Hide the suggested text if the user has scrolled or we can't fit all
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // the suggested text, or we have a mix of RTL and LTR characters.
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      suggested_text_view_->SetBounds(0, 0, 0, 0);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      location_needed_width =
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          std::min(location_needed_width,
91390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   location_bounds.width() - suggested_text_size.width());
9140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      gfx::Rect suggested_text_bounds(location_bounds.x(), location_bounds.y(),
9150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      suggested_text_size.width(),
9160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      location_bounds.height());
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(sky): figure out why this needs the -1.
91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      suggested_text_bounds.Offset(location_needed_width - 1, 0);
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // We reverse the order of the location entry and suggested text if:
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // - Chrome is RTL but the text is fully LTR, or
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // - Chrome is LTR but the text is fully RTL.
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // This ensures the suggested text is correctly displayed to the right
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // (or left) of the user text.
92590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (text_direction == (base::i18n::IsRTL() ?
92690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::i18n::LEFT_TO_RIGHT : base::i18n::RIGHT_TO_LEFT)) {
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // TODO(sky): Figure out why we need the +1.
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        suggested_text_bounds.set_x(location_bounds.x() + 1);
929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // Use a margin to prevent omnibox text from overlapping suggest text.
930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        omnibox_view_margin = suggested_text_bounds.width();
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      suggested_text_view_->SetBoundsRect(suggested_text_bounds);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  omnibox_view_->SetBorder(
9371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      views::Border::CreateEmptyBorder(0, 0, 0, omnibox_view_margin));
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
939868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Layout |ime_inline_autocomplete_view_| next to the user input.
940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (ime_inline_autocomplete_view_->visible()) {
941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int width =
9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gfx::GetStringWidth(ime_inline_autocomplete_view_->text(),
9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            ime_inline_autocomplete_view_->font_list()) +
944868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ime_inline_autocomplete_view_->GetInsets().width();
945868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // All the target languages (IMEs) are LTR, and we do not need to support
946868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // RTL so far.  In other words, no testable RTL environment so far.
947868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int x = location_needed_width;
948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (width > entry_width)
949868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      x = 0;
950868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    else if (location_needed_width + width > entry_width)
951868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      x = entry_width - width;
952868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    location_bounds.set_width(x);
953868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ime_inline_autocomplete_view_->SetBounds(
954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        location_bounds.right(), location_bounds.y(),
9550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        std::min(width, entry_width), location_bounds.height());
956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
957868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
958f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  omnibox_view_->SetBoundsRect(location_bounds);
959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  search_button_->SetBoundsRect(gfx::Rect(
961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      gfx::Point(width() - search_button_reserved_width, 0),
962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      search_button_size));
963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
965c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
966c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, public OmniboxEditController implementation:
9677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
9684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void LocationBarView::Update(const WebContents* contents) {
9694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  mic_search_view_->SetVisible(
9704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      !GetToolbarModel()->input_in_progress() && browser_ &&
9714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      browser_->search_model()->voice_search_supported());
972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RefreshContentSettingViews();
9734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  generated_credit_card_view_->Update();
9744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ZoomBubbleView::CloseBubble();
9755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TranslateBubbleView::CloseBubble();
9764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RefreshZoomView();
9774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RefreshPageActionViews();
9781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RefreshTranslateIcon();
979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RefreshManagePasswordsIconView();
980f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  content::WebContents* web_contents_for_sub_views =
981f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GetToolbarModel()->input_in_progress() ? NULL : GetWebContents();
982f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  open_pdf_in_reader_view_->Update(web_contents_for_sub_views);
9834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (star_view_)
9851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateBookmarkStarVisibility();
9864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (contents)
988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    omnibox_view_->OnTabChanged(contents);
9894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  else
990f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    omnibox_view_->Update();
9914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  OnChanged();  // NOTE: Calls Layout().
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid LocationBarView::ShowURL() {
99646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Start the animation before calling ShowURL(), since the latter eventually
99746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // calls back to Layout(), and if the animation is not marked as "running",
99846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // we'll draw the omnibox in its final position briefly until the first
99946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // animation callback reaches us.
1000cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (chrome::ShouldDisplayOriginChip()) {
100146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // If we're currently hiding, reverse the hide by swapping to the show
100246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // animation, offset so that the text is in the same position.
100346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (hide_url_animation_->is_animating()) {
100446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const double show_value = GetValueForAnimation(false);
100546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      hide_url_animation_->Reset();
100646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      show_url_animation_->Show();
100746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      // This must be done after calling Show() and is not equivalent to
100846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      // calling Reset(n) before Show(); Reset() would have caused the entire
100946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      // animation curve (and time) to run between this value and the final
101046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      // value, whereas Show() + SetCurrentValue() skips the animation forward
101146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      // to the supplied value.
101246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      show_url_animation_->SetCurrentValue(show_value);
101346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    } else {
101446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      show_url_animation_->Show();
101546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
1016effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
101746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  omnibox_view_->ShowURL();
101846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
101946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
102046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LocationBarView::EndOriginChipAnimations(bool cancel_fade) {
102146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  show_url_animation_->End();
102246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  hide_url_animation_->End();
102346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (cancel_fade)
102446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    origin_chip_view_->CancelFade();
1025effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1026effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1027c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochToolbarModel* LocationBarView::GetToolbarModel() {
1028c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return delegate_->GetToolbarModel();
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)WebContents* LocationBarView::GetWebContents() {
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return delegate_->GetWebContents();
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1036c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private:
10373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
1039cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int LocationBarView::IncrementalMinimumWidth(views::View* view) {
1040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return view->visible() ? (kItemPadding + view->GetMinimumSize().width()) : 0;
1041cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1042cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1043c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint LocationBarView::GetHorizontalEdgeThickness() const {
1044c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // In maximized popup mode, there isn't any edge.
1045c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return (is_popup_mode_ && browser_ && browser_->window() &&
1046c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      browser_->window()->IsMaximized()) ? 0 : vertical_edge_thickness();
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1049c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::RefreshContentSettingViews() {
1050c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool visibility_changed = false;
1051c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
1052c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       i != content_setting_views_.end(); ++i) {
1053c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const bool was_visible = (*i)->visible();
1054c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    (*i)->Update(GetToolbarModel()->input_in_progress() ?
1055c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        NULL : GetWebContents());
1056c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (was_visible != (*i)->visible())
1057c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      visibility_changed = true;
1058c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1059c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return visibility_changed;
1060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1061a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1062c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::DeletePageActionViews() {
1063c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (PageActionViews::const_iterator i(page_action_views_.begin());
1064c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       i != page_action_views_.end(); ++i)
1065c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    RemoveChildView(*i);
1066c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  STLDeleteElements(&page_action_views_);
1067c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
106858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1069c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::RefreshPageActionViews() {
1070c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (is_popup_mode_)
1071c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1073c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool changed = false;
1074c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PageActions new_page_actions;
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebContents* web_contents = GetWebContents();
10775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (web_contents) {
1078c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    extensions::TabHelper* extensions_tab_helper =
10795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        extensions::TabHelper::FromWebContents(web_contents);
1080c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    extensions::LocationBarController* controller =
1081c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        extensions_tab_helper->location_bar_controller();
1082c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    new_page_actions = controller->GetCurrentActions();
1083a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
1084a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1085c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // On startup we sometimes haven't loaded any extensions. This makes sure
1086c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // we catch up when the extensions (and any page actions) load.
1087c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (page_actions_ != new_page_actions) {
1088c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    changed = true;
10897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1090c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    page_actions_.swap(new_page_actions);
1091c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DeletePageActionViews();  // Delete the old views (if any).
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1093c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Create the page action views.
1094c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (PageActions::const_iterator i = page_actions_.begin();
1095c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         i != page_actions_.end(); ++i) {
1096c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      PageActionWithBadgeView* page_action_view = new PageActionWithBadgeView(
1097c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          delegate_->CreatePageActionImageView(this, *i));
1098c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      page_action_view->SetVisible(false);
1099c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      page_action_views_.push_back(page_action_view);
1100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
1101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Move rightmost extensions to the start.
1103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    std::stable_partition(
1104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        page_action_views_.begin(),
1105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        page_action_views_.end(),
1106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        IsPageActionViewRightAligned(
11075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            extensions::ExtensionRegistry::Get(profile())));
1108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    View* right_anchor = open_pdf_in_reader_view_;
1110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (!right_anchor)
1111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      right_anchor = star_view_;
1112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DCHECK(right_anchor);
1113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // |page_action_views_| are ordered right-to-left.  Add them as children in
1115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // reverse order so the logical order and visual order match for
1116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // accessibility purposes.
1117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (PageActionViews::reverse_iterator i = page_action_views_.rbegin();
1118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         i != page_action_views_.rend(); ++i)
1119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      AddChildViewAt(*i, GetIndexOf(right_anchor));
1120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
11225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!page_action_views_.empty() && web_contents) {
1123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (PageActionViews::const_iterator i(page_action_views_.begin());
1124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         i != page_action_views_.end(); ++i) {
112503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      bool old_visibility = (*i)->visible();
1126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      (*i)->UpdateVisibility(
11275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          GetToolbarModel()->input_in_progress() ? NULL : web_contents);
112803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      changed |= old_visibility != (*i)->visible();
1129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
1130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return changed;
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::RefreshZoomView() {
1135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(zoom_view_);
1136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebContents* web_contents = GetWebContents();
1137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!web_contents)
1138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
1139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const bool was_visible = zoom_view_->visible();
1140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  zoom_view_->Update(ZoomController::FromWebContents(web_contents));
1141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return was_visible != zoom_view_->visible();
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::RefreshTranslateIcon() {
1145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!TranslateService::IsTranslateBubbleEnabled())
1146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebContents* web_contents = GetWebContents();
1149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!web_contents)
1150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
11515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  translate::LanguageState& language_state =
115246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ChromeTranslateClient::FromWebContents(web_contents)->GetLanguageState();
1153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool enabled = language_state.translate_enabled();
1154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  command_updater()->UpdateCommandEnabled(IDC_TRANSLATE_PAGE, enabled);
1155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  translate_icon_view_->SetVisible(enabled);
1156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  translate_icon_view_->SetToggled(language_state.IsPageTranslated());
1157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::RefreshManagePasswordsIconView() {
1160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(manage_passwords_icon_view_);
1161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebContents* web_contents = GetWebContents();
1162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!web_contents)
1163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
1164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const bool was_visible = manage_passwords_icon_view_->visible();
1165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ManagePasswordsUIController::FromWebContents(
11665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      web_contents)->UpdateIconAndBubbleState(manage_passwords_icon_view_);
1167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return was_visible != manage_passwords_icon_view_->visible();
1168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::ShowFirstRunBubbleInternal() {
1171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // First run bubble doesn't make sense for Chrome OS.
1172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_CHROMEOS)
1173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebContents* web_contents = delegate_->GetWebContents();
1174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!web_contents)
1175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
1177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (browser)
1178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    FirstRunBubble::ShowBubble(browser, location_icon_view_);
1179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::HasValidSuggestText() const {
1183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return suggested_text_view_->visible() &&
1184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      !suggested_text_view_->size().IsEmpty();
1185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool LocationBarView::ShouldShowKeywordBubble() const {
1188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return !omnibox_view_->model()->keyword().empty() &&
1189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      !omnibox_view_->model()->is_keyword_hint();
1190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool LocationBarView::ShouldShowEVBubble() const {
1193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return !chrome::ShouldDisplayOriginChip() &&
1194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (GetToolbarModel()->GetSecurityLevel(false) == ToolbarModel::EV_SECURE);
1195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
119746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)double LocationBarView::GetValueForAnimation(bool hide) const {
119846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int calculated_offset;
119946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const gfx::Tween::Type tween_type = hide ? kHideTweenType : kShowTweenType;
120046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int start_offset = starting_omnibox_offset_, end_offset = 0;
120146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (hide)
120246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    std::swap(start_offset, end_offset);
120346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int desired_offset = abs(current_omnibox_offset_);
120446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Binary-search the value space (0 <= value <= 1) to find the appropriate
120546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // position.  We only bother to iterate to within 1/64 of the desired value,
120646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // because the longer of the two animations will only run for twelve frames
120746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // anyway (200 ms * 60 Hz), so at this point we'll have a maximum error of
120846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // less than a fifth of an animation frame, which the user isn't going to
120946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // notice.
121046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  //
121146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // We have to use this method because Tween::CalculateValue() is not
121246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // necessarily easily invertible.  Luckily, this only runs when the user
121346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // reverses the animation (rare), and the limit on how many iterations we'll
121446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // do ensures the cost is unnoticeable.
121546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  double value = 0.5;
121646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  double step = value / 2;
121746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  do {
121846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    calculated_offset = abs(gfx::Tween::IntValueBetween(
121946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        gfx::Tween::CalculateValue(tween_type, value), start_offset,
122046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        end_offset));
122146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (calculated_offset < desired_offset)
122246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      value += step;
122346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    else if (calculated_offset > desired_offset)
122446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      value -= step;
122546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    step /= 2;
122646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } while ((calculated_offset != desired_offset) && (step >= (1.0 / 64)));
122746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return value;
122846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
122946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
123046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LocationBarView::ResetShowAnimationAndColors() {
123146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  show_url_animation_->Reset();
123246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  omnibox_view_->UseDefaultSelectionTextColor();
123346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  omnibox_view_->UseDefaultSelectionBackgroundColor();
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private LocationBar implementation:
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::ShowFirstRunBubble() {
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until search engines have loaded to show the first run bubble.
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* url_service =
12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(profile());
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url_service->loaded()) {
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    template_url_service_ = url_service;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    template_url_service_->AddObserver(this);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    template_url_service_->Load();
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowFirstRunBubbleInternal();
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)GURL LocationBarView::GetDestinationURL() const {
12534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return destination_url();
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowOpenDisposition LocationBarView::GetWindowOpenDisposition() const {
12574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return disposition();
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciui::PageTransition LocationBarView::GetPageTransition() const {
12614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return transition();
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::AcceptInput() {
1265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  omnibox_view_->model()->AcceptInput(CURRENT_TAB, false);
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::FocusSearch() {
1269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  omnibox_view_->SetFocus();
1270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  omnibox_view_->SetForcedQuery();
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::UpdateContentSettingsIcons() {
1274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (RefreshContentSettingViews()) {
1275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Layout();
1276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SchedulePaint();
1277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::UpdateManagePasswordsIconAndBubble() {
1281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (RefreshManagePasswordsIconView()) {
1282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Layout();
1283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SchedulePaint();
1284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::UpdatePageActions() {
128803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (RefreshPageActionViews()) {  // Changed.
1289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Layout();
1290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SchedulePaint();
1291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::InvalidatePageActions() {
1295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DeletePageActionViews();
1296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1297c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
12981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid LocationBarView::UpdateBookmarkStarVisibility() {
12991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (star_view_) {
13001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    star_view_->SetVisible(
13011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser_defaults::bookmarks_enabled && !is_popup_mode_ &&
13021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        !GetToolbarModel()->input_in_progress() &&
13031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        edit_bookmarks_enabled_.GetValue() &&
13041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        !IsBookmarkStarHiddenByExtension());
13051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
13061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool LocationBarView::ShowPageActionPopup(
13091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const extensions::Extension* extension,
13101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool grant_tab_permissions) {
13111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionAction* extension_action =
13121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extensions::ExtensionActionManager::Get(profile())->GetPageAction(
13131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *extension);
13141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(extension_action);
13151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return GetPageActionView(extension_action)->image_view()->view_controller()->
13161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ExecuteAction(ExtensionPopup::SHOW, grant_tab_permissions);
13171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::UpdateOpenPDFInReaderPrompt() {
1320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  open_pdf_in_reader_view_->Update(
1321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GetToolbarModel()->input_in_progress() ? NULL : GetWebContents());
1322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Layout();
1323c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SchedulePaint();
1324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::UpdateGeneratedCreditCardView() {
1327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  generated_credit_card_view_->Update();
1328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Layout();
1329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SchedulePaint();
1330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::SaveStateToContents(WebContents* contents) {
133346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If we're about to switch tabs, complete any current animations, so that if
133446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // the user is in the midst of hiding the URL, when he returns to this tab,
133546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // the URL will be hidden rather than shown.
133646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // NOTE: This must be called before SaveStateToTab().
133746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EndOriginChipAnimations(true);
1338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->SaveStateToTab(contents);
1339c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1341c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst OmniboxView* LocationBarView::GetOmniboxView() const {
1342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return omnibox_view_;
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocationBarTesting* LocationBarView::GetLocationBarForTesting() {
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private LocationBarTesting implementation:
1351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocationBarView::PageActionCount() {
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return page_action_views_.size();
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocationBarView::PageActionVisibleCount() {
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = 0;
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < page_action_views_.size(); i++) {
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (page_action_views_[i]->visible())
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++result;
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionAction* LocationBarView::GetPageAction(size_t index) {
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index < page_action_views_.size())
13675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return page_action_views_[index]->image_view()->extension_action();
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionAction* LocationBarView::GetVisiblePageAction(size_t index) {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t current = 0;
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < page_action_views_.size(); ++i) {
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (page_action_views_[i]->visible()) {
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (current == index)
13785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return page_action_views_[i]->image_view()->extension_action();
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++current;
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocationBarView::TestPageActionPressed(size_t index) {
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t current = 0;
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < page_action_views_.size(); ++i) {
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (page_action_views_[i]->visible()) {
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (current == index) {
13935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        page_action_views_[i]->image_view()->view_controller()->
13945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            ExecuteAction(ExtensionPopup::SHOW, true);
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++current;
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocationBarView::GetBookmarkStarVisibility() {
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(star_view_);
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return star_view_->visible();
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private views::View implementation:
1411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char* LocationBarView::GetClassName() const {
1413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return kViewClassName;
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
1417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  InstantServiceFactory::GetForProfile(profile())->OnOmniboxStartMarginChanged(
1418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      bounds().x());
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  OmniboxPopupView* popup = omnibox_view_->model()->popup_model()->view();
1421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (popup->IsOpen())
1422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    popup->UpdatePopupAppearance();
1423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
14245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
142546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LocationBarView::OnFocus() {
142646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Explicitly focus the omnibox so a focus ring will be displayed around it on
142746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Windows.
142846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  omnibox_view_->SetFocus();
142946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
143046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::OnPaint(gfx::Canvas* canvas) {
1432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  View::OnPaint(canvas);
1433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Fill the location bar background color behind the border.  Parts of the
1435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // border images are meant to rest atop the toolbar background and parts atop
1436c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // the omnibox background, so we can't just blindly fill our entire bounds.
1437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::Rect bounds(GetContentsBounds());
1438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bounds.Inset(GetHorizontalEdgeThickness(), vertical_edge_thickness());
1439c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SkColor color(GetColor(ToolbarModel::NONE, BACKGROUND));
1440c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (is_popup_mode_) {
1441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    canvas->FillRect(bounds, color);
1442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else {
1443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SkPaint paint;
1444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    paint.setStyle(SkPaint::kFill_Style);
1445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    paint.setColor(color);
1446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const int kBorderCornerRadius = 2;
1447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    canvas->DrawRoundRect(bounds, kBorderCornerRadius, paint);
14487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The border itself will be drawn in PaintChildren() since it includes an
1451c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // inner shadow which should be drawn over the contents.
14527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
14537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LocationBarView::PaintChildren(gfx::Canvas* canvas,
1455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    const views::CullSet& cull_set) {
145646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Paint all the children except for the omnibox itself, which may need to be
145746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // clipped if it's animating in, and the origin chip and the search button,
1458c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // which will be painted after the border.
14590de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  for (int i = 0, count = child_count(); i < count; ++i) {
146046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    views::View* child = child_at(i);
146146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!child->layer() && (child != omnibox_view_) &&
146246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        (child != origin_chip_view_) && (child != search_button_))
146346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      child->Paint(canvas, cull_set);
146446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
146546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
146646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  {
146746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    gfx::ScopedCanvas scoped_canvas(canvas);
146846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (show_url_animation_->is_animating() ||
146946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        hide_url_animation_->is_animating()) {
147046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      gfx::Rect clip_rect(omnibox_view_->bounds());
147146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      clip_rect.Inset(current_omnibox_leading_inset_, 0, 0, 0);
147246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      clip_rect.set_width(current_omnibox_width_);
147346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      clip_rect.set_x(GetMirroredXForRect(clip_rect));
147446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      canvas->ClipRect(clip_rect);
147546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
147646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    omnibox_view_->Paint(canvas, cull_set);
14770de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  }
1478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // For non-InstantExtendedAPI cases, if necessary, show focus rect. As we need
1480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // the focus rect to appear on top of children we paint here rather than
1481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // OnPaint().
1482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Note: |Canvas::DrawFocusRect| paints a dashed rect with gray color.
1483c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (show_focus_rect_ && HasFocus())
1484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    canvas->DrawFocusRect(omnibox_view_->bounds());
1485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Maximized popup windows don't draw the horizontal edges.  We implement this
1487c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // by simply expanding the paint area outside the view by the edge thickness.
1488c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::Rect border_rect(GetContentsBounds());
1489c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (is_popup_mode_ && (GetHorizontalEdgeThickness() == 0))
1490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    border_rect.Inset(-kPopupEdgeThickness, 0);
1491c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::Painter::PaintPainterAt(canvas, border_painter_.get(), border_rect);
1492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1493c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The origin chip and the search button must be painted after the border so
1494c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // that the border shadow is not drawn over them.
1495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  origin_chip_view_->Paint(canvas, cull_set);
1496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  search_button_->Paint(canvas, cull_set);
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1500c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private views::ButtonListener implementation:
150158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1502c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::ButtonPressed(views::Button* sender,
1503c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                    const ui::Event& event) {
1504c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (sender == mic_search_view_) {
1505c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    command_updater()->ExecuteCommand(IDC_TOGGLE_SPEECH_INPUT);
1506c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1508c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1509c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK_EQ(search_button_, sender);
1510c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // TODO(pkasting): When macourteau adds UMA stats for this, wire them up here.
1511c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  omnibox_view_->model()->AcceptInput(
1512c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ui::DispositionFromEventFlags(event.flags()), false);
151358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
151458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1515c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1516c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private views::DragController implementation:
1517c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1518c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::WriteDragDataForView(views::View* sender,
1519c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                           const gfx::Point& press_pt,
1520c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                           OSExchangeData* data) {
1521c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK_NE(GetDragOperationsForView(sender, press_pt),
1522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            ui::DragDropTypes::DRAG_NONE);
1523c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1524c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebContents* web_contents = GetWebContents();
1525c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FaviconTabHelper* favicon_tab_helper =
1526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FaviconTabHelper::FromWebContents(web_contents);
1527c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::ImageSkia favicon = favicon_tab_helper->GetFavicon().AsImageSkia();
1528c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  button_drag_utils::SetURLAndDragImage(web_contents->GetURL(),
1529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        web_contents->GetTitle(),
1530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        favicon,
1531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                        NULL,
1532c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        data,
1533c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        sender->GetWidget());
153458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
153558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1536c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint LocationBarView::GetDragOperationsForView(views::View* sender,
1537c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                              const gfx::Point& p) {
1538c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK((sender == location_icon_view_) || (sender == ev_bubble_view_) ||
1539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         (sender == origin_chip_view_));
1540c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebContents* web_contents = delegate_->GetWebContents();
1541c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return (web_contents && web_contents->GetURL().is_valid() &&
1542c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          (!GetOmniboxView()->IsEditingOrEmpty() ||
1543c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch           sender == origin_chip_view_)) ?
1544c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      (ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_LINK) :
1545c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ui::DragDropTypes::DRAG_NONE;
154658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
154758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1548c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool LocationBarView::CanStartDragForView(View* sender,
1549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                          const gfx::Point& press_pt,
1550c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                          const gfx::Point& p) {
1551c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return true;
155258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
155358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1554c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private OmniboxEditController implementation:
1556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1557c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::OnChanged() {
1558c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int icon_id = omnibox_view_->GetIcon();
1559c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  location_icon_view_->SetImage(GetThemeProvider()->GetImageSkiaNamed(icon_id));
1560c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  location_icon_view_->ShowTooltip(!GetOmniboxView()->IsEditingOrEmpty());
156158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1562c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ToolbarModel* toolbar_model = GetToolbarModel();
1563c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  chrome::DisplaySearchButtonConditions conditions =
1564c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      chrome::GetDisplaySearchButtonConditions();
1565c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool meets_conditions =
1566c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      (conditions == chrome::DISPLAY_SEARCH_BUTTON_ALWAYS) ||
1567c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ((conditions != chrome::DISPLAY_SEARCH_BUTTON_NEVER) &&
1568c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       (toolbar_model->WouldPerformSearchTermReplacement(true) ||
1569c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        ((conditions == chrome::DISPLAY_SEARCH_BUTTON_FOR_STR_OR_IIP) &&
1570c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         toolbar_model->input_in_progress())));
1571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  search_button_->SetVisible(!is_popup_mode_ && meets_conditions);
1572f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  search_button_->UpdateIcon(icon_id == IDR_OMNIBOX_SEARCH);
157358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
157446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  origin_chip_view_->OnChanged();
157558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1576c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Layout();
1577c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SchedulePaint();
1578c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1580c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::OnSetFocus() {
1581c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GetFocusManager()->SetFocusedView(this);
1582c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
158358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1584c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochInstantController* LocationBarView::GetInstant() {
1585c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return delegate_->GetInstant();
1586c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
15875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1588c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst ToolbarModel* LocationBarView::GetToolbarModel() const {
1589c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return delegate_->GetToolbarModel();
1590c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
15915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1592c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::HideURL() {
159346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(chrome::ShouldDisplayOriginChip());
159446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
159546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If we're currently showing, reverse the hide by swapping to the hide
159646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // animation, offset so that the text is in the same position.
159746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (show_url_animation_->is_animating()) {
159846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const double hide_value = GetValueForAnimation(true);
159946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ResetShowAnimationAndColors();
160046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    hide_url_animation_->Show();
160146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // This must be done after calling Show() and is not equivalent to Reset(n);
160246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // see comments in ShowURL().
160346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    hide_url_animation_->SetCurrentValue(hide_value);
160446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else {
160546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    hide_url_animation_->Show();
160646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
1607c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
160858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1609c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1610c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private DropdownBarHostDelegate implementation:
161158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1612c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::SetFocusAndSelection(bool select_all) {
1613c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FocusLocation(select_all);
1614c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
161558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1616c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::SetAnimationOffset(int offset) {
1617c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  dropdown_animation_offset_ = offset;
1618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
161958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1620c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private gfx::AnimationDelegate implementation:
1622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1623c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::AnimationProgressed(const gfx::Animation* animation) {
162446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK((animation == show_url_animation_.get()) ||
162546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (animation == hide_url_animation_.get()));
162646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Layout();
162746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SchedulePaint();
162858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
162958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1630c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::AnimationEnded(const gfx::Animation* animation) {
1631c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (animation == show_url_animation_.get()) {
163246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ResetShowAnimationAndColors();
163346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Layout();
163446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SchedulePaint();
163546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else {
163646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DCHECK(animation == hide_url_animation_.get());
1637c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    hide_url_animation_->Reset();
163846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    origin_chip_view_->FadeIn();
163946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    omnibox_view_->HideURL();  // Calls OnChanged(), triggering layout.
1640c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
164258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1643c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1644c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private TemplateURLServiceObserver implementation:
1645c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1646c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::OnTemplateURLServiceChanged() {
1647c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  template_url_service_->RemoveObserver(this);
1648c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  template_url_service_ = NULL;
1649c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // If the browser is no longer active, let's not show the info bubble, as this
1650c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // would make the browser the active window again.
1651c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (omnibox_view_ && omnibox_view_->GetWidget()->IsActive())
1652c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ShowFirstRunBubble();
165358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
165458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch////////////////////////////////////////////////////////////////////////////////
1656c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LocationBarView, private SearchModelObserver implementation:
165758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1658c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LocationBarView::ModelChanged(const SearchModel::State& old_state,
1659c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                   const SearchModel::State& new_state) {
1660c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const bool visible = !GetToolbarModel()->input_in_progress() &&
1661c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new_state.voice_search_supported;
1662c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (mic_search_view_->visible() != visible) {
1663c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    mic_search_view_->SetVisible(visible);
1664c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Layout();
1665c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
166658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
1667