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