1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be 3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file. 4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/renderer_host/render_widget_host_view_views.h" 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <algorithm> 8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <string> 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/command_line.h" 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/logging.h" 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/message_loop.h" 13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h" 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_number_conversions.h" 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/task.h" 16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/time.h" 17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/render_messages.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/backing_store_skia.h" 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/backing_store_x.h" 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_widget_host.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/native_web_keyboard_event.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/result_codes.h" 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/view_messages.h" 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/gtk/WebInputEventFactory.h" 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/keycodes/keyboard_code_conversion_gtk.h" 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/x/x11_util.h" 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas.h" 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas_skia.h" 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/gfx/gtk_native_view_id_manager.h" 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/events/event.h" 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/ime/input_method.h" 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "views/widget/widget.h" 3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "views/widget/widget_gtk.h" 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kMaxWindowWidth = 4000; 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kMaxWindowHeight = 4000; 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstatic const char kRenderWidgetHostViewKey[] = "__RENDER_WIDGET_HOST_VIEW__"; 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstatic const char kBackingStoreSkiaSwitch[] = "use-backing-store-skia"; 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copied from third_party/WebKit/Source/WebCore/page/EventHandler.cpp 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Match key code of composition keydown event on windows. 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// IE sends VK_PROCESSKEY which has value 229; 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Please refer to following documents for detals: 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// - Virtual-Key Codes 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// - How the IME System Works 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// http://msdn.microsoft.com/en-us/library/cc194848.aspx 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// - ImmGetVirtualKey Function 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// http://msdn.microsoft.com/en-us/library/dd318570(VS.85).aspx 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstatic const int kCompositionEventKeyCode = 229; 55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebInputEventFactory; 57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebMouseWheelEvent; 58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochusing WebKit::WebTouchEvent; 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst char RenderWidgetHostViewViews::kViewClassName[] = 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "browser/renderer_host/RenderWidgetHostViewViews"; 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace { 64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool UsingBackingStoreSkia() { 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static bool decided = false; 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static bool use_skia = false; 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!decided) { 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CommandLine* cmdline = CommandLine::ForCurrentProcess(); 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen use_skia = (cmdline && cmdline->HasSwitch(kBackingStoreSkiaSwitch)); 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen decided = true; 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return use_skia; 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickint WebInputEventFlagsFromViewsEvent(const views::Event& event) { 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int modifiers = 0; 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (event.IsShiftDown()) 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick modifiers |= WebKit::WebInputEvent::ShiftKey; 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (event.IsControlDown()) 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick modifiers |= WebKit::WebInputEvent::ControlKey; 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (event.IsAltDown()) 85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick modifiers |= WebKit::WebInputEvent::AltKey; 86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (event.IsCapsLockDown()) 87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch modifiers |= WebKit::WebInputEvent::CapsLockOn; 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return modifiers; 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochWebKit::WebTouchPoint::State TouchPointStateFromEvent( 93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const views::TouchEvent* event) { 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen switch (event->type()) { 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_PRESSED: 96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebTouchPoint::StatePressed; 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_RELEASED: 98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebTouchPoint::StateReleased; 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_MOVED: 100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebTouchPoint::StateMoved; 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_CANCELLED: 102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebTouchPoint::StateCancelled; 103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch default: 104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebTouchPoint::StateUndefined; 105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochWebKit::WebInputEvent::Type TouchEventTypeFromEvent( 109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const views::TouchEvent* event) { 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen switch (event->type()) { 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_PRESSED: 112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebInputEvent::TouchStart; 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_RELEASED: 114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebInputEvent::TouchEnd; 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_MOVED: 116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebInputEvent::TouchMove; 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_CANCELLED: 118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebInputEvent::TouchCancel; 119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch default: 120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebInputEvent::Undefined; 121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid UpdateTouchPointPosition(const views::TouchEvent* event, 125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const gfx::Point& origin, 126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebKit::WebTouchPoint* tpoint) { 127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tpoint->position.x = event->x(); 128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tpoint->position.y = event->y(); 129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tpoint->screenPosition.x = tpoint->position.x + origin.x(); 131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tpoint->screenPosition.y = tpoint->position.y + origin.y(); 132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid InitializeWebMouseEventFromViewsEvent(const views::LocatedEvent& event, 135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const gfx::Point& origin, 136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebKit::WebMouseEvent* wmevent) { 137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmevent->timeStampSeconds = base::Time::Now().ToDoubleT(); 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmevent->modifiers = WebInputEventFlagsFromViewsEvent(event); 139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmevent->windowX = wmevent->x = event.x(); 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmevent->windowY = wmevent->y = event.y(); 142201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmevent->globalX = wmevent->x + origin.x(); 143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmevent->globalY = wmevent->y + origin.y(); 144201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static 149731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RenderWidgetHost* widget) { 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return new RenderWidgetHostViewViews(widget); 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 154731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostViewViews::RenderWidgetHostViewViews(RenderWidgetHost* host) 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : host_(host), 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick about_to_validate_and_paint_(false), 157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_hidden_(false), 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_loading_(false), 159201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch native_cursor_(NULL), 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_showing_context_menu_(false), 161201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch visually_deemphasized_(false), 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen touch_event_(), 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text_input_type_(ui::TEXT_INPUT_TYPE_NONE), 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen has_composition_text_(false) { 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetFocusable(true); 166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick host_->set_view(this); 167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 169731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostViewViews::~RenderWidgetHostViewViews() { 170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::InitAsChild() { 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Show(); 174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::InitAsPopup( 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RenderWidgetHostView* parent_host_view, 178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const gfx::Rect& pos) { 179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): figure out cases where popups occur and implement 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTIMPLEMENTED(); 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid RenderWidgetHostViewViews::InitAsFullscreen() { 184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTIMPLEMENTED(); 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenRenderWidgetHost* RenderWidgetHostViewViews::GetRenderWidgetHost() const { 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return host_; 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidBecomeSelected() { 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!is_hidden_) 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (tab_switch_paint_time_.is_null()) 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick tab_switch_paint_time_ = base::TimeTicks::Now(); 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_hidden_ = false; 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_) 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->WasRestored(); 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::WasHidden() { 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (is_hidden_) 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If we receive any more paint messages while we are hidden, we want to 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // ignore them so we don't re-allocate the backing store. We will paint 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // everything again when we become selected again. 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_hidden_ = true; 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If we have a renderer, then inform it that we are being hidden so it can 212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // reduce its resource utilization. 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_) 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->WasHidden(); 215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetSize(const gfx::Size& size) { 218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // This is called when webkit has sent us a Move message. 219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int width = std::min(size.width(), kMaxWindowWidth); 220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int height = std::min(size.height(), kMaxWindowHeight); 221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (requested_size_.width() != width || 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick requested_size_.height() != height) { 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick requested_size_ = gfx::Size(width, height); 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen views::View::SetBounds(x(), y(), width, height); 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_) 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->WasResized(); 227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::SetBounds(const gfx::Rect& rect) { 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTIMPLEMENTED(); 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsengfx::NativeView RenderWidgetHostViewViews::GetNativeView() { 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (GetWidget()) 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return GetWidget()->GetNativeView(); 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return NULL; 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::MovePluginWindows( 24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::vector<webkit::npapi::WebPluginGeometry>& moves) { 242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): NIY 24321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // NOTIMPLEMENTED(); 244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::HasFocus() { 247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return View::HasFocus(); 248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Show() { 251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetVisible(true); 252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Hide() { 255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetVisible(false); 256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::IsShowing() { 259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return IsVisible(); 260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::Rect RenderWidgetHostViewViews::GetViewBounds() const { 263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return bounds(); 264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::UpdateCursor(const WebCursor& cursor) { 267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Optimize the common case, where the cursor hasn't changed. 268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // However, we can switch between different pixmaps, so only on the 269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // non-pixmap branch. 270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (current_cursor_.GetCursorType() != GDK_CURSOR_IS_PIXMAP && 271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick current_cursor_.GetCursorType() == cursor.GetCursorType()) { 272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick current_cursor_ = cursor; 276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowCurrentCursor(); 277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetIsLoading(bool is_loading) { 280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_loading_ = is_loading; 281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Only call ShowCurrentCursor() when it will actually change the cursor. 282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (current_cursor_.GetCursorType() == GDK_LAST_CURSOR) 283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowCurrentCursor(); 284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ImeUpdateTextInputState( 287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebTextInputType type, 288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const gfx::Rect& caret_rect) { 289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(GetInputMethod()); 290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui::TextInputType new_type = static_cast<ui::TextInputType>(type); 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (text_input_type_ != new_type) { 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text_input_type_ = new_type; 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetInputMethod()->OnTextInputTypeChanged(this); 294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (caret_bounds_ != caret_rect) { 296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen caret_bounds_ = caret_rect; 297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetInputMethod()->OnCaretBoundsChanged(this); 298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ImeCancelComposition() { 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(GetInputMethod()); 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetInputMethod()->CancelComposition(this); 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen has_composition_text_ = false; 305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidUpdateBackingStore( 308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy, 309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::vector<gfx::Rect>& copy_rects) { 310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (is_hidden_) 311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(darin): Implement the equivalent of Win32's ScrollWindowEX. Can that 314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // be done using XCopyArea? Perhaps similar to 315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // BackingStore::ScrollBackingStore? 316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (about_to_validate_and_paint_) 317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick invalid_rect_ = invalid_rect_.Union(scroll_rect); 318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick else 319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SchedulePaintInRect(scroll_rect); 320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (size_t i = 0; i < copy_rects.size(); ++i) { 322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Avoid double painting. NOTE: This is only relevant given the call to 323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Paint(scroll_rect) above. 324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::Rect rect = copy_rects[i].Subtract(scroll_rect); 325731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (rect.IsEmpty()) 326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick continue; 327731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (about_to_validate_and_paint_) 329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick invalid_rect_ = invalid_rect_.Union(rect); 330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick else 331dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SchedulePaintInRect(rect); 332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 33372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen invalid_rect_ = invalid_rect_.Intersect(bounds()); 334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 33621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid RenderWidgetHostViewViews::RenderViewGone(base::TerminationStatus status, 33721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int error_code) { 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(host_); 339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ViewDestroyed(); 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Destroy(); 341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Destroy() { 34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // host_'s destruction brought us here, null it out so we don't use it 34572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host_ = NULL; 34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (parent()) 34872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen parent()->RemoveChildView(this); 34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MessageLoop::current()->DeleteSoon(FROM_HERE, this); 350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetTooltipText(const std::wstring& tip) { 353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): decide if we want tooltips for touch (none specified 354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // right now/might want a press-and-hold display) 355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // NOTIMPLEMENTED(); ... too annoying, it triggers for every mousemove 356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SelectionChanged(const std::string& text) { 359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): deal with the clipboard without GTK 360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTIMPLEMENTED(); 361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ShowingContextMenu(bool showing) { 364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_showing_context_menu_ = showing; 365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 367731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBackingStore* RenderWidgetHostViewViews::AllocBackingStore( 368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const gfx::Size& size) { 36972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen gfx::NativeView nview = GetInnerNativeView(); 37072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!nview) 37172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return NULL; 37272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 37372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (UsingBackingStoreSkia()) { 37472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return new BackingStoreSkia(host_, size); 37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 37672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return new BackingStoreX(host_, size, 37772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::GetVisualFromGtkWidget(nview), 37872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen gtk_widget_get_visual(nview)->depth); 37972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 381731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetBackground(const SkBitmap& background) { 383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RenderWidgetHostView::SetBackground(background); 384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_) 385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->Send(new ViewMsg_SetBackground(host_->routing_id(), background)); 386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 387731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::CreatePluginContainer( 389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::PluginWindowHandle id) { 390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(anicolao): plugin_container_manager_.CreatePluginContainer(id); 391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 392201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::DestroyPluginContainer( 394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::PluginWindowHandle id) { 395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(anicolao): plugin_container_manager_.DestroyPluginContainer(id); 396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 397731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::SetVisuallyDeemphasized( 399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const SkColor* color, bool animate) { 400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(anicolao) 401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::ContainsNativeView( 404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::NativeView native_view) const { 405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(port) 406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << 407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "RenderWidgetHostViewViews::ContainsNativeView not implemented."; 408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 41072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::AcceleratedCompositingActivated( 412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool activated) { 413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(anicolao): figure out if we need something here 414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (activated) 415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTIMPLEMENTED(); 416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsengfx::PluginWindowHandle RenderWidgetHostViewViews::GetCompositingSurface() { 419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GtkNativeViewManager* manager = GtkNativeViewManager::GetInstance(); 420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::PluginWindowHandle surface = gfx::kNullPluginWindow; 421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::NativeViewId view_id = gfx::IdFromNativeView(GetInnerNativeView()); 422731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!manager->GetXIDForId(&surface, view_id)) { 424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DLOG(ERROR) << "Can't find XID for view id " << view_id; 425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return surface; 427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 428731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsengfx::NativeView RenderWidgetHostViewViews::GetInnerNativeView() const { 430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(sad): Ideally this function should be equivalent to GetNativeView, and 431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // WidgetGtk-specific function call should not be necessary. 432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const views::WidgetGtk* widget = 433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<const views::WidgetGtk*>(GetWidget()); 434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return widget ? widget->window_contents() : NULL; 435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string RenderWidgetHostViewViews::GetClassName() const { 438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return kViewClassName; 439731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 440731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 441201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochgfx::NativeCursor RenderWidgetHostViewViews::GetCursorForPoint( 44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::EventType type, const gfx::Point& point) { 443201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return native_cursor_; 444201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 445201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMousePressed(const views::MouseEvent& event) { 447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RequestFocus(); 451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Confirm existing composition text on mouse click events, to make sure 453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // the input caret won't be moved with an ongoing composition text. 454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FinishImeCompositionSession(); 455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): validate event generation. 457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event); 458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 459731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): deal with double clicks 460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick e.type = WebKit::WebInputEvent::MouseDown; 461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick e.clickCount = 1; 462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ForwardMouseEvent(e); 464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return true; 465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMouseDragged(const views::MouseEvent& event) { 468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick OnMouseMoved(event); 469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return true; 470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 471731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::OnMouseReleased( 473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const views::MouseEvent& event) { 474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event); 478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen e.type = WebKit::WebInputEvent::MouseUp; 479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen e.clickCount = 1; 480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ForwardMouseEvent(e); 481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::OnMouseMoved(const views::MouseEvent& event) { 484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event); 488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen e.type = WebKit::WebInputEvent::MouseMove; 489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ForwardMouseEvent(e); 490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseEntered(const views::MouseEvent& event) { 493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Already generated synthetically by webkit. 494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 495731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 496731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseExited(const views::MouseEvent& event) { 497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Already generated synthetically by webkit. 498731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 499731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenviews::View::TouchStatus RenderWidgetHostViewViews::OnTouchEvent( 501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const views::TouchEvent& event) { 502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return TOUCH_STATUS_UNKNOWN; 504201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Update the list of touch points first. 506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebKit::WebTouchPoint* point = NULL; 507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TouchStatus status = TOUCH_STATUS_UNKNOWN; 508201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen switch (event.type()) { 51072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_PRESSED: 511201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Add a new touch point. 512201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (touch_event_.touchPointsLength < 513201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebTouchEvent::touchPointsLengthCap) { 514201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch point = &touch_event_.touchPoints[touch_event_.touchPointsLength++]; 515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen point->id = event.identity(); 51672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 51772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (touch_event_.touchPointsLength == 1) { 51872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // A new touch sequence has started. 51972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen status = TOUCH_STATUS_START; 52072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 52172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We also want the focus. 52272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RequestFocus(); 523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Confirm existing composition text on touch press events, to make 525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // sure the input caret won't be moved with an ongoing composition 526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // text. 527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FinishImeCompositionSession(); 52872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 529201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 530201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch break; 53172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_RELEASED: 53272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_CANCELLED: 53372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_MOVED: { 534201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The touch point should have been added to the event from an earlier 535201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // _PRESSED event. So find that. 536201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // At the moment, only a maximum of 4 touch-points are allowed. So a 537201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // simple loop should be sufficient. 53872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (int i = 0; i < touch_event_.touchPointsLength; ++i) { 539201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch point = touch_event_.touchPoints + i; 540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (point->id == event.identity()) { 541201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch break; 542201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 543201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch point = NULL; 544201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 545201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch break; 546201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 547201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch default: 548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DLOG(WARNING) << "Unknown touch event " << event.type(); 549201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch break; 550201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 551201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 552201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!point) 55372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return TOUCH_STATUS_UNKNOWN; 55472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 55572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (status != TOUCH_STATUS_START) 55672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen status = TOUCH_STATUS_CONTINUE; 557201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 558201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Update the location and state of the point. 559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen point->state = TouchPointStateFromEvent(&event); 56072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (point->state == WebKit::WebTouchPoint::StateMoved) { 56172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // It is possible for badly written touch drivers to emit Move events even 56272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // when the touch location hasn't changed. In such cases, consume the event 56372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // and pretend nothing happened. 564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (point->position.x == event.x() && point->position.y == event.y()) { 56572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return status; 56672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 56772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UpdateTouchPointPosition(&event, GetMirroredPosition(), point); 569201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 570201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Mark the rest of the points as stationary. 571201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (int i = 0; i < touch_event_.touchPointsLength; ++i) { 572201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebKit::WebTouchPoint* iter = touch_event_.touchPoints + i; 573201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (iter != point) { 574201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch iter->state = WebKit::WebTouchPoint::StateStationary; 575201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 576201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 577201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 578201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Update the type of the touch event. 579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen touch_event_.type = TouchEventTypeFromEvent(&event); 58072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen touch_event_.timeStampSeconds = base::Time::Now().ToDoubleT(); 581201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 582201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The event and all the touches have been updated. Dispatch. 583201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch host_->ForwardTouchEvent(touch_event_); 584201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 585201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // If the touch was released, then remove it from the list of touch points. 586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (event.type() == ui::ET_TOUCH_RELEASED) { 587201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch --touch_event_.touchPointsLength; 588201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (int i = point - touch_event_.touchPoints; 589201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch i < touch_event_.touchPointsLength; 590201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ++i) { 591201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch touch_event_.touchPoints[i] = touch_event_.touchPoints[i + 1]; 592201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 59372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (touch_event_.touchPointsLength == 0) 59472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen status = TOUCH_STATUS_END; 595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else if (event.type() == ui::ET_TOUCH_CANCELLED) { 59672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen status = TOUCH_STATUS_CANCEL; 597201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 598201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 59972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return status; 60072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 60172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::OnKeyPressed(const views::KeyEvent& event) { 603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(suzhe): Support editor key bindings. 604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ForwardKeyboardEvent(NativeWebKeyboardEvent(event)); 607ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 608ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 609ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 610ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::OnKeyReleased(const views::KeyEvent& event) { 611ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 612ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 613ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ForwardKeyboardEvent(NativeWebKeyboardEvent(event)); 614ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 615ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 616ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 617ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::OnMouseWheel( 618ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const views::MouseWheelEvent& event) { 619ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 620ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 621ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 622ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebMouseWheelEvent wmwe; 623ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InitializeWebMouseEventFromViewsEvent(event, GetMirroredPosition(), &wmwe); 624ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmwe.type = WebKit::WebInputEvent::MouseWheel; 626ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmwe.button = WebKit::WebMouseEvent::ButtonNone; 627ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(sadrul): How do we determine if it's a horizontal scroll? 629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmwe.deltaY = event.offset(); 630ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmwe.wheelTicksY = wmwe.deltaY > 0 ? 1 : -1; 631ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 632ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ForwardWheelEvent(wmwe); 633ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 634ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenviews::TextInputClient* RenderWidgetHostViewViews::GetTextInputClient() { 637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return this; 638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 640ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TextInputClient implementation --------------------------------------------- 641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::SetCompositionText( 642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ui::CompositionText& composition) { 643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 644ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 645ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 646ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ui::CompositionUnderline should be identical to 647ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // WebKit::WebCompositionUnderline, so that we can do reinterpret_cast safely. 648ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen COMPILE_ASSERT(sizeof(ui::CompositionUnderline) == 649ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sizeof(WebKit::WebCompositionUnderline), 650ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_CompositionUnderline__WebKit_WebCompositionUnderline_diff); 651ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 652ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(suzhe): convert both renderer_host and renderer to use 653ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ui::CompositionText. 654ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<WebKit::WebCompositionUnderline>& underlines = 655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<const std::vector<WebKit::WebCompositionUnderline>&>( 656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen composition.underlines); 657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(suzhe): due to a bug of webkit, we can't use selection range with 659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // composition string. See: https://bugs.webkit.org/show_bug.cgi?id=37788 660ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ImeSetComposition(composition.text, underlines, 661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen composition.selection.end(), 662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen composition.selection.end()); 663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 664ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen has_composition_text_ = !composition.text.empty(); 665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::ConfirmCompositionText() { 668ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_ && has_composition_text_) 669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ImeConfirmComposition(); 670ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen has_composition_text_ = false; 671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 672ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 673ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::ClearCompositionText() { 674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_ && has_composition_text_) 675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ImeCancelComposition(); 676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen has_composition_text_ = false; 677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::InsertText(const string16& text) { 680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(text_input_type_ != ui::TEXT_INPUT_TYPE_NONE); 681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_) 682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ImeConfirmComposition(text); 683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen has_composition_text_ = false; 684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 685ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 686ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::InsertChar(char16 ch, int flags) { 687ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_) { 688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NativeWebKeyboardEvent::FromViewsEvent from_views_event; 689ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NativeWebKeyboardEvent wke(ch, flags, base::Time::Now().ToDoubleT(), 690ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen from_views_event); 691ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ForwardKeyboardEvent(wke); 692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 693ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenui::TextInputType RenderWidgetHostViewViews::GetTextInputType() { 696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return text_input_type_; 697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsengfx::Rect RenderWidgetHostViewViews::GetCaretBounds() { 700ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return caret_bounds_; 701ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::HasCompositionText() { 704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return has_composition_text_; 705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 707ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::GetTextRange(ui::Range* range) { 708ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(suzhe): implement this method when fixing http://crbug.com/55130. 709ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTIMPLEMENTED(); 710ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 711ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 712ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 713ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::GetCompositionTextRange(ui::Range* range) { 714ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(suzhe): implement this method when fixing http://crbug.com/55130. 715ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTIMPLEMENTED(); 716ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 717ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 718ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 719ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::GetSelectionRange(ui::Range* range) { 720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(suzhe): implement this method when fixing http://crbug.com/55130. 721ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTIMPLEMENTED(); 722ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 723ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::SetSelectionRange(const ui::Range& range) { 726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(suzhe): implement this method when fixing http://crbug.com/55130. 727ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTIMPLEMENTED(); 728ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 729ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 730ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 731ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::DeleteRange(const ui::Range& range) { 732ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(suzhe): implement this method when fixing http://crbug.com/55130. 733ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTIMPLEMENTED(); 734ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 735ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 736ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 737ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::GetTextFromRange( 738ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ui::Range& range, 739ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const base::Callback<void(const string16&)>& callback) { 740ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(suzhe): implement this method when fixing http://crbug.com/55130. 741ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTIMPLEMENTED(); 742ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 743ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 744ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 745ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::OnInputMethodChanged() { 746ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 747ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 748ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 749ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(GetInputMethod()); 750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->SetInputMethodActive(GetInputMethod()->IsActive()); 751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 752ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(suzhe): implement the newly added “locale” property of HTML DOM 753ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TextEvent. 754ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 755ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::ChangeTextDirectionAndLayoutAlignment( 757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::i18n::TextDirection direction) { 758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 759ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->UpdateTextDirection( 761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen direction == base::i18n::RIGHT_TO_LEFT ? 762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebKit::WebTextDirectionRightToLeft : 763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebKit::WebTextDirectionLeftToRight); 764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->NotifyTextDirection(); 765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 767ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 768ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenviews::View* RenderWidgetHostViewViews::GetOwnerViewOfTextInputClient() { 769ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return this; 770ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 771ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 772ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::OnPaint(gfx::Canvas* canvas) { 773ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (is_hidden_ || !host_) 774ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 775ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 776ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Paint a "hole" in the canvas so that the render of the web page is on 777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // top of whatever else has already been painted in the views hierarchy. 778ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Later views might still get to paint on top. 779ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen canvas->FillRectInt(SK_ColorBLACK, 0, 0, 780ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bounds().width(), bounds().height(), 781ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SkXfermode::kClear_Mode); 782ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 783ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Don't do any painting if the GPU process is rendering directly 784ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // into the View. 785ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_->is_accelerated_compositing_active()) 786ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 787ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 788ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GdkWindow* window = GetInnerNativeView()->window; 789ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(!about_to_validate_and_paint_); 790ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 791ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(anicolao): get the damage somehow 792ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // invalid_rect_ = damage_rect; 793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen invalid_rect_ = bounds(); 794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::Point origin; 795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ConvertPointToWidget(this, &origin); 796ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen about_to_validate_and_paint_ = true; 798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BackingStore* backing_store = host_->GetBackingStore(true); 799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Calling GetBackingStore maybe have changed |invalid_rect_|... 800ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen about_to_validate_and_paint_ = false; 801ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 802ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::Rect paint_rect = gfx::Rect(0, 0, kMaxWindowWidth, kMaxWindowHeight); 803ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen paint_rect = paint_rect.Intersect(invalid_rect_); 804ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 805ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (backing_store) { 806ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Only render the widget if it is attached to a window; there's a short 807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // period where this object isn't attached to a window but hasn't been 808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Destroy()ed yet and it receives paint messages... 809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (window) { 810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!visually_deemphasized_) { 811ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // In the common case, use XCopyArea. We don't draw more than once, so 812ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // we don't need to double buffer. 813ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 814ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (UsingBackingStoreSkia()) { 815ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<BackingStoreSkia*>(backing_store)->SkiaShowRect( 816ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::Point(paint_rect.x(), paint_rect.y()), canvas); 817ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 818ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<BackingStoreX*>(backing_store)->XShowRect(origin, 819ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen paint_rect, ui::GetX11WindowFromGdkWindow(window)); 820ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 821ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else if (!UsingBackingStoreSkia()) { 822ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If the grey blend is showing, we make two drawing calls. Use double 823ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // buffering to prevent flicker. Use CairoShowRect because XShowRect 824ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // shortcuts GDK's double buffering. 825ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GdkRectangle rect = { paint_rect.x(), paint_rect.y(), 826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen paint_rect.width(), paint_rect.height() }; 827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gdk_window_begin_paint_rect(window, &rect); 828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 829ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<BackingStoreX*>(backing_store)->CairoShowRect( 830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen paint_rect, GDK_DRAWABLE(window)); 831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 832ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cairo_t* cr = gdk_cairo_create(window); 833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gdk_cairo_rectangle(cr, &rect); 834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cairo_set_source_rgba(cr, 0, 0, 0, 0.7); 835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cairo_fill(cr); 836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cairo_destroy(cr); 837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gdk_window_end_paint(window); 839ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(sad) 841ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTIMPLEMENTED(); 842ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 843ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!whiteout_start_time_.is_null()) { 845ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::TimeDelta whiteout_duration = base::TimeTicks::Now() - 846ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen whiteout_start_time_; 847ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UMA_HISTOGRAM_TIMES("MPArch.RWHH_WhiteoutDuration", whiteout_duration); 848ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 849ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Reset the start time to 0 so that we start recording again the next 850ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // time the backing store is NULL... 851ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen whiteout_start_time_ = base::TimeTicks(); 852ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 853ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!tab_switch_paint_time_.is_null()) { 854ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::TimeDelta tab_switch_paint_duration = base::TimeTicks::Now() - 855ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tab_switch_paint_time_; 856ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UMA_HISTOGRAM_TIMES("MPArch.RWH_TabSwitchPaintDuration", 857ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tab_switch_paint_duration); 858ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Reset tab_switch_paint_time_ to 0 so future tab selections are 859ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // recorded. 860ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tab_switch_paint_time_ = base::TimeTicks(); 861ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 862ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 863ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (whiteout_start_time_.is_null()) 864ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen whiteout_start_time_ = base::TimeTicks::Now(); 865ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 866ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 867ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 868ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::Focus() { 869ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RequestFocus(); 870ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 871ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 872ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::Blur() { 873ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(estade): We should be clearing native focus as well, but I know of no 874ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // way to do that without focusing another widget. 875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_) 876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->Blur(); 877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 879ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::OnFocus() { 880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(GetInputMethod()); 884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen View::OnFocus(); 885ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ShowCurrentCursor(); 886ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->GotFocus(); 887ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->SetInputMethodActive(GetInputMethod()->IsActive()); 888ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 889ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 890ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::OnBlur() { 891ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!host_) 892ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 893ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen View::OnBlur(); 894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If we are showing a context menu, maintain the illusion that webkit has 895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // focus. 896ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!is_showing_context_menu_ && !is_hidden_) 897ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->Blur(); 898ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->SetInputMethodActive(false); 899ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 900ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 901ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::NeedsInputGrab() { 902ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return popup_type_ == WebKit::WebPopupTypeSelect; 903ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 904ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 905ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RenderWidgetHostViewViews::IsPopup() { 906ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return popup_type_ != WebKit::WebPopupTypeNone; 907ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 908ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 909ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::ShowCurrentCursor() { 910ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The widget may not have a window. If that's the case, abort mission. This 911ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // is the same issue as that explained above in Paint(). 912ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!GetInnerNativeView() || !GetInnerNativeView()->window) 913ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 914ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 915ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen native_cursor_ = current_cursor_.GetNativeCursor(); 916ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 918ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenWebKit::WebMouseEvent RenderWidgetHostViewViews::WebMouseEventFromViewsEvent( 919ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const views::MouseEvent& event) { 920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebKit::WebMouseEvent wmevent; 921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InitializeWebMouseEventFromViewsEvent(event, GetMirroredPosition(), &wmevent); 922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Setting |wmevent.button| is not necessary for -move events, but it is 924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // necessary for -clicks and -drags. 925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (event.IsMiddleMouseButton()) { 926ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmevent.modifiers |= WebKit::WebInputEvent::MiddleButtonDown; 927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmevent.button = WebKit::WebMouseEvent::ButtonMiddle; 928ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (event.IsRightMouseButton()) { 930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmevent.modifiers |= WebKit::WebInputEvent::RightButtonDown; 931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmevent.button = WebKit::WebMouseEvent::ButtonRight; 932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (event.IsLeftMouseButton()) { 934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmevent.modifiers |= WebKit::WebInputEvent::LeftButtonDown; 935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wmevent.button = WebKit::WebMouseEvent::ButtonLeft; 936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return wmevent; 939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderWidgetHostViewViews::FinishImeCompositionSession() { 942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!has_composition_text_) 943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (host_) 945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_->ImeConfirmComposition(); 946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(GetInputMethod()); 947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetInputMethod()->CancelComposition(this); 948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen has_composition_text_ = false; 949201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 950201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 951731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static 952731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostView* 953731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView( 954731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::NativeView widget) { 955731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gpointer user_data = g_object_get_data(G_OBJECT(widget), 956731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick kRenderWidgetHostViewKey); 957731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return reinterpret_cast<RenderWidgetHostView*>(user_data); 958731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 959