render_widget_host_view_views.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright (c) 2010 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"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/renderer_host/backing_store_skia.h"
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/renderer_host/backing_store_x.h"
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/renderer_host/render_widget_host.h"
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/native_web_keyboard_event.h"
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/render_messages.h"
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/result_codes.h"
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/gtk/WebInputEventFactory.h"
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/keycodes/keyboard_code_conversion_gtk.h"
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/x/x11_util.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas.h"
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas_skia.h"
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/events/event.h"
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/ime/ime_context.h"
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "views/widget/widget.h"
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "views/widget/widget_gtk.h"
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kMaxWindowWidth = 4000;
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kMaxWindowHeight = 4000;
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstatic const char kRenderWidgetHostViewKey[] = "__RENDER_WIDGET_HOST_VIEW__";
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstatic const char kBackingStoreSkiaSwitch[] = "use-backing-store-skia";
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copied from third_party/WebKit/Source/WebCore/page/EventHandler.cpp
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Match key code of composition keydown event on windows.
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// IE sends VK_PROCESSKEY which has value 229;
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Please refer to following documents for detals:
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// - Virtual-Key Codes
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// - How the IME System Works
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   http://msdn.microsoft.com/en-us/library/cc194848.aspx
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// - ImmGetVirtualKey Function
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   http://msdn.microsoft.com/en-us/library/dd318570(VS.85).aspx
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstatic const int kCompositionEventKeyCode = 229;
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebInputEventFactory;
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebMouseWheelEvent;
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochusing WebKit::WebTouchEvent;
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst char RenderWidgetHostViewViews::kViewClassName[] =
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    "browser/renderer_host/RenderWidgetHostViewViews";
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace {
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool UsingBackingStoreSkia() {
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static bool decided = false;
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static bool use_skia = false;
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!decided) {
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    CommandLine* cmdline = CommandLine::ForCurrentProcess();
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    use_skia = (cmdline && cmdline->HasSwitch(kBackingStoreSkiaSwitch));
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    decided = true;
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return use_skia;
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickint WebInputEventFlagsFromViewsEvent(const views::Event& event) {
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int modifiers = 0;
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsShiftDown())
79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    modifiers |= WebKit::WebInputEvent::ShiftKey;
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsControlDown())
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    modifiers |= WebKit::WebInputEvent::ControlKey;
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsAltDown())
83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    modifiers |= WebKit::WebInputEvent::AltKey;
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (event.IsCapsLockDown())
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    modifiers |= WebKit::WebInputEvent::CapsLockOn;
86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return modifiers;
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochWebKit::WebTouchPoint::State TouchPointStateFromEvent(
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const views::TouchEvent* event) {
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  switch (event->type()) {
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_PRESSED:
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return WebKit::WebTouchPoint::StatePressed;
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_RELEASED:
96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return WebKit::WebTouchPoint::StateReleased;
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_MOVED:
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return WebKit::WebTouchPoint::StateMoved;
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_CANCELLED:
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return WebKit::WebTouchPoint::StateCancelled;
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    default:
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return WebKit::WebTouchPoint::StateUndefined;
103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochWebKit::WebInputEvent::Type TouchEventTypeFromEvent(
107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const views::TouchEvent* event) {
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  switch (event->type()) {
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_PRESSED:
110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return WebKit::WebInputEvent::TouchStart;
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_RELEASED:
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return WebKit::WebInputEvent::TouchEnd;
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_MOVED:
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return WebKit::WebInputEvent::TouchMove;
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_CANCELLED:
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return WebKit::WebInputEvent::TouchCancel;
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    default:
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return WebKit::WebInputEvent::Undefined;
119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid UpdateTouchPointPosition(const views::TouchEvent* event,
123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                              const gfx::Point& origin,
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                              WebKit::WebTouchPoint* tpoint) {
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tpoint->position.x = event->x();
126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tpoint->position.y = event->y();
127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tpoint->screenPosition.x = tpoint->position.x + origin.x();
129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  tpoint->screenPosition.y = tpoint->position.y + origin.y();
130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid InitializeWebMouseEventFromViewsEvent(const views::LocatedEvent& e,
133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                           const gfx::Point& origin,
134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                           WebKit::WebMouseEvent* wmevent) {
135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  wmevent->timeStampSeconds = base::Time::Now().ToDoubleT();
136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  wmevent->modifiers = WebInputEventFlagsFromViewsEvent(e);
137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  wmevent->windowX = wmevent->x = e.x();
139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  wmevent->windowY = wmevent->y = e.y();
140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  wmevent->globalX = wmevent->x + origin.x();
141201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  wmevent->globalY = wmevent->y + origin.y();
142201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass IMEContextHandler : public views::CommitTextListener,
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                          public views::CompositionListener,
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                          public views::ForwardKeyEventListener {
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit IMEContextHandler(
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      RenderWidgetHostViewViews* host_view)
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : host_view_(host_view),
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      is_enabled_(false),
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      is_focused_(false),
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ime_context_(views::IMEContext::Create(host_view_)) {
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ime_context_->set_commit_text_listener(this);
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ime_context_->set_composition_listener(this);
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ime_context_->set_forward_key_event_listener(this);
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // IMEContext Listeners implementation
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnCommitText(views::IMEContext* sender,
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            const string16& text) {
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(ime_context_ == sender);
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    RenderWidgetHost* host = host_view_->GetRenderWidgetHost();
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (host) {
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      SendFakeCompositionWebKeyboardEvent(WebKit::WebInputEvent::RawKeyDown);
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      host->ImeConfirmComposition(text);
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      SendFakeCompositionWebKeyboardEvent(WebKit::WebInputEvent::KeyUp);
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnStartComposition(views::IMEContext* sender) {
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(ime_context_ == sender);
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnEndComposition(views::IMEContext* sender) {
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(ime_context_ == sender);
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    RenderWidgetHost* host = host_view_->GetRenderWidgetHost();
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (host)
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      host->ImeCancelComposition();
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnSetComposition(views::IMEContext* sender,
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const string16& text,
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const views::CompositionAttributeList& attributes,
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      uint32 cursor_pos) {
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(ime_context_ == sender);
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    RenderWidgetHost* host = host_view_->GetRenderWidgetHost();
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (host) {
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      SendFakeCompositionWebKeyboardEvent(WebKit::WebInputEvent::RawKeyDown);
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // Cast CompositonAttribute to WebKit::WebCompositionUnderline directly,
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // becasue CompositionAttribute is duplicated from
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // WebKit::WebCompositionUnderline.
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const std::vector<WebKit::WebCompositionUnderline>& underlines =
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          reinterpret_cast<const std::vector<WebKit::WebCompositionUnderline>&>(
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              attributes);
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      host->ImeSetComposition(text, underlines, cursor_pos, cursor_pos);
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      SendFakeCompositionWebKeyboardEvent(WebKit::WebInputEvent::KeyUp);
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnForwardKeyEvent(views::IMEContext* sender,
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                 const views::KeyEvent& event) {
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(ime_context_ == sender);
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    host_view_->ForwardKeyEvent(event);
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool FilterKeyEvent(const views::KeyEvent& event) {
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return is_enabled_ && ime_context_->FilterKeyEvent(event);
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void Focus() {
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (!is_focused_) {
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ime_context_->Focus();
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      is_focused_ = true;
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Enables RenderWidget's IME related events, so that we can be notified
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // when WebKit wants to enable or disable IME.
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    RenderWidgetHost* host = host_view_->GetRenderWidgetHost();
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (host)
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      host->SetInputMethodActive(true);
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void Blur() {
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_focused_) {
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ime_context_->Blur();
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      is_focused_ = false;
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Disable RenderWidget's IME related events to save bandwidth.
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    RenderWidgetHost* host = host_view_->GetRenderWidgetHost();
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (host)
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      host->SetInputMethodActive(false);
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void ImeUpdateTextInputState(WebKit::WebTextInputType type,
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               const gfx::Rect& caret_rect) {
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool enable =
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        (type != WebKit::WebTextInputTypeNone) &&
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        (type != WebKit::WebTextInputTypePassword);
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_enabled_ != enable) {
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      is_enabled_ = enable;
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (is_focused_) {
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (is_enabled_)
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          ime_context_->Focus();
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        else
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          ime_context_->Blur();
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_enabled_) {
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      gfx::Point p(caret_rect.origin());
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      views::View::ConvertPointToScreen(host_view_, &p);
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ime_context_->SetCursorLocation(gfx::Rect(p, caret_rect.size()));
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void Reset() {
26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ime_context_->Reset();
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void SendFakeCompositionWebKeyboardEvent(WebKit::WebInputEvent::Type type) {
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    NativeWebKeyboardEvent fake_event;
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    fake_event.windowsKeyCode = kCompositionEventKeyCode;
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    fake_event.skip_in_browser = true;
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    fake_event.type = type;
27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    host_view_->ForwardWebKeyboardEvent(fake_event);
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  RenderWidgetHostViewViews* host_view_;
28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool is_enabled_;
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool is_focused_;
28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<views::IMEContext> ime_context_;
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(IMEContextHandler);
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
290731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget(
291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    RenderWidgetHost* widget) {
292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return new RenderWidgetHostViewViews(widget);
293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
295731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostViewViews::RenderWidgetHostViewViews(RenderWidgetHost* host)
296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : host_(host),
297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      about_to_validate_and_paint_(false),
298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_hidden_(false),
299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_loading_(false),
300201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      native_cursor_(NULL),
301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_showing_context_menu_(false),
302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      visually_deemphasized_(false),
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      touch_event_() {
304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SetFocusable(true);
305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_->set_view(this);
306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
308731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostViewViews::~RenderWidgetHostViewViews() {
309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::InitAsChild() {
312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Show();
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ime_context_.reset(new IMEContextHandler(this));
314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
316731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHost* RenderWidgetHostViewViews::GetRenderWidgetHost() const {
317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return host_;
318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::InitAsPopup(
321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    RenderWidgetHostView* parent_host_view,
322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const gfx::Rect& pos) {
323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): figure out cases where popups occur and implement
324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
325731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
32772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid RenderWidgetHostViewViews::InitAsFullscreen() {
328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidBecomeSelected() {
332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!is_hidden_)
333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (tab_switch_paint_time_.is_null())
336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    tab_switch_paint_time_ = base::TimeTicks::Now();
337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  is_hidden_ = false;
338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_->WasRestored();
339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::WasHidden() {
342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (is_hidden_)
343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If we receive any more paint messages while we are hidden, we want to
346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // ignore them so we don't re-allocate the backing store.  We will paint
347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // everything again when we become selected again.
348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  is_hidden_ = true;
349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If we have a renderer, then inform it that we are being hidden so it can
351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // reduce its resource utilization.
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetRenderWidgetHost()->WasHidden();
353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetSize(const gfx::Size& size) {
356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This is called when webkit has sent us a Move message.
357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int width = std::min(size.width(), kMaxWindowWidth);
358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int height = std::min(size.height(), kMaxWindowHeight);
359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (requested_size_.width() != width ||
360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      requested_size_.height() != height) {
361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    requested_size_ = gfx::Size(width, height);
36272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SetBounds(x(), y(), width, height);
363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    host_->WasResized();
364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::MovePluginWindows(
36821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::vector<webkit::npapi::WebPluginGeometry>& moves) {
369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): NIY
37021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // NOTIMPLEMENTED();
371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Focus() {
374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RequestFocus();
375731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
376731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::HasFocus() {
378731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return View::HasFocus();
379731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
381731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Show() {
382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SetVisible(true);
383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
385731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Hide() {
386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SetVisible(false);
387731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
388731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
389731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Blur() {
390731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(estade): We should be clearing native focus as well, but I know of no
391731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // way to do that without focusing another widget.
392731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_->Blur();
393731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
394731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
395731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::IsShowing() {
396731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return IsVisible();
397731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
398731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
399731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::Rect RenderWidgetHostViewViews::GetViewBounds() const {
400731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return bounds();
401731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
403731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::UpdateCursor(const WebCursor& cursor) {
404731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Optimize the common case, where the cursor hasn't changed.
405731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // However, we can switch between different pixmaps, so only on the
406731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // non-pixmap branch.
407731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (current_cursor_.GetCursorType() != GDK_CURSOR_IS_PIXMAP &&
408731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      current_cursor_.GetCursorType() == cursor.GetCursorType()) {
409731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
410731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
411731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
412731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  current_cursor_ = cursor;
413731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ShowCurrentCursor();
414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
415731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetIsLoading(bool is_loading) {
417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  is_loading_ = is_loading;
418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Only call ShowCurrentCursor() when it will actually change the cursor.
419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (current_cursor_.GetCursorType() == GDK_LAST_CURSOR)
420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ShowCurrentCursor();
421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
422731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
423731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ImeUpdateTextInputState(
424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebTextInputType type,
425731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const gfx::Rect& caret_rect) {
42672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ime_context_->ImeUpdateTextInputState(type, caret_rect);
427731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
428731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
429731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ImeCancelComposition() {
43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ime_context_->Reset();
431731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidUpdateBackingStore(
434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy,
435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const std::vector<gfx::Rect>& copy_rects) {
436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (is_hidden_)
437731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
439731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(darin): Implement the equivalent of Win32's ScrollWindowEX.  Can that
440731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // be done using XCopyArea?  Perhaps similar to
441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // BackingStore::ScrollBackingStore?
442731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (about_to_validate_and_paint_)
443731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    invalid_rect_ = invalid_rect_.Union(scroll_rect);
444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  else
445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SchedulePaint(scroll_rect, false);
446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (size_t i = 0; i < copy_rects.size(); ++i) {
448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Avoid double painting.  NOTE: This is only relevant given the call to
449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Paint(scroll_rect) above.
450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gfx::Rect rect = copy_rects[i].Subtract(scroll_rect);
451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (rect.IsEmpty())
452731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      continue;
453731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (about_to_validate_and_paint_)
455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      invalid_rect_ = invalid_rect_.Union(rect);
456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    else
457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      SchedulePaint(rect, false);
458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  invalid_rect_ = invalid_rect_.Intersect(bounds());
460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
46221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid RenderWidgetHostViewViews::RenderViewGone(base::TerminationStatus status,
46321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                               int error_code) {
464513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GetRenderWidgetHost()->ViewDestroyed();
465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Destroy();
466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Destroy() {
46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // host_'s destruction brought us here, null it out so we don't use it
47072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  host_ = NULL;
47172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
47272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (parent())
47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    parent()->RemoveChildView(this);
47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MessageLoop::current()->DeleteSoon(FROM_HERE, this);
475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetTooltipText(const std::wstring& tip) {
478731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): decide if we want tooltips for touch (none specified
479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // right now/might want a press-and-hold display)
480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // NOTIMPLEMENTED(); ... too annoying, it triggers for every mousemove
481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SelectionChanged(const std::string& text) {
484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): deal with the clipboard without GTK
485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ShowingContextMenu(bool showing) {
489731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  is_showing_context_menu_ = showing;
490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::NeedsInputGrab() {
493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return popup_type_ == WebKit::WebPopupTypeSelect;
494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
495731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
496731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::IsPopup() {
497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return popup_type_ != WebKit::WebPopupTypeNone;
498731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
499731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
500731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBackingStore* RenderWidgetHostViewViews::AllocBackingStore(
501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const gfx::Size& size) {
50272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  gfx::NativeView nview = GetInnerNativeView();
50372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!nview)
50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return NULL;
50572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
50672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (UsingBackingStoreSkia()) {
50772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return new BackingStoreSkia(host_, size);
50872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else {
50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return new BackingStoreX(host_, size,
51072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             ui::GetVisualFromGtkWidget(nview),
51172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             gtk_widget_get_visual(nview)->depth);
51272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
513731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
514731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
51572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsengfx::NativeView RenderWidgetHostViewViews::GetInnerNativeView() const {
51621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // TODO(sad): Ideally this function should be equivalent to GetNativeView, and
51721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // WidgetGtk-specific function call should not be necessary.
51872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const views::WidgetGtk* widget =
51972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<const views::WidgetGtk*>(GetWidget());
52021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return widget ? widget->window_contents() : NULL;
52121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
52221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
52321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsengfx::NativeView RenderWidgetHostViewViews::GetNativeView() {
524201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (GetWidget())
525201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return GetWidget()->GetNativeView();
526201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return NULL;
527731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
528731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetBackground(const SkBitmap& background) {
530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RenderWidgetHostView::SetBackground(background);
531731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_->Send(new ViewMsg_SetBackground(host_->routing_id(), background));
532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Paint(gfx::Canvas* canvas) {
535201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (is_hidden_) {
536201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
537201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
538201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
539201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Paint a "hole" in the canvas so that the render of the web page is on
540201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // top of whatever else has already been painted in the views hierarchy.
541201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Later views might still get to paint on top.
54272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  canvas->FillRectInt(SK_ColorBLACK, 0, 0,
54372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                      bounds().width(), bounds().height(),
544201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                      SkXfermode::kClear_Mode);
545201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
546731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Don't do any painting if the GPU process is rendering directly
547731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // into the View.
548731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RenderWidgetHost* render_widget_host = GetRenderWidgetHost();
549201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (render_widget_host->is_accelerated_compositing_active()) {
550731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
551731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
552731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
55372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GdkWindow* window = GetInnerNativeView()->window;
554731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(!about_to_validate_and_paint_);
555731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
556731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): get the damage somehow
557513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // invalid_rect_ = damage_rect;
558731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  invalid_rect_ = bounds();
559201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  gfx::Point origin;
560201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ConvertPointToWidget(this, &origin);
561201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
562731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  about_to_validate_and_paint_ = true;
56372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BackingStore* backing_store = host_->GetBackingStore(true);
564731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Calling GetBackingStore maybe have changed |invalid_rect_|...
565731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  about_to_validate_and_paint_ = false;
566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gfx::Rect paint_rect = gfx::Rect(0, 0, kMaxWindowWidth, kMaxWindowHeight);
568731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  paint_rect = paint_rect.Intersect(invalid_rect_);
569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (backing_store) {
571731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Only render the widget if it is attached to a window; there's a short
572731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // period where this object isn't attached to a window but hasn't been
573731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Destroy()ed yet and it receives paint messages...
574731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (window) {
575731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      if (!visually_deemphasized_) {
576731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // In the common case, use XCopyArea. We don't draw more than once, so
577731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // we don't need to double buffer.
57872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
57972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (UsingBackingStoreSkia()) {
58072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          static_cast<BackingStoreSkia*>(backing_store)->SkiaShowRect(
58172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              gfx::Point(paint_rect.x(), paint_rect.y()), canvas);
58272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        } else {
58372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          static_cast<BackingStoreX*>(backing_store)->XShowRect(origin,
58472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              paint_rect, ui::GetX11WindowFromGdkWindow(window));
58572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        }
58672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      } else if (!UsingBackingStoreSkia()) {
587731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // If the grey blend is showing, we make two drawing calls. Use double
588731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // buffering to prevent flicker. Use CairoShowRect because XShowRect
589731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // shortcuts GDK's double buffering.
590731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        GdkRectangle rect = { paint_rect.x(), paint_rect.y(),
591731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              paint_rect.width(), paint_rect.height() };
592731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        gdk_window_begin_paint_rect(window, &rect);
593731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
59472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        static_cast<BackingStoreX*>(backing_store)->CairoShowRect(
59572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            paint_rect, GDK_DRAWABLE(window));
596731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
597731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        cairo_t* cr = gdk_cairo_create(window);
598731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        gdk_cairo_rectangle(cr, &rect);
599731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        cairo_set_source_rgba(cr, 0, 0, 0, 0.7);
600731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        cairo_fill(cr);
601731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        cairo_destroy(cr);
602731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
603731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        gdk_window_end_paint(window);
60472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      } else {
60572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        // TODO(sad)
60672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NOTIMPLEMENTED();
607731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      }
608731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
609731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!whiteout_start_time_.is_null()) {
610731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      base::TimeDelta whiteout_duration = base::TimeTicks::Now() -
611731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          whiteout_start_time_;
612731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UMA_HISTOGRAM_TIMES("MPArch.RWHH_WhiteoutDuration", whiteout_duration);
613731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
614731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Reset the start time to 0 so that we start recording again the next
615731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // time the backing store is NULL...
616731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      whiteout_start_time_ = base::TimeTicks();
617731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
618731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!tab_switch_paint_time_.is_null()) {
619731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      base::TimeDelta tab_switch_paint_duration = base::TimeTicks::Now() -
620731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          tab_switch_paint_time_;
621731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UMA_HISTOGRAM_TIMES("MPArch.RWH_TabSwitchPaintDuration",
622731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          tab_switch_paint_duration);
623731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Reset tab_switch_paint_time_ to 0 so future tab selections are
624731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // recorded.
625731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      tab_switch_paint_time_ = base::TimeTicks();
626731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
627731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  } else {
628731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (whiteout_start_time_.is_null())
629731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      whiteout_start_time_ = base::TimeTicks::Now();
630731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
631731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
632731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
633201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochgfx::NativeCursor RenderWidgetHostViewViews::GetCursorForPoint(
63472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::EventType type, const gfx::Point& point) {
635201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return native_cursor_;
636201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
637201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
638731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMousePressed(const views::MouseEvent& event) {
639731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RequestFocus();
640731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
641731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): validate event generation.
642731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event);
643731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
644731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): deal with double clicks
645731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  e.type = WebKit::WebInputEvent::MouseDown;
646731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  e.clickCount = 1;
647731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
648731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetRenderWidgetHost()->ForwardMouseEvent(e);
649731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return true;
650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
652731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseReleased(const views::MouseEvent& event,
653731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                bool canceled) {
654731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event);
655731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
656731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  e.type = WebKit::WebInputEvent::MouseUp;
657731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  e.clickCount = 1;
658731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
659731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetRenderWidgetHost()->ForwardMouseEvent(e);
660731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
661731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
662731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMouseDragged(const views::MouseEvent& event) {
663731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  OnMouseMoved(event);
664731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return true;
665731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
666731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
667731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseMoved(const views::MouseEvent& event) {
668731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event);
669731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
670731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  e.type = WebKit::WebInputEvent::MouseMove;
671731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
672731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetRenderWidgetHost()->ForwardMouseEvent(e);
673731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
674731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
675731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseEntered(const views::MouseEvent& event) {
676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Already generated synthetically by webkit.
677731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
678731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
679731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseExited(const views::MouseEvent& event) {
680731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Already generated synthetically by webkit.
681731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
682731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
683731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMouseWheel(const views::MouseWheelEvent& e) {
684201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  WebMouseWheelEvent wmwe;
68572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  InitializeWebMouseEventFromViewsEvent(e, GetMirroredPosition(), &wmwe);
686201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
687201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  wmwe.type = WebKit::WebInputEvent::MouseWheel;
688201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  wmwe.button = WebKit::WebMouseEvent::ButtonNone;
689201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
690201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // TODO(sadrul): How do we determine if it's a horizontal scroll?
69172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  wmwe.deltaY = e.offset();
692201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  wmwe.wheelTicksY = wmwe.deltaY > 0 ? 1 : -1;
693201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
694201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GetRenderWidgetHost()->ForwardWheelEvent(wmwe);
695201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
697731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
69872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool RenderWidgetHostViewViews::OnKeyPressed(const views::KeyEvent& e) {
69972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!ime_context_->FilterKeyEvent(e))
70072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ForwardKeyEvent(e);
701731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return TRUE;
702731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
703731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
70472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool RenderWidgetHostViewViews::OnKeyReleased(const views::KeyEvent& e) {
70572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!ime_context_->FilterKeyEvent(e))
70672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ForwardKeyEvent(e);
707731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return TRUE;
708731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
709731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
710731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidGainFocus() {
711731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if 0
712731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): - is this needed/replicable?
713731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Comes from the GTK equivalent.
714731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
715731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int x, y;
716731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gtk_widget_get_pointer(native_view(), &x, &y);
717731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // http://crbug.com/13389
718731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If the cursor is in the render view, fake a mouse move event so that
719731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // webkit updates its state. Otherwise webkit might think the cursor is
720731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // somewhere it's not.
721731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (x >= 0 && y >= 0 && x < native_view()->allocation.width &&
722731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      y < native_view()->allocation.height) {
723731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebMouseEvent fake_event;
724731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.timeStampSeconds = base::Time::Now().ToDoubleT();
725731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.modifiers = 0;
726731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.windowX = fake_event.x = x;
727731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.windowY = fake_event.y = y;
728731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gdk_window_get_origin(native_view()->window, &x, &y);
729731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.globalX = fake_event.x + x;
730731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.globalY = fake_event.y + y;
731731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.type = WebKit::WebInputEvent::MouseMove;
732731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.button = WebKit::WebMouseEvent::ButtonNone;
733731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    GetRenderWidgetHost()->ForwardMouseEvent(fake_event);
734731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
735731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif
73672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ime_context_->Focus();
737731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ShowCurrentCursor();
738731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetRenderWidgetHost()->GotFocus();
739731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
740731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
741731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::WillLoseFocus() {
742731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If we are showing a context menu, maintain the illusion that webkit has
743731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // focus.
74472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!is_showing_context_menu_ && !is_hidden_ && host_)
74572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    host_->Blur();
74672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ime_context_->Blur();
747731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
748731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
749731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
750731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ShowCurrentCursor() {
751731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // The widget may not have a window. If that's the case, abort mission. This
752731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // is the same issue as that explained above in Paint().
75372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!GetInnerNativeView() || !GetInnerNativeView()->window)
754731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
755731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
756201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  native_cursor_ = current_cursor_.GetNativeCursor();
757731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
758731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
759731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::CreatePluginContainer(
760731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gfx::PluginWindowHandle id) {
761731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): plugin_container_manager_.CreatePluginContainer(id);
762731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
763731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
764731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DestroyPluginContainer(
765731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gfx::PluginWindowHandle id) {
766731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): plugin_container_manager_.DestroyPluginContainer(id);
767731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
768731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
769201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid RenderWidgetHostViewViews::SetVisuallyDeemphasized(
770201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const SkColor* color, bool animate) {
771731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao)
772731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
773731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
774731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::ContainsNativeView(
775731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gfx::NativeView native_view) const {
776731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(port)
777731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTREACHED() <<
778731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    "RenderWidgetHostViewViews::ContainsNativeView not implemented.";
779731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return false;
780731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
781731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
782201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid RenderWidgetHostViewViews::AcceleratedCompositingActivated(
783201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    bool activated) {
784201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // TODO(anicolao): figure out if we need something here
785201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (activated)
786201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    NOTIMPLEMENTED();
787201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
788201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
789731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickWebKit::WebMouseEvent RenderWidgetHostViewViews::WebMouseEventFromViewsEvent(
790731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const views::MouseEvent& event) {
791731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  WebKit::WebMouseEvent wmevent;
79272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  InitializeWebMouseEventFromViewsEvent(event, GetMirroredPosition(), &wmevent);
793731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
794731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Setting |wmevent.button| is not necessary for -move events, but it is
795731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // necessary for -clicks and -drags.
796731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsMiddleMouseButton()) {
797731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.modifiers |= WebKit::WebInputEvent::MiddleButtonDown;
798731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.button = WebKit::WebMouseEvent::ButtonMiddle;
799731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
800731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsRightMouseButton()) {
801731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.modifiers |= WebKit::WebInputEvent::RightButtonDown;
802731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.button = WebKit::WebMouseEvent::ButtonRight;
803731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
804731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsLeftMouseButton()) {
805731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.modifiers |= WebKit::WebInputEvent::LeftButtonDown;
806731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.button = WebKit::WebMouseEvent::ButtonLeft;
807731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
808731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
809731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return wmevent;
810731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
811731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
81272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid RenderWidgetHostViewViews::ForwardKeyEvent(
81372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const views::KeyEvent& event) {
81472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // This is how it works:
81572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // (1) If a RawKeyDown event is an accelerator for a reserved command (see
81672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //     Browser::IsReservedCommand), then the command is executed. Otherwise,
81772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //     the event is first sent off to the renderer. The renderer is also
81872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //     notified whether the event would trigger an accelerator in the browser.
81972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // (2) A Char event is then sent to the renderer.
82072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // (3) If the renderer does not process the event in step (1), and the event
82172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //     triggers an accelerator, then it will ignore the event in step (2). The
82272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //     renderer also sends back notification to the browser for both steps (1)
82372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //     and (2) about whether the events were processed or not. If the event
82472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //     for (1) is not processed by the renderer, then it is processed by the
82572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //     browser, and (2) is ignored.
82672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (event.type() == ui::ET_KEY_PRESSED) {
82772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    NativeWebKeyboardEvent wke;
82872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
82972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    wke.type = WebKit::WebInputEvent::RawKeyDown;
83072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    wke.windowsKeyCode = event.key_code();
83172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    wke.setKeyIdentifierFromWindowsKeyCode();
83272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
83372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int keyval = ui::GdkKeyCodeForWindowsKeyCode(event.key_code(),
83472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        event.IsShiftDown() ^ event.IsCapsLockDown());
83572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
83672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    wke.text[0] = wke.unmodifiedText[0] =
83772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        static_cast<unsigned short>(gdk_keyval_to_unicode(keyval));
83872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
83972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    wke.modifiers = WebInputEventFlagsFromViewsEvent(event);
84072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
84172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ForwardWebKeyboardEvent(wke);
84272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
84372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    wke.type = WebKit::WebInputEvent::Char;
84472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ForwardWebKeyboardEvent(wke);
84572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else {
84672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    NativeWebKeyboardEvent wke;
84772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
84872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    wke.type = WebKit::WebInputEvent::KeyUp;
84972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    wke.windowsKeyCode = event.key_code();
85072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    wke.setKeyIdentifierFromWindowsKeyCode();
85172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ForwardWebKeyboardEvent(wke);
85272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
85372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
85472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
85572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid RenderWidgetHostViewViews::ForwardWebKeyboardEvent(
856731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const NativeWebKeyboardEvent& event) {
857731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!host_)
858731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
859731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
860731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EditCommands edit_commands;
861731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if 0
86272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(bryeung): key bindings
863731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!event.skip_in_browser &&
864731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      key_bindings_handler_->Match(event, &edit_commands)) {
865731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    host_->ForwardEditCommandsForNextKeyEvent(edit_commands);
866731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
867731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif
86872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
869731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_->ForwardKeyboardEvent(event);
870731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
871731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
87272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenviews::View::TouchStatus RenderWidgetHostViewViews::OnTouchEvent(
87372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const views::TouchEvent& e) {
874201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Update the list of touch points first.
875201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  WebKit::WebTouchPoint* point = NULL;
87672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TouchStatus status = TOUCH_STATUS_UNKNOWN;
877201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
87872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  switch (e.type()) {
87972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_PRESSED:
880201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // Add a new touch point.
881201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (touch_event_.touchPointsLength <
882201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          WebTouchEvent::touchPointsLengthCap) {
883201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        point = &touch_event_.touchPoints[touch_event_.touchPointsLength++];
884201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        point->id = e.identity();
88572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
88672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (touch_event_.touchPointsLength == 1) {
88772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          // A new touch sequence has started.
88872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          status = TOUCH_STATUS_START;
88972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
89072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          // We also want the focus.
89172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          RequestFocus();
89272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        }
893201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
894201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
89572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_RELEASED:
89672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_CANCELLED:
89772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ui::ET_TOUCH_MOVED: {
898201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // The touch point should have been added to the event from an earlier
899201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // _PRESSED event. So find that.
900201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // At the moment, only a maximum of 4 touch-points are allowed. So a
901201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // simple loop should be sufficient.
90272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      for (int i = 0; i < touch_event_.touchPointsLength; ++i) {
903201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        point = touch_event_.touchPoints + i;
904201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        if (point->id == e.identity()) {
905201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          break;
906201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        }
907201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        point = NULL;
908201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
909201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
910201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
911201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    default:
91272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      DLOG(WARNING) << "Unknown touch event " << e.type();
913201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
914201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
915201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
916201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!point)
91772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return TOUCH_STATUS_UNKNOWN;
91872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
91972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (status != TOUCH_STATUS_START)
92072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    status = TOUCH_STATUS_CONTINUE;
921201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
922201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Update the location and state of the point.
923201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  point->state = TouchPointStateFromEvent(&e);
92472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (point->state == WebKit::WebTouchPoint::StateMoved) {
92572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // It is possible for badly written touch drivers to emit Move events even
92672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // when the touch location hasn't changed. In such cases, consume the event
92772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // and pretend nothing happened.
92872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (point->position.x == e.x() && point->position.y == e.y()) {
92972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return status;
93072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
93172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
93272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  UpdateTouchPointPosition(&e, GetMirroredPosition(), point);
933201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
934201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Mark the rest of the points as stationary.
935201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (int i = 0; i < touch_event_.touchPointsLength; ++i) {
936201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    WebKit::WebTouchPoint* iter = touch_event_.touchPoints + i;
937201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (iter != point) {
938201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      iter->state = WebKit::WebTouchPoint::StateStationary;
939201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
940201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
941201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
942201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Update the type of the touch event.
943201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  touch_event_.type = TouchEventTypeFromEvent(&e);
94472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  touch_event_.timeStampSeconds = base::Time::Now().ToDoubleT();
945201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
946201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The event and all the touches have been updated. Dispatch.
947201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  host_->ForwardTouchEvent(touch_event_);
948201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
949201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // If the touch was released, then remove it from the list of touch points.
95072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (e.type() == ui::ET_TOUCH_RELEASED) {
951201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    --touch_event_.touchPointsLength;
952201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    for (int i = point - touch_event_.touchPoints;
953201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch         i < touch_event_.touchPointsLength;
954201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch         ++i) {
955201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      touch_event_.touchPoints[i] = touch_event_.touchPoints[i + 1];
956201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
95772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (touch_event_.touchPointsLength == 0)
95872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      status = TOUCH_STATUS_END;
95972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (e.type() == ui::ET_TOUCH_CANCELLED) {
96072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    status = TOUCH_STATUS_CANCEL;
961201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
962201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
96372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return status;
96472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
96572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
96672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::string RenderWidgetHostViewViews::GetClassName() const {
96772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return kViewClassName;
968201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
969201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
970731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
971731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostView*
972731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView(
973731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        gfx::NativeView widget) {
974731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gpointer user_data = g_object_get_data(G_OBJECT(widget),
975731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                         kRenderWidgetHostViewKey);
976731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return reinterpret_cast<RenderWidgetHostView*>(user_data);
977731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
978