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/omnibox/omnibox_view_views.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <set> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/command_line.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/metrics/histogram.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_updater.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_edit_controller.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_edit_model.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_model.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/view_ids.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_view.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h" 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/views/settings_api_bubble_helper_views.h" 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/views/website_settings/website_settings_popup_view.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_node_data.h" 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_input.h" 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h" 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/omnibox/omnibox_field_trial.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/common/constants.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h" 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/aura/client/focus_client.h" 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/aura/window_event_dispatcher.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/scoped_clipboard_writer.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ime/text_input_client.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ime/text_input_type.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/simple_menu_model.h" 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/compositor/layer.h" 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/gfx/font_list.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/selection_model.h" 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/strings/grit/ui_strings.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/border.h" 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/button_drag_utils.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/ime/input_method.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_delegate.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN) 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/browser_process.h" 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using bookmarks::BookmarkNodeData; 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// OmniboxState --------------------------------------------------------------- 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stores omnibox state for each tab. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct OmniboxState : public base::SupportsUserData::Data { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const char kKey[]; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OmniboxState(const OmniboxEditModel::State& model_state, 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::Range& selection, 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::Range& saved_selection_for_focus_change); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~OmniboxState(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OmniboxEditModel::State model_state; 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // We store both the actual selection and any saved selection (for when the 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // omnibox is not focused). This allows us to properly handle cases like 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // selecting text, tabbing out of the omnibox, switching tabs away and back, 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // and tabbing back into the omnibox. 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::Range selection; 8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::Range saved_selection_for_focus_change; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char OmniboxState::kKey[] = "OmniboxState"; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OmniboxState::OmniboxState(const OmniboxEditModel::State& model_state, 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::Range& selection, 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::Range& saved_selection_for_focus_change) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : model_state(model_state), 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) selection(selection), 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) saved_selection_for_focus_change(saved_selection_for_focus_change) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)OmniboxState::~OmniboxState() { 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Helpers -------------------------------------------------------------------- 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// We'd like to set the text input type to TEXT_INPUT_TYPE_URL, because this 107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// triggers URL-specific layout in software keyboards, e.g. adding top-level "/" 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// and ".com" keys for English. However, this also causes IMEs to default to 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Latin character mode, which makes entering search queries difficult for IME 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// users. Therefore, we try to guess whether an IME will be used based on the 111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// application language, and set the input type accordingly. 112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ui::TextInputType DetermineTextInputType() { 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN) 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(g_browser_process); 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& locale = g_browser_process->GetApplicationLocale(); 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& language = locale.substr(0, 2); 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Assume CJK + Thai users are using an IME. 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (language == "ja" || 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) language == "ko" || 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) language == "th" || 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) language == "zh") 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ui::TEXT_INPUT_TYPE_SEARCH; 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return ui::TEXT_INPUT_TYPE_URL; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// OmniboxViewViews ----------------------------------------------------------- 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 133b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char OmniboxViewViews::kViewClassName[] = "OmniboxViewViews"; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OmniboxViewViews::OmniboxViewViews(OmniboxEditController* controller, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandUpdater* command_updater, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool popup_window_mode, 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LocationBarView* location_bar, 1400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const gfx::FontList& font_list) 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) : OmniboxView(profile, controller, command_updater), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_window_mode_(popup_window_mode), 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) security_level_(ToolbarModel::NONE), 14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) saved_selection_for_focus_change_(gfx::Range::InvalidRange()), 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_composing_before_change_(false), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_at_end_pressed_(false), 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_bar_view_(location_bar), 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_candidate_window_open_(false), 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) select_all_on_mouse_release_(false), 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) select_all_on_gesture_tap_(false), 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_ptr_factory_(this) { 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetBorder(views::Border::NullBorder()); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_id(VIEW_ID_OMNIBOX); 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetFontList(font_list); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OmniboxViewViews::~OmniboxViewViews() { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) chromeos::input_method::InputMethodManager::Get()-> 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveCandidateWindowObserver(this); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explicitly teardown members which have a reference to us. Just to be safe 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we want them to be destroyed before destroying any other internal state. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_view_.reset(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::Init() { 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_controller(this); 170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SetTextInputType(DetermineTextInputType()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (popup_window_mode_) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetReadOnly(true); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initialize the popup view using the same font. 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_view_.reset(OmniboxPopupContentsView::Create( 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetFontList(), this, model(), location_bar_view_)); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 180a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) chromeos::input_method::InputMethodManager::Get()-> 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddCandidateWindowObserver(this); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OmniboxViewViews::SaveStateToTab(content::WebContents* tab) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(tab); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't want to keep the IME status, so force quit the current 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // session here. It may affect the selection status, so order is 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // also important. 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsIMEComposing()) { 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetTextInputClient()->ConfirmCompositionText(); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetInputMethod()->CancelComposition(this); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // NOTE: GetStateForTabSwitch() may affect GetSelectedRange(), so order is 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // important. 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OmniboxEditModel::State state = model()->GetStateForTabSwitch(); 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) tab->SetUserData(OmniboxState::kKey, new OmniboxState( 20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) state, GetSelectedRange(), saved_selection_for_focus_change_)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void OmniboxViewViews::OnTabChanged(const content::WebContents* web_contents) { 204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) security_level_ = controller()->GetToolbarModel()->GetSecurityLevel(false); 205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const OmniboxState* state = static_cast<OmniboxState*>( 207424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) web_contents->GetUserData(&OmniboxState::kKey)); 208424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) model()->RestoreState(state ? &state->model_state : NULL); 20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (state) { 21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This assumes that the omnibox has already been focused or blurred as 21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // appropriate; otherwise, a subsequent OnFocus() or OnBlur() call could 21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // goof up the selection. See comments at the end of 21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // BrowserView::ActiveTabChanged(). 21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SelectRange(state->selection); 21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) saved_selection_for_focus_change_ = state->saved_selection_for_focus_change; 21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 218424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // TODO(msw|oshima): Consider saving/restoring edit history. 219424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ClearEditHistory(); 220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 221424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 222424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void OmniboxViewViews::Update() { 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UpdatePlaceholderText(); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ToolbarModel::SecurityLevel old_security_level = security_level_; 226424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) security_level_ = controller()->GetToolbarModel()->GetSecurityLevel(false); 22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (model()->UpdatePermanentText()) { 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Something visibly changed. Re-enable URL replacement. 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) controller()->GetToolbarModel()->set_url_replacement_enabled(true); 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) controller()->GetToolbarModel()->set_origin_chip_enabled(true); 231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) model()->UpdatePermanentText(); 232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 233a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Select all the new text if the user had all the old text selected, or if 234a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // there was no previous text (for new tab page URL replacement extensions). 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // This makes one particular case better: the user clicks in the box to 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // change it right before the permanent URL is changed. Since the new URL 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // is still fully selected, the user's typing will replace the edit contents 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // as they'd intended. 239a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const bool was_select_all = IsSelectAll(); 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const bool was_reversed = GetSelectedRange().is_reversed(); 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RevertAll(); 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Only select all when we have focus. If we don't have focus, selecting 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // all is unnecessary since the selection will change on regaining focus, 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // and can in fact cause artifacts, e.g. if the user is on the NTP and 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // clicks a link to navigate, causing |was_select_all| to be vacuously true 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // for the empty omnibox, and we then select all here, leading to the 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // trailing portion of a long URL being scrolled into view. We could try 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // and address cases like this, but it seems better to just not muck with 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // things when the omnibox isn't focused to begin with. 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (was_select_all && model()->has_focus()) 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SelectAll(was_reversed); 254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } else if (old_security_level != security_level_) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EmphasizeURLComponents(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid OmniboxViewViews::UpdatePlaceholderText() { 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (chrome::ShouldDisplayOriginChip() || 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OmniboxFieldTrial::DisplayHintTextWhenPossible()) 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch set_placeholder_text(GetHintText()); 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 OmniboxViewViews::GetText() const { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(oshima): IME support 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return text(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void OmniboxViewViews::SetUserText(const base::string16& text, 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& display_text, 27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool update_popup) { 27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) saved_selection_for_focus_change_ = gfx::Range::InvalidRange(); 27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OmniboxView::SetUserText(text, display_text, update_popup); 27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::SetForcedQuery() { 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 current_text(text()); 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const size_t start = current_text.find_first_not_of(base::kWhitespaceUTF16); 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (start == base::string16::npos || (current_text[start] != '?')) 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OmniboxView::SetUserText(base::ASCIIToUTF16("?")); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SelectRange(gfx::Range(current_text.size(), start + 1)); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void OmniboxViewViews::GetSelectionBounds( 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16::size_type* start, 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16::size_type* end) const { 28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Range range = GetSelectedRange(); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *start = static_cast<size_t>(range.start()); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *end = static_cast<size_t>(range.end()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::SelectAll(bool reversed) { 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Textfield::SelectAll(reversed); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void OmniboxViewViews::RevertAll() { 29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) saved_selection_for_focus_change_ = gfx::Range::InvalidRange(); 30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OmniboxView::RevertAll(); 30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::SetFocus() { 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestFocus(); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Restore caret visibility if focus is explicitly requested. This is 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // necessary because if we already have invisible focus, the RequestFocus() 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // call above will short-circuit, preventing us from reaching 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OmniboxEditModel::OnSetFocus(), which handles restoring visibility when the 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // omnibox regains focus after losing focus. 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model()->SetCaretVisibility(true); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 313c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint OmniboxViewViews::GetTextWidth() const { 314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Returns the width necessary to display the current text, including any 315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // necessary space for the cursor or border/margin. 316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return GetRenderText()->GetContentWidth() + GetInsets().width(); 317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool OmniboxViewViews::IsImeComposing() const { 320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return IsIMEComposing(); 321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size OmniboxViewViews::GetMinimumSize() const { 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int kMinCharacters = 10; 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return gfx::Size( 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetFontList().GetExpectedTextWidth(kMinCharacters) + GetInsets().width(), 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetPreferredSize().height()); 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void OmniboxViewViews::OnNativeThemeChanged(const ui::NativeTheme* theme) { 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::Textfield::OnNativeThemeChanged(theme); 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetBackgroundColor(location_bar_view_->GetColor( 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ToolbarModel::NONE, LocationBarView::BACKGROUND)); 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EmphasizeURLComponents(); 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 337c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::ExecuteCommand(int command_id, int event_flags) { 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // In the base class, touch text selection is deactivated when a command is 339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // executed. Since we are not always calling the base class implementation 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // here, we need to deactivate touch text selection here, too. 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DestroyTouchSelection(); 342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch switch (command_id) { 343c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // These commands don't invoke the popup via OnBefore/AfterPossibleChange(). 344c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case IDS_PASTE_AND_GO: 345c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->PasteAndGo(GetClipboardText()); 346c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case IDS_SHOW_URL: 348c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller()->ShowURL(); 349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case IDC_EDIT_SEARCH_ENGINES: 351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch command_updater()->ExecuteCommand(command_id); 352c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case IDS_MOVE_DOWN: 354c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case IDS_MOVE_UP: 355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->OnUpOrDownKeyPressed(command_id == IDS_MOVE_DOWN ? 1 : -1); 356c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch default: 359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnBeforePossibleChange(); 360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (command_id == IDS_APP_PASTE) 361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnPaste(); 362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch else if (Textfield::IsCommandIdEnabled(command_id)) 363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Textfield::ExecuteCommand(command_id, event_flags); 364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch else 365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch command_updater()->ExecuteCommand(command_id); 366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnAfterPossibleChange(); 367c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::SetTextAndSelectedRange(const base::string16& text, 372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const gfx::Range& range) { 373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SetText(text); 374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SelectRange(range); 375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbase::string16 OmniboxViewViews::GetSelectedText() const { 378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(oshima): Support IME. 379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return views::Textfield::GetSelectedText(); 380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::OnPaste() { 383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16 text(GetClipboardText()); 384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!text.empty()) { 385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Record this paste, so we can do different behavior. 386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->OnPaste(); 387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Force a Paste operation to trigger the text_changed code in 388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // OnAfterPossibleChange(), even if identical contents are pasted. 389c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch text_before_change_.clear(); 390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InsertOrReplaceText(text); 391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool OmniboxViewViews::HandleEarlyTabActions(const ui::KeyEvent& event) { 395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This must run before acclerator handling invokes a focus change on tab. 396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Note the parallel with SkipDefaultKeyEventProcessing above. 397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!views::FocusManager::IsTabTraversalKeyEvent(event)) 398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (model()->is_keyword_hint() && !event.IsShiftDown()) { 401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch model()->AcceptKeyword(ENTERED_KEYWORD_MODE_VIA_TAB); 402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!model()->popup_model()->IsOpen()) 406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (event.IsShiftDown() && 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (model()->popup_model()->selected_line_state() == 410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OmniboxPopupModel::KEYWORD)) 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch model()->ClearKeyword(text()); 412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch model()->OnUpOrDownKeyPressed(event.IsShiftDown() ? -1 : 1); 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void OmniboxViewViews::AccessibilitySetValue(const base::string16& new_value) { 4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetUserText(new_value, new_value, true); 4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::SetWindowTextAndCaretPos(const base::string16& text, 423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch size_t caret_pos, 424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool update_popup, 425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool notify_text_changed) { 426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const gfx::Range range(caret_pos, caret_pos); 427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SetTextAndSelectedRange(text, range); 428c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (update_popup) 430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UpdatePopup(); 431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (notify_text_changed) 433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TextChanged(); 434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 436c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool OmniboxViewViews::IsSelectAll() const { 437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(oshima): IME support. 438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return text() == GetSelectedText(); 439c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 440c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool OmniboxViewViews::DeleteAtEndPressed() { 442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return delete_at_end_pressed_; 443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::UpdatePopup() { 446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->SetInputInProgress(true); 447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!model()->has_focus()) 448c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Prevent inline autocomplete when the caret isn't at the end of the text. 451c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const gfx::Range sel = GetSelectedRange(); 452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->StartAutocomplete(!sel.is_empty(), sel.GetMax() < text().length()); 453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OmniboxViewViews::ApplyCaretVisibility() { 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCursorEnabled(model()->is_caret_visible()); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::OnTemporaryTextMaybeChanged( 460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& display_text, 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool save_original_selection, 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool notify_text_changed) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (save_original_selection) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) saved_temporary_selection_ = GetSelectedRange(); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetWindowTextAndCaretPos(display_text, display_text.length(), false, 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notify_text_changed); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OmniboxViewViews::OnInlineAutocompleteTextMaybeChanged( 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& display_text, 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t user_text_length) { 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (display_text == text()) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (IsIMEComposing()) { 477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) location_bar_view_->SetImeInlineAutocompletion( 478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) display_text.substr(user_text_length)); 479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Range range(display_text.size(), user_text_length); 481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetTextAndSelectedRange(display_text, range); 482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TextChanged(); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void OmniboxViewViews::OnInlineAutocompleteTextCleared() { 488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Hide the inline autocompletion for IME users. 489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) location_bar_view_->SetImeInlineAutocompletion(base::string16()); 490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::OnRevertTemporaryText() { 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SelectRange(saved_temporary_selection_); 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We got here because the user hit the Escape key. We explicitly don't call 4957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TextChanged(), since OmniboxPopupModel::ResetToDefaultMatch() has already 4967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // been called by now, and it would've called TextChanged() if it was 4977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // warranted. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::OnBeforePossibleChange() { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record our state. 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) text_before_change_ = text(); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sel_before_change_ = GetSelectedRange(); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ime_composing_before_change_ = IsIMEComposing(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OmniboxViewViews::OnAfterPossibleChange() { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See if the text or selection have changed since OnBeforePossibleChange(). 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 new_text = text(); 51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Range new_sel = GetSelectedRange(); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool text_changed = (new_text != text_before_change_) || 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (ime_composing_before_change_ != IsIMEComposing()); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool selection_differs = 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !((sel_before_change_.is_empty() && new_sel.is_empty()) || 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sel_before_change_.EqualsIgnoringDirection(new_sel)); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the user has deleted text, we don't allow inline autocomplete. Make 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure to not flag cases like selecting part of the text and then pasting 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (or typing) the prefix of that selection. (We detect these by making 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure the caret, which should be after any insertion, hasn't moved 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // forward of the old selection start.) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool just_deleted_text = 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (text_before_change_.length() > new_text.length()) && 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new_sel.start() <= sel_before_change_.GetMin()); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool something_changed = model()->OnAfterPossibleChange( 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_before_change_, new_text, new_sel.start(), new_sel.end(), 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_differs, text_changed, just_deleted_text, !IsIMEComposing()); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If only selection was changed, we don't need to call model()'s 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnChanged() method, which is called in TextChanged(). 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // But we still need to call EmphasizeURLComponents() to make sure the text 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attributes are updated correctly. 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (something_changed && text_changed) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TextChanged(); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (selection_differs) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EmphasizeURLComponents(); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (delete_at_end_pressed_) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model()->OnChanged(); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return something_changed; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView OmniboxViewViews::GetNativeView() const { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetWidget()->GetNativeView(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView OmniboxViewViews::GetRelativeWindowForPopup() const { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetWidget()->GetTopLevelWidget()->GetNativeView(); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::SetGrayTextAutocompletion(const base::string16& input) { 553c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch location_bar_view_->SetGrayTextAutocompletion(input); 554c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 556c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbase::string16 OmniboxViewViews::GetGrayTextAutocompletion() const { 557c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return location_bar_view_->GetGrayTextAutocompletion(); 558c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 559c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 560c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint OmniboxViewViews::GetWidth() const { 561c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return location_bar_view_->width(); 562c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 563c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 564c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool OmniboxViewViews::IsImeShowingPopup() const { 565c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) 566c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return ime_candidate_window_open_; 567c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else 568c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const views::InputMethod* input_method = this->GetInputMethod(); 569c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return input_method && input_method->IsCandidatePopupOpen(); 570c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 572c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 573c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::ShowImeIfNeeded() { 574c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetInputMethod()->ShowImeIfNeeded(); 575c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 576c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 577c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::OnMatchOpened(const AutocompleteMatch& match, 578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WebContents* web_contents) { 579c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extensions::MaybeShowExtensionControlledSearchNotification( 580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch profile(), web_contents, match); 581c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 582c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int OmniboxViewViews::GetOmniboxTextLength() const { 584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(oshima): Support IME. 585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return static_cast<int>(text().length()); 586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void OmniboxViewViews::EmphasizeURLComponents() { 589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // See whether the contents are a URL with a non-empty host portion, which we 590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // should emphasize. To check for a URL, rather than using the type returned 591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // by Parse(), ask the model, which will check the desired page transition for 592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // this input. This can tell us whether an UNKNOWN input string is going to 593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // be treated as a search or a navigation, and is the same method the Paste 594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // And Go system uses. 595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url::Component scheme, host; 596116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AutocompleteInput::ParseForEmphasizeComponents( 597116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch text(), ChromeAutocompleteSchemeClassifier(profile()), &scheme, &host); 598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool grey_out_url = text().substr(scheme.begin, scheme.len) == 599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::UTF8ToUTF16(extensions::kExtensionScheme); 600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool grey_base = model()->CurrentTextIsURL() && 601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (host.is_nonempty() || grey_out_url); 602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetColor(location_bar_view_->GetColor( 603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) security_level_, 604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) grey_base ? LocationBarView::DEEMPHASIZED_TEXT : LocationBarView::TEXT)); 605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (grey_base && !grey_out_url) { 606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ApplyColor( 607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) location_bar_view_->GetColor(security_level_, LocationBarView::TEXT), 608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Range(host.begin, host.end())); 609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Emphasize the scheme for security UI display purposes (if necessary). 612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Note that we check CurrentTextIsURL() because if we're replacing search 613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // URLs with search terms, we may have a non-URL even when the user is not 614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // editing; and in some cases, e.g. for "site:foo.com" searches, the parser 615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // may have incorrectly identified a qualifier as a scheme. 616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetStyle(gfx::DIAGONAL_STRIKE, false); 617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!model()->user_input_in_progress() && model()->CurrentTextIsURL() && 618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scheme.is_nonempty() && (security_level_ != ToolbarModel::NONE)) { 619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SkColor security_color = location_bar_view_->GetColor( 620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) security_level_, LocationBarView::SECURITY_TEXT); 621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const bool strike = (security_level_ == ToolbarModel::SECURITY_ERROR); 622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const gfx::Range scheme_range(scheme.begin, scheme.end()); 623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ApplyColor(security_color, scheme_range); 624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ApplyStyle(gfx::DIAGONAL_STRIKE, strike, scheme_range); 625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool OmniboxViewViews::OnKeyReleased(const ui::KeyEvent& event) { 629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The omnibox contents may change while the control key is pressed. 630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (event.key_code() == ui::VKEY_CONTROL) 631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) model()->OnControlKeyChanged(false); 632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return views::Textfield::OnKeyReleased(event); 633c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 634c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 635c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool OmniboxViewViews::IsItemForCommandIdDynamic(int command_id) const { 636c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return command_id == IDS_PASTE_AND_GO; 637c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 638c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 639c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbase::string16 OmniboxViewViews::GetLabelForCommandId(int command_id) const { 640c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK_EQ(IDS_PASTE_AND_GO, command_id); 641c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return l10n_util::GetStringUTF16( 642c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->IsPasteAndSearch(GetClipboardText()) ? 643c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IDS_PASTE_AND_SEARCH : IDS_PASTE_AND_GO); 644c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 645c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 646c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char* OmniboxViewViews::GetClassName() const { 647c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return kViewClassName; 648c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 649c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 650c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool OmniboxViewViews::OnMousePressed(const ui::MouseEvent& event) { 651c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch select_all_on_mouse_release_ = 652c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch (event.IsOnlyLeftMouseButton() || event.IsOnlyRightMouseButton()) && 653c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch (!HasFocus() || (model()->focus_state() == OMNIBOX_FOCUS_INVISIBLE)); 654c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (select_all_on_mouse_release_) { 655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Restore caret visibility whenever the user clicks in the omnibox in a way 656c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // that would give it focus. We must handle this case separately here 657c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // because if the omnibox currently has invisible focus, the mouse event 658c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // won't trigger either SetFocus() or OmniboxEditModel::OnSetFocus(). 659c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->SetCaretVisibility(true); 660c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 661c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // When we're going to select all on mouse release, invalidate any saved 662c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // selection lest restoring it fights with the "select all" action. It's 663c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // possible to later set select_all_on_mouse_release_ back to false, but 664c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // that happens for things like dragging, which are cases where having 665c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // invalidated this saved selection is still OK. 666c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch saved_selection_for_focus_change_ = gfx::Range::InvalidRange(); 667c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 668c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return views::Textfield::OnMousePressed(event); 669c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 670c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 671c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool OmniboxViewViews::OnMouseDragged(const ui::MouseEvent& event) { 672c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (ExceededDragThreshold(event.location() - last_click_location())) 673c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch select_all_on_mouse_release_ = false; 6740de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 6750de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) if (HasTextBeingDragged()) 6760de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) CloseOmniboxPopup(); 6770de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 678c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return views::Textfield::OnMouseDragged(event); 679c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 680c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 681c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::OnMouseReleased(const ui::MouseEvent& event) { 682c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::Textfield::OnMouseReleased(event); 683c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (event.IsOnlyLeftMouseButton() || event.IsOnlyRightMouseButton()) { 684c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // When the user has clicked and released to give us focus, select all 685c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // unless we're omitting the URL (in which case refining an existing query 686c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // is common enough that we do click-to-place-cursor). 687c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (select_all_on_mouse_release_ && 688c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !controller()->GetToolbarModel()->WouldReplaceURL()) { 689c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Select all in the reverse direction so as not to scroll the caret 690c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // into view and shift the contents jarringly. 691c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SelectAll(true); 692c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 693c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 694c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch HandleOriginChipMouseRelease(); 695c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 696c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch select_all_on_mouse_release_ = false; 697c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 698c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 699c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool OmniboxViewViews::OnKeyPressed(const ui::KeyEvent& event) { 700c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Skip processing of [Alt]+<num-pad digit> Unicode alt key codes. 701c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Otherwise, if num-lock is off, the events are handled as [Up], [Down], etc. 702c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (event.IsUnicodeKeyCode()) 703c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return views::Textfield::OnKeyPressed(event); 704c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 705c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const bool shift = event.IsShiftDown(); 706c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const bool control = event.IsControlDown(); 707c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const bool alt = event.IsAltDown() || event.IsAltGrDown(); 708c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch switch (event.key_code()) { 709c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::VKEY_RETURN: 710c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->AcceptInput(alt ? NEW_FOREGROUND_TAB : CURRENT_TAB, false); 711c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 712c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::VKEY_ESCAPE: 713c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return model()->OnEscapeKeyPressed(); 714c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::VKEY_CONTROL: 715c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->OnControlKeyChanged(true); 716c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 717c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::VKEY_DELETE: 718c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (shift && model()->popup_model()->IsOpen()) 719c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->popup_model()->TryDeletingCurrentItem(); 720c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 721c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::VKEY_UP: 722c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!read_only()) { 723c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->OnUpOrDownKeyPressed(-1); 724c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 725c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 726c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 727c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::VKEY_DOWN: 728c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!read_only()) { 729c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->OnUpOrDownKeyPressed(1); 730c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 731c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 732c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 733c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::VKEY_PRIOR: 734c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (control || alt || shift) 735c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 736c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->OnUpOrDownKeyPressed(-1 * model()->result().size()); 737c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 738c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::VKEY_NEXT: 739c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (control || alt || shift) 740c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 741c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->OnUpOrDownKeyPressed(model()->result().size()); 742c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 743c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::VKEY_V: 744c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (control && !alt && !read_only()) { 745c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExecuteCommand(IDS_APP_PASTE, 0); 746c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 747c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 748c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 749c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::VKEY_INSERT: 750c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (shift && !control && !read_only()) { 751c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExecuteCommand(IDS_APP_PASTE, 0); 752c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 753c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 754c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 755c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch default: 756c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 757c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 758c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 759c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return views::Textfield::OnKeyPressed(event) || HandleEarlyTabActions(event); 760c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 761c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 762c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::OnGestureEvent(ui::GestureEvent* event) { 763c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!HasFocus() && event->type() == ui::ET_GESTURE_TAP_DOWN) { 764c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch select_all_on_gesture_tap_ = true; 765c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 766c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If we're trying to select all on tap, invalidate any saved selection lest 767c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // restoring it fights with the "select all" action. 768c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch saved_selection_for_focus_change_ = gfx::Range::InvalidRange(); 769c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 770c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) views::Textfield::OnGestureEvent(event); 7725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 773c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (select_all_on_gesture_tap_ && event->type() == ui::ET_GESTURE_TAP) 7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SelectAll(true); 775c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 776c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (event->type() == ui::ET_GESTURE_TAP || 777c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch event->type() == ui::ET_GESTURE_TAP_CANCEL || 778c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch event->type() == ui::ET_GESTURE_TWO_FINGER_TAP || 779c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch event->type() == ui::ET_GESTURE_SCROLL_BEGIN || 780c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch event->type() == ui::ET_GESTURE_PINCH_BEGIN || 781c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch event->type() == ui::ET_GESTURE_LONG_PRESS || 782c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch event->type() == ui::ET_GESTURE_LONG_TAP) { 783c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch select_all_on_gesture_tap_ = false; 784c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 787c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::AboutToRequestFocusFromTabTraversal(bool reverse) { 788a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::Textfield::AboutToRequestFocusFromTabTraversal(reverse); 789c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Tabbing into the omnibox should affect the origin chip in the same way 790c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // clicking it should. 791c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch HandleOriginChipMouseRelease(); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 794c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool OmniboxViewViews::SkipDefaultKeyEventProcessing( 795c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const ui::KeyEvent& event) { 796c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (views::FocusManager::IsTabTraversalKeyEvent(event) && 797c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ((model()->is_keyword_hint() && !event.IsShiftDown()) || 798c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->popup_model()->IsOpen())) { 799c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 800c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 801c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return Textfield::SkipDefaultKeyEventProcessing(event); 8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 804c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::GetAccessibleState(ui::AXViewState* state) { 805c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch state->role = ui::AX_ROLE_TEXT_FIELD; 8065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_LOCATION); 8075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) state->value = GetText(); 8085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 8095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::string16::size_type entry_start; 8105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::string16::size_type entry_end; 8115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetSelectionBounds(&entry_start, &entry_end); 8125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) state->selection_start = entry_start; 8135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) state->selection_end = entry_end; 8145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 8155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (popup_window_mode_) { 8165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) state->AddStateFlag(ui::AX_STATE_READ_ONLY); 8175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 8185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) state->set_value_callback = 8195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&OmniboxViewViews::AccessibilitySetValue, 8205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()); 8215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 824c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::OnFocus() { 825c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::Textfield::OnFocus(); 826c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(oshima): Get control key state. 827c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->OnSetFocus(false); 828c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Don't call controller()->OnSetFocus, this view has already acquired focus. 829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 830c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Restore the selection we saved in OnBlur() if it's still valid. 831c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (saved_selection_for_focus_change_.IsValid()) { 832c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SelectRange(saved_selection_for_focus_change_); 833c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch saved_selection_for_focus_change_ = gfx::Range::InvalidRange(); 834c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 837c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::OnBlur() { 838c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Save the user's existing selection to restore it later. 839c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch saved_selection_for_focus_change_ = GetSelectedRange(); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 841c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::Textfield::OnBlur(); 842c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::NativeView native_view = NULL; 843c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::Widget* widget = GetWidget(); 844c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (widget) { 845c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::client::FocusClient* client = 846c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::client::GetFocusClient(widget->GetNativeView()); 847c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (client) 848c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch native_view = client->GetFocusedWindow(); 849c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 850c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->OnWillKillFocus(native_view); 851c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Close the popup. 852c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CloseOmniboxPopup(); 853effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 854c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Tell the model to reset itself. 855c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->OnKillFocus(); 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 857c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Ignore loss of focus if we lost focus because the website settings popup 858c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // is open. When the popup is destroyed, focus will return to the Omnibox. 859c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!WebsiteSettingsPopupView::IsPopupShowing()) 860c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnDidKillFocus(); 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 862c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Make sure the beginning of the text is visible. 863c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SelectRange(gfx::Range(0)); 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 866cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool OmniboxViewViews::IsCommandIdEnabled(int command_id) const { 867cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (command_id == IDS_APP_PASTE) 868cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return !read_only() && !GetClipboardText().empty(); 869cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (command_id == IDS_PASTE_AND_GO) 870cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return !read_only() && model()->CanPasteAndGo(GetClipboardText()); 871cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (command_id == IDS_SHOW_URL) 872cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return controller()->GetToolbarModel()->WouldReplaceURL(); 873cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return command_id == IDS_MOVE_DOWN || command_id == IDS_MOVE_UP || 874cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Textfield::IsCommandIdEnabled(command_id) || 875cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) command_updater()->IsCommandEnabled(command_id); 876cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 877cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 878c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbase::string16 OmniboxViewViews::GetSelectionClipboardText() const { 879c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return SanitizeTextForPaste(Textfield::GetSelectionClipboardText()); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 882c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) 883c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::CandidateWindowOpened( 884c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::input_method::InputMethodManager* manager) { 885c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ime_candidate_window_open_ = true; 886c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 887c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 888c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::CandidateWindowClosed( 889c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::input_method::InputMethodManager* manager) { 890c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ime_candidate_window_open_ = false; 891c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 892c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 893c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::ContentsChanged(views::Textfield* sender, 895a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& new_contents) { 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OmniboxViewViews::HandleKeyEvent(views::Textfield* textfield, 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::KeyEvent& event) { 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_at_end_pressed_ = false; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.key_code() == ui::VKEY_BACK) { 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No extra handling is needed in keyword search mode, if there is a 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non-empty selection, or if the cursor is not leading the text. 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (model()->is_keyword_hint() || model()->keyword().empty() || 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HasSelection() || GetCursorPosition() != 0) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model()->ClearKeyword(text()); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.key_code() == ui::VKEY_DELETE && !event.IsAltDown()) { 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_at_end_pressed_ = 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (!HasSelection() && GetCursorPosition() == text().length()); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Handle the right-arrow key for LTR text and the left-arrow key for RTL text 9187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // if there is gray text that needs to be committed. 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetCursorPosition() == text().length()) { 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::i18n::TextDirection direction = GetTextDirection(); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((direction == base::i18n::LEFT_TO_RIGHT && 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.key_code() == ui::VKEY_RIGHT) || 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (direction == base::i18n::RIGHT_TO_LEFT && 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.key_code() == ui::VKEY_LEFT)) { 925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return model()->CommitSuggestedText(); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::OnBeforeUserAction(views::Textfield* sender) { 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnBeforePossibleChange(); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::OnAfterUserAction(views::Textfield* sender) { 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnAfterPossibleChange(); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::OnAfterCutOrCopy(ui::ClipboardType clipboard_type) { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Clipboard* cb = ui::Clipboard::GetForCurrentThread(); 942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 selected_text; 943c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch cb->ReadText(clipboard_type, &selected_text); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool write_url; 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model()->AdjustTextForCopy(GetSelectedRange().GetMin(), IsSelectAll(), 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &selected_text, &url, &write_url); 948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (IsSelectAll()) 949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UMA_HISTOGRAM_COUNTS(OmniboxEditModel::kCutOrCopyAllTextHistogram, 1); 950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (write_url) { 952d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) BookmarkNodeData data; 953d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) data.ReadFromTuple(url, selected_text); 954c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch data.WriteToClipboard(clipboard_type); 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 9561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedClipboardWriter scoped_clipboard_writer(clipboard_type); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_clipboard_writer.WriteText(selected_text); 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void OmniboxViewViews::OnWriteDragData(ui::OSExchangeData* data) { 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url; 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool write_url; 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_all_selected = IsSelectAll(); 965a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16 selected_text = GetSelectedText(); 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) model()->AdjustTextForCopy(GetSelectedRange().GetMin(), is_all_selected, 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &selected_text, &url, &write_url); 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data->SetString(selected_text); 969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (write_url) { 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Image favicon; 971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title = selected_text; 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_all_selected) 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) model()->GetDataForURLExport(&url, &title, &favicon); 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button_drag_utils::SetURLAndDragImage(url, title, favicon.AsImageSkia(), 975f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NULL, data, GetWidget()); 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data->SetURL(url, title); 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 980c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid OmniboxViewViews::OnGetDragOperationsForTextfield(int* drag_operations) { 981c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::string16 selected_text = GetSelectedText(); 982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GURL url; 983c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool write_url; 984c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch model()->AdjustTextForCopy(GetSelectedRange().GetMin(), IsSelectAll(), 985c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &selected_text, &url, &write_url); 986c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (write_url) 987c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *drag_operations |= ui::DragDropTypes::DRAG_LINK; 988c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 989c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OmniboxViewViews::AppendDropFormats( 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* formats, 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<ui::OSExchangeData::CustomFormat>* custom_formats) { 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *formats = *formats | ui::OSExchangeData::URL; 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int OmniboxViewViews::OnDrop(const ui::OSExchangeData& data) { 997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (HasTextBeingDragged()) 998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return ui::DragDropTypes::DRAG_NONE; 999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1000a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (data.HasURL(ui::OSExchangeData::CONVERT_FILENAMES)) { 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url; 1002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title; 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (data.GetURLAndTitle( 10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::OSExchangeData::CONVERT_FILENAMES, &url, &title)) { 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 text( 10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StripJavascriptSchemas(base::UTF8ToUTF16(url.spec()))); 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (model()->CanPasteAndGo(text)) { 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model()->PasteAndGo(text); 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ui::DragDropTypes::DRAG_COPY; 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (data.HasString()) { 1013a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text; 1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (data.GetString(&text)) { 1015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16 collapsed_text(base::CollapseWhitespace(text, true)); 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (model()->CanPasteAndGo(collapsed_text)) 1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) model()->PasteAndGo(collapsed_text); 1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return ui::DragDropTypes::DRAG_COPY; 1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ui::DragDropTypes::DRAG_NONE; 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OmniboxViewViews::UpdateContextMenu(ui::SimpleMenuModel* menu_contents) { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int paste_position = menu_contents->GetIndexOfCommandId(IDS_APP_PASTE); 1027424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK_GE(paste_position, 0); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_contents->InsertItemWithStringIdAt( 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paste_position + 1, IDS_PASTE_AND_GO, IDS_PASTE_AND_GO); 1030424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1031424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) menu_contents->AddSeparator(ui::NORMAL_SEPARATOR); 1032424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1033cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (chrome::IsQueryExtractionEnabled() || chrome::ShouldDisplayOriginChip()) { 1034d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int select_all_position = menu_contents->GetIndexOfCommandId( 1035d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_APP_SELECT_ALL); 1036d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK_GE(select_all_position, 0); 1037d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) menu_contents->InsertItemWithStringIdAt( 1038d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) select_all_position + 1, IDS_SHOW_URL, IDS_SHOW_URL); 1039d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1040d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1041424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Minor note: We use IDC_ for command id here while the underlying textfield 1042424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // is using IDS_ for all its command ids. This is because views cannot depend 1043424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // on IDC_ for now. 1044424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) menu_contents->AddItemWithStringId(IDC_EDIT_SEARCH_ENGINES, 1045424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IDS_EDIT_SEARCH_ENGINES); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1047