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