15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_aura.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/auto_reset.h"
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/callback_helpers.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/command_line.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "cc/layers/layer.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/output/copy_output_request.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/output/copy_output_result.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/resources/texture_mailbox.h"
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "cc/trees/layer_tree_settings.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_manager.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_state_impl.h"
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/frame_host/frame_tree.h"
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/frame_host/frame_tree_node.h"
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/frame_host/render_frame_host_impl.h"
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/browser/gpu/compositor_util.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/compositor_resize_lock_aura.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/dip_util.h"
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/renderer_host/input/synthetic_gesture_target_aura.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/overscroll_controller.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_delegate.h"
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/renderer_host/render_view_host_delegate_view.h"
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/renderer_host/render_view_host_impl.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/ui_events_helper.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/web_input_event_aura.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/gl_helper.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_messages.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/content_browser_client.h"
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/overscroll_configuration.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/public/browser/render_widget_host_view_frame_subscriber.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/common/content_switches.h"
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebScreenInfo.h"
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/cursor_client.h"
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/client/cursor_client_observer.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/focus_client.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/screen_position_client.h"
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/client/window_tree_client.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_observer.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_tracker.h"
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/scoped_clipboard_writer.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ime/input_method.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_types.h"
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/compositor/compositor_vsync_manager.h"
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/compositor/dip_util.h"
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h"
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/gestures/gesture_recognizer.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h"
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_client.h"
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/scoped_tooltip_disabler.h"
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/tooltip_client.h"
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/transient_window_client.h"
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/wm/public/window_types.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_manager_win.h"
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_win.h"
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/legacy_render_widget_host_win.h"
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/plugin_constants_win.h"
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/hidden_window.h"
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/gdi_util.h"
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/win/dpi.h"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/common/input_messages.h"
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/linux/text_edit_command_auralinux.h"
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h"
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using gfx::RectToSkIRect;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using gfx::SkIRectToRect;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebScreenInfo;
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebInputEvent;
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebGestureEvent;
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In mouse lock mode, we need to prevent the (invisible) cursor from hitting
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the border of the view, in order to get valid movement information. However,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forcing the cursor back to the center of the view after each mouse move
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// doesn't work well. It reduces the frequency of useful mouse move messages
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// significantly. Therefore, we move the cursor to the center of the view only
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if it approaches the border. |kMouseLockBorderPercentage| specifies the width
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the border area, in percentage of the corresponding dimension.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMouseLockBorderPercentage = 15;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When accelerated compositing is enabled and a widget resize is pending,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we delay further resizes of the UI. The following constant is the maximum
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// length of time that we should delay further UI resizes while waiting for a
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resized frame from a renderer.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kResizeLockTimeoutMs = 67;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to associate a plugin HWND with its RenderWidgetHostViewAura instance.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kWidgetOwnerProperty[] = L"RenderWidgetHostViewAuraOwner";
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL CALLBACK WindowDestroyingCallback(HWND window, LPARAM param) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* widget =
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<RenderWidgetHostViewAura*>(param);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == widget) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Properties set on HWNDs must be removed to avoid leaks.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RemoveProp(window, kWidgetOwnerProperty);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostViewBase::DetachPluginWindowsCallback(window);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL CALLBACK HideWindowsCallback(HWND window, LPARAM param) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* widget =
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<RenderWidgetHostViewAura*>(param);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == widget)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetParent(window, ui::GetHiddenWindow());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL CALLBACK ShowWindowsCallback(HWND window, LPARAM param) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* widget =
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<RenderWidgetHostViewAura*>(param);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == widget &&
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      widget->GetNativeView()->GetHost()) {
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    HWND parent = widget->GetNativeView()->GetHost()->GetAcceleratedWidget();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetParent(window, parent);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return TRUE;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct CutoutRectsParams {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* widget;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<gfx::Rect> cutout_rects;
163ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<HWND, WebPluginGeometry>* geometry;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Used to update the region for the windowed plugin to draw in. We start with
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the clip rect from the renderer, then remove the cutout rects from the
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// renderer, and then remove the transient windows from the root window and the
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// constrained windows from the parent window.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BOOL CALLBACK SetCutoutRectsCallback(HWND window, LPARAM param) {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CutoutRectsParams* params = reinterpret_cast<CutoutRectsParams*>(param);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == params->widget) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // First calculate the offset of this plugin from the root window, since
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the cutouts are relative to the root window.
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    HWND parent =
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        params->widget->GetNativeView()->GetHost()->GetAcceleratedWidget();
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    POINT offset;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    offset.x = offset.y = 0;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MapWindowPoints(window, parent, &offset, 1);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Now get the cached clip rect and cutouts for this plugin window that came
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // from the renderer.
184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    std::map<HWND, WebPluginGeometry>::iterator i = params->geometry->begin();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    while (i != params->geometry->end() &&
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i->second.window != window &&
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           GetParent(i->second.window) != window) {
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++i;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i == params->geometry->end()) {
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return TRUE;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HRGN hrgn = CreateRectRgn(i->second.clip_rect.x(),
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              i->second.clip_rect.y(),
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              i->second.clip_rect.right(),
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              i->second.clip_rect.bottom());
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We start with the cutout rects that came from the renderer, then add the
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ones that came from transient and constrained windows.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<gfx::Rect> cutout_rects = i->second.cutout_rects;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < params->cutout_rects.size(); ++i) {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect offset_cutout = params->cutout_rects[i];
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offset_cutout.Offset(-offset.x, -offset.y);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cutout_rects.push_back(offset_cutout);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::SubtractRectanglesFromRegion(hrgn, cutout_rects);
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // If we don't have any cutout rects then no point in messing with the
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // window region.
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (cutout_rects.size())
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SetWindowRgn(window, hrgn, TRUE);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return TRUE;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A callback function for EnumThreadWindows to enumerate and dismiss
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// any owned popup windows.
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BOOL CALLBACK DismissOwnedPopups(HWND window, LPARAM arg) {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const HWND toplevel_hwnd = reinterpret_cast<HWND>(arg);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (::IsWindowVisible(window)) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const HWND owner = ::GetWindow(window, GW_OWNER);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (toplevel_hwnd == owner) {
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ::PostMessage(window, WM_CANCELMODE, 0, 0);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void UpdateWebTouchEventAfterDispatch(blink::WebTouchEvent* event,
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                      blink::WebTouchPoint* point) {
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (point->state != blink::WebTouchPoint::StateReleased &&
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      point->state != blink::WebTouchPoint::StateCancelled)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const unsigned new_length = event->touchesLength - 1;
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Work around a gcc 4.9 bug. crbug.com/392872
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (new_length >= event->touchesLengthCap)
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (unsigned i = point - event->touches; i < new_length; ++i)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->touches[i] = event->touches[i + 1];
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  event->touchesLength = new_length;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CanRendererHandleEvent(const ui::MouseEvent* event) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() == ui::ET_MOUSE_CAPTURE_CHANGED)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Renderer cannot handle WM_XBUTTON or NC events.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->native_event().message) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_XBUTTONDOWN:
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_XBUTTONUP:
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_XBUTTONDBLCLK:
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_NCMOUSELEAVE:
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_NCMOUSEMOVE:
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCLBUTTONDOWN:
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCLBUTTONUP:
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCLBUTTONDBLCLK:
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCRBUTTONDOWN:
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCRBUTTONUP:
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCRBUTTONDBLCLK:
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCMBUTTONDOWN:
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCMBUTTONUP:
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCMBUTTONDBLCLK:
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_NCXBUTTONDOWN:
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_NCXBUTTONUP:
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_NCXBUTTONDBLCLK:
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#elif defined(USE_X11)
27823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Renderer only supports standard mouse buttons, so ignore programmable
27923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // buttons.
28023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  switch (event->type()) {
28123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
28223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case ui::ET_MOUSE_RELEASED:
28323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return event->IsAnyButton();
28423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    default:
28523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      break;
28623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We don't mark these as handled so that they're sent back to the
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DefWindowProc so it can generate WM_APPCOMMAND as necessary.
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsXButtonUpEvent(const ui::MouseEvent* event) {
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (event->native_event().message) {
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_XBUTTONUP:
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_NCXBUTTONUP:
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetScreenInfoForWindow(WebScreenInfo* results, aura::Window* window) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Display display = window ?
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(window)->GetDisplayNearestWindow(window) :
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(window)->GetPrimaryDisplay();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->rect = display.bounds();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->availableRect = display.work_area();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(derat|oshima): Don't hardcode this. Get this from display object.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->depth = 24;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->depthPerComponent = 8;
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results->deviceScaleFactor = display.device_scale_factor();
314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The Display rotation and the WebScreenInfo orientation are not the same
316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // angle. The former is the physical display rotation while the later is the
317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // rotation required by the content to be shown properly on the screen, in
318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // other words, relative to the physical display.
3190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  results->orientationAngle = display.RotationAsDegree();
320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (results->orientationAngle == 90)
321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    results->orientationAngle = 270;
322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  else if (results->orientationAngle == 270)
323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    results->orientationAngle = 90;
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  results->orientationType =
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      RenderWidgetHostViewBase::GetOrientationTypeForDesktop(display);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PointerEventActivates(const ui::Event& event) {
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.type() == ui::ET_MOUSE_PRESSED)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.type() == ui::ET_GESTURE_BEGIN) {
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ui::GestureEvent& gesture =
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<const ui::GestureEvent&>(event);
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gesture.details().touch_points() == 1;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We need to watch for mouse events outside a Web Popup or its parent
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and dismiss the popup for certain events.
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RenderWidgetHostViewAura::EventFilterForPopupExit
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public ui::EventHandler {
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit EventFilterForPopupExit(RenderWidgetHostViewAura* rwhva)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : rwhva_(rwhva) {
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(rwhva_);
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::Env::GetInstance()->AddPreTargetHandler(this);
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~EventFilterForPopupExit() {
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::Env::GetInstance()->RemovePreTargetHandler(this);
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ui::EventHandler
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rwhva_->ApplyEventFilterForPopupExit(event);
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rwhva_->ApplyEventFilterForPopupExit(event);
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* rwhva_;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EventFilterForPopupExit);
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::ApplyEventFilterForPopupExit(
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::LocatedEvent* event) {
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (in_shutdown_ || is_fullscreen_ || !event->target())
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (event->type() != ui::ET_MOUSE_PRESSED &&
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event->type() != ui::ET_TOUCH_PRESSED) {
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = static_cast<aura::Window*>(event->target());
385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (target != window_ &&
386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      (!popup_parent_host_view_ ||
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)       target != popup_parent_host_view_->window_)) {
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Note: popup_parent_host_view_ may be NULL when there are multiple
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // popup children per view. See: RenderWidgetHostViewAura::InitAsPopup().
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    in_shutdown_ = true;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->Shutdown();
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We have to implement the WindowObserver interface on a separate object
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// because clang doesn't like implementing multiple interfaces that have
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// methods with the same name. This object is owned by the
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHostViewAura::WindowObserver : public aura::WindowObserver {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit WindowObserver(RenderWidgetHostViewAura* view)
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : view_(view) {
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->AddObserver(this);
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~WindowObserver() {
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->RemoveObserver(this);
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::WindowObserver:
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowAddedToRootWindow(aura::Window* window) OVERRIDE {
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window == view_->window_)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->AddedToRootWindow();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowRemovingFromRootWindow(aura::Window* window,
417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                              aura::Window* new_root) OVERRIDE {
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window == view_->window_)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->RemovingFromRootWindow();
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* view_;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WindowObserver);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, public:
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : host_(RenderWidgetHostImpl::From(host)),
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      window_(new aura::Window(this)),
434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      delegated_frame_host_(new DelegatedFrameHost(this)),
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in_shutdown_(false),
436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      in_bounds_changed_(false),
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_fullscreen_(false),
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_parent_host_view_(NULL),
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_child_host_view_(NULL),
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_loading_(false),
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT),
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      can_compose_inline_(true),
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_composition_text_(false),
445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      accept_return_character_(false),
446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      last_swapped_software_frame_scale_factor_(1.f),
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      paint_canvas_(NULL),
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      synthetic_move_sent_(false),
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cursor_visibility_state_in_renderer_(UNKNOWN),
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      legacy_render_widget_host_HWND_(NULL),
452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      legacy_window_destroyed_(false),
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      has_snapped_to_boundary_(false),
4551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      touch_editing_client_(NULL),
4561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      weak_ptr_factory_(this) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetView(this);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_observer_.reset(new WindowObserver(this));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetTooltipText(window_, &tooltip_);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetActivationDelegate(window_, this);
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::SetActivationChangeObserver(window_, this);
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::SetFocusChangeObserver(window_, this);
463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  window_->set_layer_owner_delegate(delegated_frame_host_.get());
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Screen::GetScreenFor(window_)->AddObserver(this);
46546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool overscroll_enabled = base::CommandLine::ForCurrentProcess()->
46746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0";
46846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetOverscrollControllerEnabled(overscroll_enabled);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, RenderWidgetHostView implementation:
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4741675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochbool RenderWidgetHostViewAura::OnMessageReceived(
4751675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    const IPC::Message& message) {
4761675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  bool handled = true;
4771675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAura, message)
4781675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // TODO(kevers): Move to RenderWidgetHostViewImpl and consolidate IPC
4791675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // messages for TextInput<State|Type>Changed. Corresponding code in
4801675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // RenderWidgetHostViewAndroid should also be moved at the same time.
4811675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    IPC_MESSAGE_HANDLER(ViewHostMsg_TextInputStateChanged,
4821675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                        OnTextInputStateChanged)
4831675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    IPC_MESSAGE_UNHANDLED(handled = false)
4841675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  IPC_END_MESSAGE_MAP()
4851675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  return handled;
4861675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch}
4871675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::InitAsChild(
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::NativeView parent_view) {
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetType(ui::wm::WINDOW_TYPE_CONTROL);
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Init(aura::WINDOW_LAYER_TEXTURED);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetName("RenderWidgetHostViewAura");
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::InitAsPopup(
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostView* parent_host_view,
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect& bounds_in_screen) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_parent_host_view_ =
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<RenderWidgetHostViewAura*>(parent_host_view);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TransientWindowClient may be NULL during tests.
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::client::TransientWindowClient* transient_window_client =
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::client::GetTransientWindowClient();
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* old_child =
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      popup_parent_host_view_->popup_child_host_view_;
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (old_child) {
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(jhorwich): Allow multiple popup_child_host_view_ per view, or
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // similar mechanism to ensure a second popup doesn't cause the first one
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // to never get a chance to filter events. See crbug.com/160589.
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(old_child->popup_parent_host_view_ == popup_parent_host_view_);
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (transient_window_client) {
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      transient_window_client->RemoveTransientChild(
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        popup_parent_host_view_->window_, old_child->window_);
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    old_child->popup_parent_host_view_ = NULL;
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_parent_host_view_->popup_child_host_view_ = this;
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetType(ui::wm::WINDOW_TYPE_MENU);
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Init(aura::WINDOW_LAYER_TEXTURED);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetName("RenderWidgetHostViewAura");
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = popup_parent_host_view_->window_->GetRootWindow();
5231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::client::ParentWindowWithContext(window_, root, bounds_in_screen);
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Setting the transient child allows for the popup to get mouse events when
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in a system modal dialog.
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This fixes crbug.com/328593.
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (transient_window_client) {
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    transient_window_client->AddTransientChild(
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        popup_parent_host_view_->window_, window_);
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetBounds(bounds_in_screen);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Show();
53434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#if !defined(OS_WIN) && !defined(OS_CHROMEOS)
53534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (NeedsInputGrab())
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window_->SetCapture();
53734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  event_filter_for_popup_exit_.reset(new EventFilterForPopupExit(this));
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::InitAsFullscreen(
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostView* reference_host_view) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_fullscreen_ = true;
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetType(ui::wm::WINDOW_TYPE_NORMAL);
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Init(aura::WINDOW_LAYER_TEXTURED);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetName("RenderWidgetHostViewAura");
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* parent = NULL;
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reference_host_view) {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* reference_window =
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<RenderWidgetHostViewAura*>(reference_host_view)->window_;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reference_window) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_tracker_.reset(new aura::WindowTracker);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_tracker_->Add(reference_window);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Display display = gfx::Screen::GetScreenFor(window_)->
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetDisplayNearestWindow(reference_window);
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent = reference_window->GetRootWindow();
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds = display.bounds();
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::client::ParentWindowWithContext(window_, parent, bounds);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Show();
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Focus();
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHost* RenderWidgetHostViewAura::GetRenderWidgetHost() const {
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::WasShown() {
57468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(host_);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_->is_hidden())
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool has_saved_frame = delegated_frame_host_->HasSavedFrame();
5796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui::LatencyInfo renderer_latency_info, browser_latency_info;
5806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (has_saved_frame) {
5816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    browser_latency_info.AddLatencyNumber(
5826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        ui::TAB_SHOW_COMPONENT, host_->GetLatencyComponentId(), 0);
5836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } else {
5846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    renderer_latency_info.AddLatencyNumber(
5856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        ui::TAB_SHOW_COMPONENT, host_->GetLatencyComponentId(), 0);
5866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
5876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  host_->WasShown(renderer_latency_info);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = window_->GetRootWindow();
59068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (root) {
59168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    aura::client::CursorClient* cursor_client =
59268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        aura::client::GetCursorClient(root);
59368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (cursor_client)
59468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible());
59568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  delegated_frame_host_->WasShown(browser_latency_info);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_) {
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Reparent the legacy Chrome_RenderWidgetHostHWND window to the parent
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // window before reparenting any plugins. This ensures that the plugin
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // windows stay on top of the child Zorder in the parent and receive
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // mouse events, etc.
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->UpdateParent(
606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        GetNativeView()->GetHost()->GetAcceleratedWidget());
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->SetBounds(
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_->GetBoundsInRootWindow());
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LPARAM lparam = reinterpret_cast<LPARAM>(this);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::WasHidden() {
61668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!host_ || host_->is_hidden())
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasHidden();
619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->WasHidden();
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  constrained_rects_.clear();
623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host) {
625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    HWND parent = host->GetAcceleratedWidget();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LPARAM lparam = reinterpret_cast<LPARAM>(this);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnumChildWindows(parent, HideWindowsCallback, lparam);
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // We reparent the legacy Chrome_RenderWidgetHostHWND window to the global
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // hidden window on the same lines as Windowed plugin windows.
6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (legacy_render_widget_host_HWND_)
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      legacy_render_widget_host_HWND_->UpdateParent(ui::GetHiddenWindow());
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetSize(const gfx::Size& size) {
6371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // For a SetSize operation, we don't care what coordinate system the origin
6381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // of the window is in, it's only important to make sure that the origin
6391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // remains constant after the operation.
6401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InternalSetBounds(gfx::Rect(window_->bounds().origin(), size));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetBounds(const gfx::Rect& rect) {
6441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Point relative_origin(rect.origin());
645a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
6461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // RenderWidgetHostViewAura::SetBounds() takes screen coordinates, but
6471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Window::SetBounds() takes parent coordinates, so do the conversion here.
6481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = window_->GetRootWindow();
6491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (root) {
6501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::client::ScreenPositionClient* screen_position_client =
6511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        aura::client::GetScreenPositionClient(root);
6521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (screen_position_client) {
6531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      screen_position_client->ConvertPointFromScreen(
6541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          window_->parent(), &relative_origin);
6551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
6571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InternalSetBounds(gfx::Rect(relative_origin, rect.size()));
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccigfx::Vector2dF RenderWidgetHostViewAura::GetLastScrollOffset() const {
6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return last_scroll_offset_;
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView RenderWidgetHostViewAura::GetNativeView() const {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeViewId RenderWidgetHostViewAura::GetNativeViewId() const {
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host)
673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return reinterpret_cast<gfx::NativeViewId>(host->GetAcceleratedWidget());
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<gfx::NativeViewId>(NULL);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeViewAccessible RenderWidgetHostViewAura::GetNativeViewAccessible() {
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return static_cast<gfx::NativeViewAccessible>(NULL);
683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HWND hwnd = host->GetAcceleratedWidget();
684116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BrowserAccessibilityManager* manager =
685116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      host_->GetOrCreateRootBrowserAccessibilityManager();
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (manager)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return manager->GetRoot()->ToBrowserAccessibilityWin();
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<gfx::NativeViewAccessible>(NULL);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ui::TextInputClient* RenderWidgetHostViewAura::GetTextInputClient() {
695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return this;
696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::SetKeyboardFocus() {
699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (CanFocus()) {
701a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    aura::WindowTreeHost* host = window_->GetHost();
702a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (host)
703a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ::SetFocus(host->GetAcceleratedWidget());
704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
708effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochRenderFrameHostImpl* RenderWidgetHostViewAura::GetFocusedFrame() {
709effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!host_->IsRenderView())
710effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
711effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderViewHost* rvh = RenderViewHost::From(host_);
712effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FrameTreeNode* focused_frame =
713effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      rvh->GetDelegate()->GetFrameTree()->GetFocusedFrame();
714effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!focused_frame)
715effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
716effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
717effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return focused_frame->current_frame_host();
718effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
719effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::MovePluginWindows(
721ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const std::vector<WebPluginGeometry>& plugin_window_moves) {
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to clip the rectangle to the tab's viewport, otherwise we will draw
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // over the browser UI.
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!window_->GetRootWindow()) {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(plugin_window_moves.empty());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HWND parent = window_->GetHost()->GetAcceleratedWidget();
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect view_bounds = window_->GetBoundsInRootWindow();
731ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::vector<WebPluginGeometry> moves = plugin_window_moves;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  gfx::Rect view_port(view_bounds.size());
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < moves.size(); ++i) {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect clip(moves[i].clip_rect);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector2d view_port_offset(
7385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        moves[i].window_rect.OffsetFromOrigin());
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    clip.Offset(view_port_offset);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    clip.Intersect(view_port);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    clip.Offset(-view_port_offset);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    moves[i].clip_rect = clip;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    moves[i].window_rect.Offset(view_bounds.OffsetFromOrigin());
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    plugin_window_moves_[moves[i].window] = moves[i];
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // constrained_rects_ are relative to the root window. We want to convert
749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // them to be relative to the plugin window.
750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (size_t j = 0; j < constrained_rects_.size(); ++j) {
751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Rect offset_cutout = constrained_rects_[j];
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offset_cutout -= moves[i].window_rect.OffsetFromOrigin();
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      moves[i].cutout_rects.push_back(offset_cutout);
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MovePluginWindowsHelper(parent, moves);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure each plugin window (or its wrapper if it exists) has a pointer to
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |this|.
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < moves.size(); ++i) {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HWND window = moves[i].window;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (GetParent(window) != parent) {
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window = GetParent(window);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!GetProp(window, kWidgetOwnerProperty))
7673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      SetProp(window, kWidgetOwnerProperty, this);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Focus() {
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure we have a FocusClient before attempting to Focus(). In some
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // situations we may not yet be in a valid Window hierarchy (such as reloading
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // after out of memory discarded the tab).
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::FocusClient* client = aura::client::GetFocusClient(window_);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (client)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->Focus();
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Blur() {
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->Blur();
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::HasFocus() const {
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_->HasFocus();
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::IsSurfaceAvailableForCopy() const {
790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return delegated_frame_host_->CanCopyToBitmap();
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Show() {
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->Show();
79568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  WasShown();
7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->Show();
7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Hide() {
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->Hide();
80468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  WasHidden();
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->Hide();
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::IsShowing() {
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_->IsVisible();
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::GetViewBounds() const {
816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return window_->GetBoundsInScreen();
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderWidgetHostViewAura::SetBackgroundOpaque(bool opaque) {
820cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderWidgetHostViewBase::SetBackgroundOpaque(opaque);
821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host_->SetBackgroundOpaque(opaque);
822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  window_->layer()->SetFillsBoundsOpaquely(opaque);
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liugfx::Size RenderWidgetHostViewAura::GetVisibleViewportSize() const {
826cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Rect requested_rect(GetRequestedRendererSize());
827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  requested_rect.Inset(insets_);
828cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return requested_rect.size();
8295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
8305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
8315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RenderWidgetHostViewAura::SetInsets(const gfx::Insets& insets) {
8325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (insets != insets_) {
8335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    insets_ = insets;
8345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    host_->WasResized();
8355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
8365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
8375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::UpdateCursor(const WebCursor& cursor) {
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_cursor_ = cursor;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Display display = gfx::Screen::GetScreenFor(window_)->
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDisplayNearestWindow(window_);
8422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  current_cursor_.SetDisplayInfo(display);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursorIfOverSelf();
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetIsLoading(bool is_loading) {
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_loading_ = is_loading;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursorIfOverSelf();
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8511675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochvoid RenderWidgetHostViewAura::TextInputTypeChanged(
8521675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    ui::TextInputType type,
8531675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    ui::TextInputMode input_mode,
8541675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    bool can_compose_inline) {
8551675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  if (text_input_type_ != type ||
8561675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      text_input_mode_ != input_mode ||
8571675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      can_compose_inline_ != can_compose_inline) {
8581675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    text_input_type_ = type;
8591675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    text_input_mode_ = input_mode;
8601675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    can_compose_inline_ = can_compose_inline;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (GetInputMethod())
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetInputMethod()->OnTextInputTypeChanged(this);
863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (touch_editing_client_)
864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      touch_editing_client_->OnTextInputTypeChanged(text_input_type_);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8661675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch}
8671675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
8681675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochvoid RenderWidgetHostViewAura::OnTextInputStateChanged(
8691675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    const ViewHostMsg_TextInputState_Params& params) {
8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (params.show_ime_if_needed && params.type != ui::TEXT_INPUT_TYPE_NONE) {
8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (GetInputMethod())
8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetInputMethod()->ShowImeIfNeeded();
8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ImeCancelComposition() {
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetInputMethod())
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetInputMethod()->CancelComposition(this);
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ImeCompositionRangeChanged(
88358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const gfx::Range& range,
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<gfx::Rect>& character_bounds) {
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  composition_character_bounds_ = character_bounds;
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostViewAura::RenderProcessGone(base::TerminationStatus status,
8897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 int error_code) {
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursorIfOverSelf();
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Destroy();
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Destroy() {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Beware, this function is not called on all destruction paths. It will
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implicitly end up calling ~RenderWidgetHostViewAura though, so all
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destruction/cleanup code should happen there, not here.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_shutdown_ = true;
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete window_;
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
902a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostViewAura::SetTooltipText(
903a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& tooltip_text) {
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tooltip_ = tooltip_text;
9051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
90690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  aura::client::TooltipClient* tooltip_client =
90790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      aura::client::GetTooltipClient(root_window);
90890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (tooltip_client) {
90990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    tooltip_client->UpdateTooltip(window_);
91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Content tooltips should be visible indefinitely.
91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    tooltip_client->SetTooltipShownTimeout(window_, 0);
91290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostViewAura::SelectionChanged(const base::string16& text,
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                size_t offset,
91758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                const gfx::Range& range) {
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewBase::SelectionChanged(text, offset, range);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) && !defined(OS_CHROMEOS)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (text.empty() || range.is_empty())
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
92323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  size_t pos = range.GetMin() - offset;
92423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  size_t n = range.length();
92523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
92623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(pos + n <= text.length()) << "The text can not fully cover range.";
92723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (pos >= text.length()) {
92823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    NOTREACHED() << "The text can not cover range.";
92923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
93023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Set the CLIPBOARD_TYPE_SELECTION to the ui::Clipboard.
9331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_SELECTION);
93423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  clipboard_writer.WriteText(text.substr(pos, n));
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(USE_X11) && !defined(OS_CHROMEOS)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size RenderWidgetHostViewAura::GetRequestedRendererSize() const {
939cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return delegated_frame_host_->GetRequestedRendererSize();
940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SelectionBoundsChanged(
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ViewHostMsg_SelectionBounds_Params& params) {
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (selection_anchor_rect_ == params.anchor_rect &&
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      selection_focus_rect_ == params.focus_rect)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_anchor_rect_ = params.anchor_rect;
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_focus_rect_ = params.focus_rect;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetInputMethod())
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetInputMethod()->OnCaretBoundsChanged(this);
953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_) {
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_editing_client_->OnSelectionOrCursorChanged(selection_anchor_rect_,
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        selection_focus_rect_);
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderWidgetHostViewAura::CopyFromCompositingSurface(
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& src_subrect,
962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const gfx::Size& dst_size,
9631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CopyFromCompositingSurfaceCallback& callback,
964116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const SkColorType color_type) {
965010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->CopyFromCompositingSurface(
966116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      src_subrect, dst_size, callback, color_type);
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::CopyFromCompositingSurfaceToVideoFrame(
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Rect& src_subrect,
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const scoped_refptr<media::VideoFrame>& target,
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Callback<void(bool)>& callback) {
973010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame(
974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      src_subrect, target, callback);
975a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
976a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostViewAura::CanCopyToVideoFrame() const {
978010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return delegated_frame_host_->CanCopyToVideoFrame();
979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool RenderWidgetHostViewAura::CanSubscribeFrame() const {
982010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return delegated_frame_host_->CanSubscribeFrame();
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::BeginFrameSubscription(
986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) {
987010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->BeginFrameSubscription(subscriber.Pass());
988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::EndFrameSubscription() {
991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->EndFrameSubscription();
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceInitialized(int host_id,
995f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                             int route_id) {
996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
997f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_WIN)
999010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool RenderWidgetHostViewAura::UsesNativeWindowFrame() const {
1000010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return (legacy_render_widget_host_HWND_ != NULL);
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::UpdateConstrainedWindowRects(
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<gfx::Rect>& rects) {
10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check this before setting constrained_rects_, so that next time they're set
10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and we have a root window we don't early return.
1007a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!window_->GetHost())
10085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
10095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1010f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (rects == constrained_rects_)
1011f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
10125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  constrained_rects_ = rects;
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HWND parent = window_->GetHost()->GetAcceleratedWidget();
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CutoutRectsParams params;
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.widget = this;
1018f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  params.cutout_rects = constrained_rects_;
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.geometry = &plugin_window_moves_;
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LPARAM lparam = reinterpret_cast<LPARAM>(&params);
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EnumChildWindows(parent, SetCutoutRectsCallback, lparam);
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1023effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1024effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderWidgetHostViewAura::UpdateMouseLockRegion() {
1025effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Clip the cursor if chrome is running on regular desktop.
1026effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (gfx::Screen::GetScreenFor(window_) == gfx::Screen::GetNativeScreen()) {
1027effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    RECT window_rect = window_->GetBoundsInScreen().ToRECT();
1028effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ::ClipCursor(&window_rect);
1029effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1030effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1031116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1032116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderWidgetHostViewAura::OnLegacyWindowDestroyed() {
1033116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  legacy_render_widget_host_HWND_ = NULL;
1034116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  legacy_window_destroyed_ = true;
1035116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped(
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel,
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int gpu_host_id) {
1041c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Oldschool composited mode is no longer supported.
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnSwapCompositorFrame(
1045ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    uint32 output_surface_id,
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<cc::CompositorFrame> frame) {
10473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TRACE_EVENT0("content", "RenderWidgetHostViewAura::OnSwapCompositorFrame");
10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  last_scroll_offset_ = frame->metadata.root_scroll_offset;
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (frame->delegated_frame_data) {
1051010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    delegated_frame_host_->SwapDelegatedFrame(
1052010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        output_surface_id,
1053010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        frame->delegated_frame_data.Pass(),
1054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        frame->metadata.device_scale_factor,
1055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        frame->metadata.latency_info);
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (frame->software_frame_data) {
1060c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DLOG(ERROR) << "Unable to use software frame in aura";
1061c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    RecordAction(
1062c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::UserMetricsAction("BadMessageTerminate_SharedMemoryAura"));
1063c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    host_->GetProcess()->ReceivedBadMessage();
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
106690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderWidgetHostViewAura::DidStopFlinging() {
10691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (touch_editing_client_)
10701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    touch_editing_client_->DidStopFlinging();
10711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
10721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
107490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetHostViewAura::SetParentNativeViewAccessible(
107590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gfx::NativeViewAccessible accessible_parent) {
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1077f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1078f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::NativeViewId RenderWidgetHostViewAura::GetParentForWindowlessPlugin()
1079f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const {
10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_) {
10815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return reinterpret_cast<gfx::NativeViewId>(
10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        legacy_render_widget_host_HWND_->hwnd());
10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return NULL;
1085f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer(
10897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel,
10907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int gpu_host_id) {
1091c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Oldschool composited mode is no longer supported.
10927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
10937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() {
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() {
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::HasAcceleratedSurface(
1101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const gfx::Size& desired_size) {
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matter what is returned here as GetBackingStore is the only caller of this
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // method. TODO(jbates) implement this if other Aura code needs it.
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::GetScreenInfo(WebScreenInfo* results) {
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetScreenInfoForWindow(results, window_->GetRootWindow() ? window_ : NULL);
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::GetBoundsInRootWindow() {
1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  aura::Window* top_level = window_->GetToplevelWindow();
1114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Rect bounds(top_level->GetBoundsInScreen());
1115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
11160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_WIN)
1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // TODO(zturner,iyengar): This will break when we remove support for NPAPI and
1118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // remove the legacy hwnd, so a better fix will need to be decided when that
1119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // happens.
1120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (UsesNativeWindowFrame()) {
1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // aura::Window doesn't take into account non-client area of native windows
1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // (e.g. HWNDs), so for that case ask Windows directly what the bounds are.
1123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    aura::WindowTreeHost* host = top_level->GetHost();
1124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (!host)
1125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return top_level->GetBoundsInScreen();
1126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RECT window_rect = {0};
1127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    HWND hwnd = host->GetAcceleratedWidget();
1128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ::GetWindowRect(hwnd, &window_rect);
1129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bounds = gfx::Rect(window_rect);
1130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Maximized windows are outdented from the work area by the frame thickness
1132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // even though this "frame" is not painted.  This confuses code (and people)
1133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // that think of a maximized window as corresponding exactly to the work
1134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // area.  Correct for this by subtracting the frame thickness back off.
1135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (::IsZoomed(hwnd)) {
1136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bounds.Inset(GetSystemMetrics(SM_CXSIZEFRAME),
1137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   GetSystemMetrics(SM_CYSIZEFRAME));
1138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bounds.Inset(GetSystemMetrics(SM_CXPADDEDBORDER),
1140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   GetSystemMetrics(SM_CXPADDEDBORDER));
1141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
1142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bounds = gfx::win::ScreenToDIPRect(bounds);
1145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
11460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return bounds;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void RenderWidgetHostViewAura::WheelEventAck(
115146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const blink::WebMouseWheelEvent& event,
115246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    InputEventAckState ack_result) {
115346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (overscroll_controller_) {
115446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    overscroll_controller_->ReceivedEventACK(
115546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        event, (INPUT_EVENT_ACK_STATE_CONSUMED == ack_result));
115646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
115746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
115846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::GestureEventAck(
11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const blink::WebGestureEvent& event,
11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputEventAckState ack_result) {
1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_)
11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    touch_editing_client_->GestureEventAck(event.type);
116446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
116546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (overscroll_controller_) {
116646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    overscroll_controller_->ReceivedEventACK(
116746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        event, (INPUT_EVENT_ACK_STATE_CONSUMED == ack_result));
116846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ProcessAckedTouchEvent(
11727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const TouchEventWithLatencyInfo& touch, InputEventAckState ack_result) {
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<ui::TouchEvent> events;
11747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!MakeUITouchEventsFromWebTouchEvents(touch, &events,
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           SCREEN_COORDINATES))
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
1179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // |host| is NULL during tests.
1180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::EventResult result = (ack_result ==
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      INPUT_EVENT_ACK_STATE_CONSUMED) ? ui::ER_HANDLED : ui::ER_UNHANDLED;
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ScopedVector<ui::TouchEvent>::iterator iter = events.begin(),
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end = events.end(); iter != end; ++iter) {
1187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    host->dispatcher()->ProcessedTouchEvent((*iter), window_, result);
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<SyntheticGestureTarget>
1192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderWidgetHostViewAura::CreateSyntheticGestureTarget() {
1193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return scoped_ptr<SyntheticGestureTarget>(
1194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new SyntheticGestureTargetAura(host_));
1195a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
1196a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
119746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)InputEventAckState RenderWidgetHostViewAura::FilterInputEvent(
119846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const blink::WebInputEvent& input_event) {
119946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool consumed = false;
120046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (input_event.type == WebInputEvent::GestureFlingStart) {
120146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const WebGestureEvent& gesture_event =
120246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        static_cast<const WebGestureEvent&>(input_event);
120346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Zero-velocity touchpad flings are an Aura-specific signal that the
120446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // touchpad scroll has ended, and should not be forwarded to the renderer.
120546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad &&
120646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        !gesture_event.data.flingStart.velocityX &&
120746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        !gesture_event.data.flingStart.velocityY) {
120846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      consumed = true;
120946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
121046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
121146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
121246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (overscroll_controller_)
121346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    consumed |= overscroll_controller_->WillHandleEvent(input_event);
121446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
121546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return consumed && !WebTouchEvent::isTouchEventType(input_event.type)
121646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)             ? INPUT_EVENT_ACK_STATE_CONSUMED
121746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)             : INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
121846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
121946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1220116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserAccessibilityManager*
1221116680a4aac90f2aa7413d9095a592090648e557Ben MurdochRenderWidgetHostViewAura::CreateBrowserAccessibilityManager(
1222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    BrowserAccessibilityDelegate* delegate) {
1223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BrowserAccessibilityManager* manager = NULL;
12245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
1225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager = new BrowserAccessibilityManagerWin(
1226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      BrowserAccessibilityManagerWin::GetEmptyDocument(), delegate);
12275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
1228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager = BrowserAccessibilityManager::Create(
1229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      BrowserAccessibilityManager::GetEmptyDocument(), delegate);
12305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return manager;
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gfx::AcceleratedWidget
12355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)RenderWidgetHostViewAura::AccessibilityGetAcceleratedWidget() {
12365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_WIN)
12375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (legacy_render_widget_host_HWND_)
12385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return legacy_render_widget_host_HWND_->hwnd();
12395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
12405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return gfx::kNullAcceleratedWidget;
12415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
12425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
12435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gfx::NativeViewAccessible
12445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)RenderWidgetHostViewAura::AccessibilityGetNativeViewAccessible() {
12455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_WIN)
12465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (legacy_render_widget_host_HWND_)
12475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return legacy_render_widget_host_HWND_->window_accessible();
12485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
12495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return NULL;
12505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
12515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
12525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::GLSurfaceHandle RenderWidgetHostViewAura::GetCompositingSurface() {
12545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ImageTransportFactory::GetInstance()->GetSharedSurfaceHandle();
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderWidgetHostViewAura::ShowDisambiguationPopup(
12581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::Rect& rect_pixels,
12591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const SkBitmap& zoomed_bitmap) {
1260e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  RenderViewHostDelegate* delegate = NULL;
1261e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  if (host_->IsRenderView())
1262e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch    delegate = RenderViewHost::From(host_)->GetDelegate();
1263e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  // Suppress the link disambiguation popup if the virtual keyboard is currently
1264e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  // requested, as it doesn't interact well with the keyboard.
1265e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  if (delegate && delegate->IsVirtualKeyboardRequested())
1266e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch    return;
1267e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch
12681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |target_rect| is provided in pixels, not DIPs. So we convert it to DIPs
12691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // by scaling it by the inverse of the device scale factor.
12701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::RectF screen_target_rect_f(rect_pixels);
12711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  screen_target_rect_f.Scale(1.0f / current_device_scale_factor_);
12721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  disambiguation_target_rect_ = gfx::ToEnclosingRect(screen_target_rect_f);
12731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  float scale = static_cast<float>(zoomed_bitmap.width()) /
12751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                static_cast<float>(rect_pixels.width());
12761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Size zoomed_size(gfx::ToCeiledSize(
12771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gfx::ScaleSize(disambiguation_target_rect_.size(), scale)));
12781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Save of a copy of the |last_scroll_offset_| for comparison when the copy
12801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // callback fires, to ensure that we haven't scrolled.
12811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  disambiguation_scroll_offset_ = last_scroll_offset_;
12821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CopyFromCompositingSurface(
12841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      disambiguation_target_rect_,
12851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      zoomed_size,
12861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&RenderWidgetHostViewAura::DisambiguationPopupRendered,
12871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::internal::SupportsWeakPtrBase::StaticAsWeakPtr
12881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              <RenderWidgetHostViewAura>(this)),
12891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kN32_SkColorType);
12901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderWidgetHostViewAura::DisambiguationPopupRendered(
12931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool success,
12941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const SkBitmap& result) {
12951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!success || disambiguation_scroll_offset_ != last_scroll_offset_)
12961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
12971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Use RenderViewHostDelegate to get to the WebContentsViewAura, which will
1299e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  // actually show the disambiguation popup.
13001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RenderViewHostDelegate* delegate = NULL;
13011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (host_->IsRenderView())
13021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate = RenderViewHost::From(host_)->GetDelegate();
13031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RenderViewHostDelegateView* delegate_view = NULL;
1304e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  if (delegate) {
13051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_view = delegate->GetDelegateView();
1306e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch    if (delegate->IsVirtualKeyboardRequested())
1307e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch      return;
1308e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  }
13091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delegate_view) {
13101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_view->ShowDisambiguationPopup(
13111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        disambiguation_target_rect_,
13121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result,
13131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&RenderWidgetHostViewAura::ProcessDisambiguationGesture,
13141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            base::internal::SupportsWeakPtrBase::StaticAsWeakPtr
13151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                <RenderWidgetHostViewAura>(this)),
13161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&RenderWidgetHostViewAura::ProcessDisambiguationMouse,
13171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            base::internal::SupportsWeakPtrBase::StaticAsWeakPtr
13181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                <RenderWidgetHostViewAura>(this)));
13191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
13201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderWidgetHostViewAura::HideDisambiguationPopup() {
13231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RenderViewHostDelegate* delegate = NULL;
13241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (host_->IsRenderView())
13251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate = RenderViewHost::From(host_)->GetDelegate();
13261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RenderViewHostDelegateView* delegate_view = NULL;
13271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delegate)
13281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_view = delegate->GetDelegateView();
13291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delegate_view)
13301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_view->HideDisambiguationPopup();
13311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderWidgetHostViewAura::ProcessDisambiguationGesture(
13341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui::GestureEvent* event) {
13351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  blink::WebGestureEvent web_gesture = content::MakeWebGestureEvent(event);
13361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If we fail to make a WebGestureEvent that is a Tap from the provided event,
13371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // don't forward it to Blink.
13381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (web_gesture.type < blink::WebInputEvent::Type::GestureTap ||
13391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_gesture.type > blink::WebInputEvent::Type::GestureTapCancel)
13401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
13411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_->ForwardGestureEvent(web_gesture);
13431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderWidgetHostViewAura::ProcessDisambiguationMouse(
13461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui::MouseEvent* event) {
13471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  blink::WebMouseEvent web_mouse = content::MakeWebMouseEvent(event);
13481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_->ForwardMouseEvent(web_mouse);
13491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::LockMouse() {
1352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
1353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!root_window)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_locked_ = true;
13604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_WIN)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetCapture();
1362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
1363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  UpdateMouseLockRegion();
13644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::CursorClient* cursor_client =
1366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      aura::client::GetCursorClient(root_window);
1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client) {
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cursor_client->HideCursor();
1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->LockCursor();
1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1372b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (ShouldMoveToCenter()) {
1373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    synthetic_move_sent_ = true;
1374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    window_->MoveCursorTo(gfx::Rect(window_->bounds().size()).CenterPoint());
1375b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tooltip_disabler_.reset(new aura::client::ScopedTooltipDisabler(root_window));
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::UnlockMouse() {
13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tooltip_disabler_.reset();
13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
1384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!mouse_locked_ || !root_window)
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_locked_ = false;
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_WIN)
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->ReleaseCapture();
1391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
1392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ::ClipCursor(NULL);
13934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->MoveCursorTo(unlocked_mouse_position_);
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::CursorClient* cursor_client =
1396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      aura::client::GetCursorClient(root_window);
1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client) {
1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->UnlockCursor();
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cursor_client->ShowCursor();
1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->LostMouseLock();
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, ui::TextInputClient implementation:
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetCompositionText(
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::CompositionText& composition) {
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): convert both renderer_host and renderer to use
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ui::CompositionText.
141446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<blink::WebCompositionUnderline> underlines;
141546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  underlines.reserve(composition.underlines.size());
141646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (std::vector<ui::CompositionUnderline>::const_iterator it =
141746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)           composition.underlines.begin();
141846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       it != composition.underlines.end(); ++it) {
14196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    underlines.push_back(
14206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        blink::WebCompositionUnderline(static_cast<unsigned>(it->start_offset),
14216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       static_cast<unsigned>(it->end_offset),
14226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       it->color,
14236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       it->thick,
14246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       it->background_color));
142546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): due to a bug of webkit, we can't use selection range with
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // composition string. See: https://bugs.webkit.org/show_bug.cgi?id=37788
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->ImeSetComposition(composition.text, underlines,
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           composition.selection.end(),
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           composition.selection.end());
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = !composition.text.empty();
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ConfirmCompositionText() {
1437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (host_ && has_composition_text_) {
1438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    host_->ImeConfirmComposition(base::string16(), gfx::Range::InvalidRange(),
1439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 false);
1440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ClearCompositionText() {
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_ && has_composition_text_)
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->ImeCancelComposition();
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostViewAura::InsertText(const base::string16& text) {
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(text_input_type_ != ui::TEXT_INPUT_TYPE_NONE);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_)
145358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    host_->ImeConfirmComposition(text, gfx::Range::InvalidRange(), false);
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::InsertChar(base::char16 ch, int flags) {
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (popup_child_host_view_ && popup_child_host_view_->NeedsInputGrab()) {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    popup_child_host_view_->InsertChar(ch, flags);
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Ignore character messages for VKEY_RETURN sent on CTRL+M. crbug.com/315547
1464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (host_ && (accept_return_character_ || ch != ui::VKEY_RETURN)) {
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double now = ui::EventTimeForNow().InSecondsF();
1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Send a blink::WebInputEvent::Char event to |host_|.
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeWebKeyboardEvent webkit_event(ui::ET_KEY_PRESSED,
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        true /* is_char */,
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        ch,
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        flags,
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        now);
1472e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ForwardKeyboardEvent(webkit_event);
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gfx::NativeWindow RenderWidgetHostViewAura::GetAttachedWindow() const {
1477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return window_;
1478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::TextInputType RenderWidgetHostViewAura::GetTextInputType() const {
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return text_input_type_;
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochui::TextInputMode RenderWidgetHostViewAura::GetTextInputMode() const {
148558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return text_input_mode_;
1486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::CanComposeInline() const {
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return can_compose_inline_;
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::ConvertRectToScreen(
14938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const gfx::Rect& rect) const {
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point origin = rect.origin();
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point end = gfx::Point(rect.right(), rect.bottom());
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
149858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!root_window)
149958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return rect;
150058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  aura::client::ScreenPositionClient* screen_position_client =
150158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      aura::client::GetScreenPositionClient(root_window);
150258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!screen_position_client)
150358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return rect;
150458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  screen_position_client->ConvertPointToScreen(window_, &origin);
150558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  screen_position_client->ConvertPointToScreen(window_, &end);
150658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return gfx::Rect(origin.x(),
150758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   origin.y(),
150858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   end.x() - origin.x(),
150958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   end.y() - origin.y());
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::ConvertRectFromScreen(
15138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const gfx::Rect& rect) const {
1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point origin = rect.origin();
1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point end = gfx::Point(rect.right(), rect.bottom());
1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (root_window) {
1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::client::ScreenPositionClient* screen_position_client =
1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        aura::client::GetScreenPositionClient(root_window);
1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen_position_client->ConvertPointFromScreen(window_, &origin);
1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen_position_client->ConvertPointFromScreen(window_, &end);
1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return gfx::Rect(origin.x(),
1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     origin.y(),
1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     end.x() - origin.x(),
1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     end.y() - origin.y());
1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return rect;
1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::GetCaretBounds() const {
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect rect =
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::UnionRects(selection_anchor_rect_, selection_focus_rect_);
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertRectToScreen(rect);
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetCompositionCharacterBounds(
15398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    uint32 index,
15408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Rect* rect) const {
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(rect);
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index >= composition_character_bounds_.size())
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *rect = ConvertRectToScreen(composition_character_bounds_[index]);
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::HasCompositionText() const {
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return has_composition_text_;
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetTextRange(gfx::Range* range) const {
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_start(selection_text_offset_);
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_end(selection_text_offset_ + selection_text_.length());
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetCompositionTextRange(
15598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Range* range) const {
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetSelectionRange(gfx::Range* range) const {
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_start(selection_range_.start());
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_end(selection_range_.end());
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool RenderWidgetHostViewAura::SetSelectionRange(const gfx::Range& range) {
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool RenderWidgetHostViewAura::DeleteRange(const gfx::Range& range) {
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::GetTextFromRange(
158458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const gfx::Range& range,
1585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16* text) const {
158658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Range selection_text_range(selection_text_offset_,
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selection_text_offset_ + selection_text_.length());
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!selection_text_range.Contains(range)) {
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text->clear();
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selection_text_range.EqualsIgnoringDirection(range)) {
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Avoid calling substr whose performance is low.
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *text = selection_text_;
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *text = selection_text_.substr(
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        range.GetMin() - selection_text_offset_,
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        range.length());
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnInputMethodChanged() {
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetInputMethod())
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->SetInputMethodActive(GetInputMethod()->IsActive());
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement the newly added “locale” property of HTML DOM
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TextEvent.
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::ChangeTextDirectionAndLayoutAlignment(
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::i18n::TextDirection direction) {
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->UpdateTextDirection(
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      direction == base::i18n::RIGHT_TO_LEFT ?
1621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebTextDirectionRightToLeft :
1622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebTextDirectionLeftToRight);
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->NotifyTextDirection();
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ExtendSelectionAndDelete(
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t before, size_t after) {
1629effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderFrameHostImpl* rfh = GetFocusedFrame();
1630effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (rfh)
1631effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    rfh->ExtendSelectionAndDelete(before, after);
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::EnsureCaretInRect(const gfx::Rect& rect) {
1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect intersected_rect(
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::IntersectRects(rect, window_->GetBoundsInScreen()));
1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (intersected_rect.IsEmpty())
1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_->ScrollFocusedEditableNodeIntoRect(
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ConvertRectFromScreen(intersected_rect));
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::OnCandidateWindowShown() {
1646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  host_->CandidateWindowShown();
1647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::OnCandidateWindowUpdated() {
1650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  host_->CandidateWindowUpdated();
1651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::OnCandidateWindowHidden() {
1654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  host_->CandidateWindowHidden();
1655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
165746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool RenderWidgetHostViewAura::IsEditingCommandEnabled(int command_id) {
165846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return false;
165946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
166046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
166146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void RenderWidgetHostViewAura::ExecuteEditingCommand(int command_id) {
166246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
166346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostViewAura, gfx::DisplayObserver implementation:
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnDisplayAdded(
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Display& new_display) {
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnDisplayRemoved(
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Display& old_display) {
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderWidgetHostViewAura::OnDisplayMetricsChanged(
1676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Display& display, uint32_t metrics) {
1677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The screen info should be updated regardless of the metric change.
1678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Screen* screen = gfx::Screen::GetScreenFor(window_);
1679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (display.id() == screen->GetDisplayNearestWindow(window_).id()) {
1680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UpdateScreenInfo(window_);
1681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    current_cursor_.SetDisplayInfo(display);
1682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UpdateCursorIfOverSelf();
1683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, aura::WindowDelegate implementation:
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size RenderWidgetHostViewAura::GetMinimumSize() const {
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size();
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size RenderWidgetHostViewAura::GetMaximumSize() const {
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size();
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnBoundsChanged(const gfx::Rect& old_bounds,
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               const gfx::Rect& new_bounds) {
1699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::AutoReset<bool> in_bounds_changed(&in_bounds_changed_, true);
17005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We care about this whenever RenderWidgetHostViewAura is not owned by a
17015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // WebContentsViewAura since changes to the Window's bounds need to be
17025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // messaged to the renderer.  WebContentsViewAura invokes SetSize() or
17035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // SetBounds() itself.  No matter how we got here, any redundant calls are
17045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // harmless.
17055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetSize(new_bounds.size());
17065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
17075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (GetInputMethod())
17085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    GetInputMethod()->OnCaretBoundsChanged(this);
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor RenderWidgetHostViewAura::GetCursor(const gfx::Point& point) {
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_)
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui::kCursorNone;
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return current_cursor_.GetNativeCursor();
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderWidgetHostViewAura::GetNonClientComponent(
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& point) const {
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HTCLIENT;
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::ShouldDescendIntoChildForEventHandling(
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* child,
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& location) {
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::CanFocus() {
1729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return popup_type_ == blink::WebPopupTypeNone;
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnCaptureLost() {
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->LostCapture();
1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_)
17355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    touch_editing_client_->EndTouchEditing(false);
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnPaint(gfx::Canvas* canvas) {
17390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // For non-opaque windows, we don't draw anything, since we depend on the
17400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // canvas coming from the compositor to already be initialized as
17410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // transparent.
17420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (window_->layer()->fills_bounds_opaquely())
17430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    canvas->DrawColor(SK_ColorWHITE);
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnDeviceScaleFactorChanged(
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float device_scale_factor) {
17485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!host_ || !window_->GetRootWindow())
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateScreenInfo(window_);
17522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
17532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  const gfx::Display display = gfx::Screen::GetScreenFor(window_)->
17542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      GetDisplayNearestWindow(window_);
17552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DCHECK_EQ(device_scale_factor, display.device_scale_factor());
17562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  current_cursor_.SetDisplayInfo(display);
1757116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SnapToPhysicalPixelBoundary();
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostViewAura::OnWindowDestroying(aura::Window* window) {
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND parent = NULL;
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the tab was hidden and it's closed, host_->is_hidden would have been
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reset to false in RenderWidgetHostImpl::RendererExited.
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!window_->GetRootWindow() || host_->is_hidden()) {
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent = ui::GetHiddenWindow();
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent = window_->GetHost()->GetAcceleratedWidget();
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LPARAM lparam = reinterpret_cast<LPARAM>(this);
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnumChildWindows(parent, WindowDestroyingCallback, lparam);
1772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The LegacyRenderWidgetHostHWND instance is destroyed when its window is
1774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // destroyed. Normally we control when that happens via the Destroy call
1775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // in the dtor. However there may be cases where the window is destroyed
1776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // by Windows, i.e. the parent window is destroyed before the
1777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // RenderWidgetHostViewAura instance goes away etc. To avoid that we
1778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // destroy the LegacyRenderWidgetHostHWND instance here.
1779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (legacy_render_widget_host_HWND_) {
1780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    legacy_render_widget_host_HWND_->set_host(NULL);
1781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    legacy_render_widget_host_HWND_->Destroy();
1782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // The Destroy call above will delete the LegacyRenderWidgetHostHWND
1783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // instance.
1784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    legacy_render_widget_host_HWND_ = NULL;
1785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
178758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
178858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Make sure that the input method no longer references to this object before
178958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // this object is removed from the root window (i.e. this object loses access
179058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // to the input method).
179158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui::InputMethod* input_method = GetInputMethod();
179258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (input_method)
179358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    input_method->DetachTextInputClient(this);
179446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
179546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (overscroll_controller_)
179646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    overscroll_controller_->Reset();
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostViewAura::OnWindowDestroyed(aura::Window* window) {
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->ViewDestroyed();
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnWindowTargetVisibilityChanged(bool visible) {
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::HasHitTestMask() const {
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::GetHitTestMask(gfx::Path* mask) const {
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, ui::EventHandler implementation:
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnKeyEvent(ui::KeyEvent* event) {
1818868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnKeyEvent");
1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (popup_child_host_view_ && popup_child_host_view_->NeedsInputGrab()) {
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_child_host_view_->OnKeyEvent(event);
18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event->handled())
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to handle the Escape key for Pepper Flash.
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_fullscreen_ && event->key_code() == ui::VKEY_ESCAPE) {
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Focus the window we were created from.
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (host_tracker_.get() && !host_tracker_->windows().empty()) {
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::Window* host = *(host_tracker_->windows().begin());
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::FocusClient* client = aura::client::GetFocusClient(host);
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (client) {
18352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        // Calling host->Focus() may delete |this|. We create a local observer
18362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        // for that. In that case we exit without further access to any members.
18372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        aura::WindowTracker tracker;
18382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        aura::Window* window = window_;
18392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        tracker.Add(window);
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host->Focus();
18412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        if (!tracker.Contains(window)) {
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          event->SetHandled();
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          return;
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!in_shutdown_) {
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in_shutdown_ = true;
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_->Shutdown();
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
18525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (event->key_code() == ui::VKEY_RETURN) {
18535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Do not forward return key release events if no press event was handled.
18545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (event->type() == ui::ET_KEY_RELEASED && !accept_return_character_)
18555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
18565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Accept return key character events between press and release events.
1857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      accept_return_character_ = event->type() == ui::ET_KEY_PRESSED;
18585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We don't have to communicate with an input method here.
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!event->HasNativeEvent()) {
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NativeWebKeyboardEvent webkit_event(
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event->type(),
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          event->is_char(),
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          event->is_char() ? event->GetCharacter() : event->key_code(),
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event->flags(),
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ui::EventTimeForNow().InSecondsF());
1868e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ForwardKeyboardEvent(webkit_event);
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NativeWebKeyboardEvent webkit_event(event);
1871e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ForwardKeyboardEvent(webkit_event);
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnMouseEvent(ui::MouseEvent* event) {
1878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnMouseEvent");
18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
1881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_) {
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::client::CursorClient* cursor_client =
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        aura::client::GetCursorClient(window_->GetRootWindow());
1886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(!cursor_client || !cursor_client->IsCursorVisible());
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1888868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (event->type() == ui::ET_MOUSEWHEEL) {
1889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebMouseWheelEvent mouse_wheel_event =
1890868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent*>(event));
1891868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (mouse_wheel_event.deltaX != 0 || mouse_wheel_event.deltaY != 0)
1892868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        host_->ForwardWheelEvent(mouse_wheel_event);
1893868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return;
1894868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
1895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point center(gfx::Rect(window_->bounds().size()).CenterPoint());
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // If we receive non client mouse messages while we are in the locked state
18990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // it probably means that the mouse left the borders of our window and
19000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // needs to be moved back to the center.
19010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (event->flags() & ui::EF_IS_NON_CLIENT) {
19020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      synthetic_move_sent_ = true;
19030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      window_->MoveCursorTo(center);
19040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return;
19050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
19060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseEvent mouse_event = MakeWebMouseEvent(event);
19080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_move_to_center_event = (event->type() == ui::ET_MOUSE_MOVED ||
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event->type() == ui::ET_MOUSE_DRAGGED) &&
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mouse_event.x == center.x() && mouse_event.y == center.y();
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ModifyEventMovementAndCoords(&mouse_event);
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool should_not_forward = is_move_to_center_event && synthetic_move_sent_;
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (should_not_forward) {
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      synthetic_move_sent_ = false;
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Check if the mouse has reached the border and needs to be centered.
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ShouldMoveToCenter()) {
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        synthetic_move_sent_ = true;
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_->MoveCursorTo(center);
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Forward event to renderer.
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (CanRendererHandleEvent(event) &&
1926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          !(event->flags() & ui::EF_FROM_TOUCH)) {
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host_->ForwardMouseEvent(mouse_event);
1928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // Ensure that we get keyboard focus on mouse down as a plugin window
1929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // may have grabbed keyboard focus.
1930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if (event->type() == ui::ET_MOUSE_PRESSED)
1931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          SetKeyboardFocus();
1932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // As the overscroll is handled during scroll events from the trackpad, the
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RWHVA window is transformed by the overscroll controller. This transform
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // triggers a synthetic mouse-move event to be generated (by the aura
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RootWindow). But this event interferes with the overscroll gesture. So,
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ignore such synthetic mouse-move events if an overscroll gesture is in
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // progress.
194346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (overscroll_controller_ &&
194446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      overscroll_controller_->overscroll_mode() != OVERSCROLL_NONE &&
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event->flags() & ui::EF_IS_SYNTHESIZED &&
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (event->type() == ui::ET_MOUSE_ENTERED ||
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       event->type() == ui::ET_MOUSE_EXITED ||
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       event->type() == ui::ET_MOUSE_MOVED)) {
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->StopPropagation();
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() == ui::ET_MOUSEWHEEL) {
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We get mouse wheel/scroll messages even if we are not in the foreground.
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // So here we check if we have any owned popup windows in the foreground and
19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // dismiss them.
1958a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    aura::WindowTreeHost* host = window_->GetHost();
1959a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (host) {
1960a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      HWND parent = host->GetAcceleratedWidget();
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HWND toplevel_hwnd = ::GetAncestor(parent, GA_ROOT);
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EnumThreadWindows(GetCurrentThreadId(),
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        DismissOwnedPopups,
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        reinterpret_cast<LPARAM>(toplevel_hwnd));
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
19671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // The Disambiguation popup does not parent itself from this window, so we
19681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // manually dismiss it.
19691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    HideDisambiguationPopup();
19701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseWheelEvent mouse_wheel_event =
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent*>(event));
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mouse_wheel_event.deltaX != 0 || mouse_wheel_event.deltaY != 0)
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_->ForwardWheelEvent(mouse_wheel_event);
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (CanRendererHandleEvent(event) &&
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             !(event->flags() & ui::EF_FROM_TOUCH)) {
1977f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseEvent mouse_event = MakeWebMouseEvent(event);
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ModifyEventMovementAndCoords(&mouse_event);
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->ForwardMouseEvent(mouse_event);
1980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Ensure that we get keyboard focus on mouse down as a plugin window may
1981f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // have grabbed keyboard focus.
1982f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (event->type() == ui::ET_MOUSE_PRESSED)
1983f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SetKeyboardFocus();
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->type()) {
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->SetCapture();
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Confirm existing composition text on mouse click events, to make sure
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the input caret won't be moved with an ongoing composition text.
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FinishImeCompositionSession();
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_RELEASED:
199434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      window_->ReleaseCapture();
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Needed to propagate mouse event to |window_->parent()->delegate()|, but
20015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // note that it might be something other than a WebContentsViewAura instance.
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pkotwicz): Find a better way of doing this.
2003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // In fullscreen mode which is typically used by flash, don't forward
2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the mouse events to the parent. The renderer and the plugin process
2005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // handle these events.
2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!is_fullscreen_ && window_->parent()->delegate() &&
20075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !(event->flags() & ui::EF_FROM_TOUCH)) {
20085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    event->ConvertLocationToTarget(window_, window_->parent());
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->parent()->delegate()->OnMouseEvent(event);
20105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsXButtonUpEvent(event))
20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->SetHandled();
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnScrollEvent(ui::ScrollEvent* event) {
2017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnScrollEvent");
2018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
2019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event->type() == ui::ET_SCROLL) {
20225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_WIN)
20235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(ananta)
20245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Investigate if this is true for Windows 8 Metro ASH as well.
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event->finger_count() != 2)
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
20275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
2028f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebGestureEvent gesture_event =
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        MakeWebGestureEventFlingCancel();
20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->ForwardGestureEvent(gesture_event);
2031f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseWheelEvent mouse_wheel_event =
20327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        MakeWebMouseWheelEvent(event);
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->ForwardWheelEvent(mouse_wheel_event);
20345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RecordAction(base::UserMetricsAction("TrackpadScroll"));
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (event->type() == ui::ET_SCROLL_FLING_START ||
20367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)             event->type() == ui::ET_SCROLL_FLING_CANCEL) {
2037f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebGestureEvent gesture_event =
20387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        MakeWebGestureEvent(event);
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->ForwardGestureEvent(gesture_event);
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event->type() == ui::ET_SCROLL_FLING_START)
20415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordAction(base::UserMetricsAction("TrackpadScrollFling"));
20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnTouchEvent(ui::TouchEvent* event) {
2048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnTouchEvent");
2049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the touch event first.
2053f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebTouchPoint* point = UpdateWebTouchEventFromUIEvent(*event,
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                &touch_event_);
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forward the touch event only if a touch point was updated, and there's a
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // touch-event handler in the page, and no other touch-event is in the queue.
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is important to always consume the event if there is a touch-event
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handler in the page, or some touch-event is already in the queue, even if
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no point has been updated, to make sure that this event does not get
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // processed by the gesture recognizer before the events in the queue.
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host_->ShouldForwardTouchEvent())
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->StopPropagation();
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (point) {
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (host_->ShouldForwardTouchEvent())
20677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      host_->ForwardTouchEventWithLatencyInfo(touch_event_, *event->latency());
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateWebTouchEventAfterDispatch(&touch_event_, point);
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnGestureEvent(ui::GestureEvent* event) {
2073868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnGestureEvent");
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((event->type() == ui::ET_GESTURE_PINCH_BEGIN ||
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->type() == ui::ET_GESTURE_PINCH_UPDATE ||
20765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event->type() == ui::ET_GESTURE_PINCH_END) && !pinch_zoom_enabled_) {
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->SetHandled();
20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostDelegate* delegate = NULL;
2085a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host_->IsRenderView())
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate = RenderViewHost::From(host_)->GetDelegate();
20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate && event->type() == ui::ET_GESTURE_BEGIN &&
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->details().touch_points() == 1) {
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->HandleGestureBegin();
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2093f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture = MakeWebGestureEvent(event);
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() == ui::ET_GESTURE_TAP_DOWN) {
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Webkit does not stop a fling-scroll on tap-down. So explicitly send an
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // event to stop any in-progress flings.
2097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebGestureEvent fling_cancel = gesture;
2098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fling_cancel.type = blink::WebInputEvent::GestureFlingCancel;
209946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fling_cancel.sourceDevice = blink::WebGestureDeviceTouchscreen;
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->ForwardGestureEvent(fling_cancel);
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (gesture.type != blink::WebInputEvent::Undefined) {
2104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    host_->ForwardGestureEventWithLatencyInfo(gesture, *event->latency());
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN ||
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event->type() == ui::ET_GESTURE_SCROLL_UPDATE ||
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event->type() == ui::ET_GESTURE_SCROLL_END) {
21095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordAction(base::UserMetricsAction("TouchscreenScroll"));
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (event->type() == ui::ET_SCROLL_FLING_START) {
21115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordAction(base::UserMetricsAction("TouchscreenScrollFling"));
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate && event->type() == ui::ET_GESTURE_END &&
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->details().touch_points() == 1) {
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->HandleGestureEnd();
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If a gesture is not processed by the webpage, then WebKit processes it
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (e.g. generates synthetic mouse events).
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, aura::client::ActivationDelegate implementation:
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostViewAura::ShouldActivate() const {
2129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
2130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
2132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const ui::Event* event = host->dispatcher()->current_event();
21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!event)
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_fullscreen_;
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostViewAura,
21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//     aura::client::ActivationChangeObserver implementation:
21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnWindowActivated(aura::Window* gained_active,
21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 aura::Window* lost_active) {
21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(window_ == gained_active || window_ == lost_active);
21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (window_ == gained_active) {
2146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const ui::Event* event = window_->GetHost()->dispatcher()->current_event();
21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event && PointerEventActivates(*event))
21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->OnPointerEventActivate();
21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// RenderWidgetHostViewAura, aura::client::CursorClientObserver implementation:
2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::OnCursorVisibilityChanged(bool is_visible) {
2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifyRendererOfCursorVisibilityState(is_visible);
2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostViewAura, aura::client::FocusChangeObserver implementation:
21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnWindowFocused(aura::Window* gained_focus,
21632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               aura::Window* lost_focus) {
21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(window_ == gained_focus || window_ == lost_focus);
21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (window_ == gained_focus) {
21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We need to honor input bypass if the associated tab is does not want
21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // input. This gives the current focused window a chance to be the text
21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // input client and handle events.
21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_->ignore_input_events())
21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->GotFocus();
21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->SetActive(true);
21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::InputMethod* input_method = GetInputMethod();
21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (input_method) {
21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Ask the system-wide IME to send all TextInputClient messages to |this|
21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // object.
21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      input_method->SetFocusedTextInputClient(this);
21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->SetInputMethodActive(input_method->IsActive());
21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Often the application can set focus to the view in response to a key
21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // down. However the following char event shouldn't be sent to the web
21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // page.
21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->SuppressNextCharEvents();
21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->SetInputMethodActive(false);
21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    BrowserAccessibilityManager* manager =
2191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        host_->GetRootBrowserAccessibilityManager();
2192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (manager)
2193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      manager->OnWindowFocused();
21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (window_ == lost_focus) {
21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->SetActive(false);
21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->Blur();
21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DetachFromInputMethod();
21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->SetInputMethodActive(false);
22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (touch_editing_client_)
22025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      touch_editing_client_->EndTouchEditing(false);
2203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
220446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (overscroll_controller_)
220546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      overscroll_controller_->Cancel();
220646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    BrowserAccessibilityManager* manager =
2208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        host_->GetRootBrowserAccessibilityManager();
2209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (manager)
2210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      manager->OnWindowBlurred();
2211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If we lose the focus while fullscreen, close the window; Pepper Flash
2213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // won't do it for us (unlike NPAPI Flash). However, we do not close the
2214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // window if we lose the focus to a window on another display.
2215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Screen* screen = gfx::Screen::GetScreenFor(window_);
2216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool focusing_other_display =
2217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gained_focus && screen->GetNumDisplays() > 1 &&
2218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        (screen->GetDisplayNearestWindow(window_).id() !=
2219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         screen->GetDisplayNearestWindow(gained_focus).id());
2220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (is_fullscreen_ && !in_shutdown_ && !focusing_other_display) {
2221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
2222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // On Windows, if we are switching to a non Aura Window on a different
2223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // screen we should not close the fullscreen window.
2224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (!gained_focus) {
2225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        POINT point = {0};
2226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ::GetCursorPos(&point);
2227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (screen->GetDisplayNearestWindow(window_).id() !=
2228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            screen->GetDisplayNearestPoint(gfx::Point(point)).id())
2229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          return;
2230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      }
2231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      in_shutdown_ = true;
22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->Shutdown();
22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// RenderWidgetHostViewAura, aura::WindowTreeHostObserver implementation:
22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostViewAura::OnHostMoved(const aura::WindowTreeHost* host,
2242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           const gfx::Point& new_origin) {
2243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TRACE_EVENT1("ui", "RenderWidgetHostViewAura::OnHostMoved",
2244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)               "new_origin", new_origin.ToString());
2245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateScreenInfo(window_);
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, private:
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostViewAura::~RenderWidgetHostViewAura() {
2253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_)
2254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_editing_client_->OnViewDestroyed();
22555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_.reset();
22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_observer_.reset();
2258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (window_->GetHost())
2259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    window_->GetHost()->RemoveObserver(this);
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnlockMouse();
22611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (popup_parent_host_view_) {
22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(popup_parent_host_view_->popup_child_host_view_ == NULL ||
22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           popup_parent_host_view_->popup_child_host_view_ == this);
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    popup_parent_host_view_->popup_child_host_view_ = NULL;
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (popup_child_host_view_) {
22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(popup_child_host_view_->popup_parent_host_view_ == NULL ||
22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           popup_child_host_view_->popup_parent_host_view_ == this);
22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_child_host_view_->popup_parent_host_view_ = NULL;
22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
22715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  event_filter_for_popup_exit_.reset();
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetTooltipText(window_, NULL);
22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Screen::GetScreenFor(window_)->RemoveObserver(this);
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This call is usually no-op since |this| object is already removed from the
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Aura root window and we don't have a way to get an input method object
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // associated with the window, but just in case.
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DetachFromInputMethod();
22794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
2281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The LegacyRenderWidgetHostHWND window should have been destroyed in
2282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // RenderWidgetHostViewAura::OnWindowDestroying and the pointer should
2283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // be set to NULL.
2284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!legacy_render_widget_host_HWND_);
2285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() {
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point screen_point =
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
22911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!root_window)
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Point root_window_point = screen_point;
22965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::client::ScreenPositionClient* screen_position_client =
22975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::client::GetScreenPositionClient(root_window);
22985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (screen_position_client) {
22995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    screen_position_client->ConvertPointFromScreen(
23005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        root_window, &root_window_point);
23015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (root_window->GetEventHandlerForPoint(root_window_point) != window_)
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeCursor cursor = current_cursor_.GetNativeCursor();
23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do not show loading cursor when the cursor is currently hidden.
23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_loading_ && cursor != ui::kCursorNone)
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor = ui::kCursorPointer;
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::CursorClient* cursor_client =
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::client::GetCursorClient(root_window);
23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cursor_client) {
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor_client->SetCursor(cursor);
23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::InputMethod* RenderWidgetHostViewAura::GetInputMethod() const {
23191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!root_window)
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_window->GetProperty(aura::client::kRootWindowInputMethodKey);
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::NeedsInputGrab() {
2326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return popup_type_ == blink::WebPopupTypeSelect;
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::FinishImeCompositionSession() {
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!has_composition_text_)
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (host_) {
2333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    host_->ImeConfirmComposition(base::string16(), gfx::Range::InvalidRange(),
2334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 false);
2335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImeCancelComposition();
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ModifyEventMovementAndCoords(
2340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseEvent* event) {
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the mouse has just entered, we must report zero movementX/Y. Hence we
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reset any global_mouse_position set previously.
2343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (event->type == blink::WebInputEvent::MouseEnter ||
2344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      event->type == blink::WebInputEvent::MouseLeave)
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global_mouse_position_.SetPoint(event->globalX, event->globalY);
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Movement is computed by taking the difference of the new cursor position
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the previous. Under mouse lock the cursor will be warped back to the
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // center so that we are not limited by clipping boundaries.
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do not measure movement as the delta from cursor to center because
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we may receive more mouse movement events before our warp has taken
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // effect.
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->movementX = event->globalX - global_mouse_position_.x();
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->movementY = event->globalY - global_mouse_position_.y();
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global_mouse_position_.SetPoint(event->globalX, event->globalY);
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Under mouse lock, coordinates of mouse are locked to what they were when
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mouse lock was entered.
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_) {
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->x = unlocked_mouse_position_.x();
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->y = unlocked_mouse_position_.y();
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->windowX = unlocked_mouse_position_.x();
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->windowY = unlocked_mouse_position_.y();
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->globalX = unlocked_global_mouse_position_.x();
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->globalY = unlocked_global_mouse_position_.y();
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unlocked_mouse_position_.SetPoint(event->windowX, event->windowY);
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unlocked_global_mouse_position_.SetPoint(event->globalX, event->globalY);
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::NotifyRendererOfCursorVisibilityState(
2374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool is_visible) {
2375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (host_->is_hidden() ||
2376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (cursor_visibility_state_in_renderer_ == VISIBLE && is_visible) ||
2377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (cursor_visibility_state_in_renderer_ == NOT_VISIBLE && !is_visible))
2378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  cursor_visibility_state_in_renderer_ = is_visible ? VISIBLE : NOT_VISIBLE;
2381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_->SendCursorVisibilityState(is_visible);
2382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
238446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void RenderWidgetHostViewAura::SetOverscrollControllerEnabled(bool enabled) {
238546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!enabled)
238646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    overscroll_controller_.reset();
238746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  else if (!overscroll_controller_)
238846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    overscroll_controller_.reset(new OverscrollController());
238946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
239046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2391116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderWidgetHostViewAura::SnapToPhysicalPixelBoundary() {
2392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The top left corner of our view in window coordinates might not land on a
2393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // device pixel boundary if we have a non-integer device scale. In that case,
2394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // to avoid the web contents area looking blurry we translate the web contents
2395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // in the +x, +y direction to land on the nearest pixel boundary. This may
2396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // cause the bottom and right edges to be clipped slightly, but that's ok.
2397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  aura::Window* snapped = NULL;
2398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // On desktop, use the root window. On alternative environment (ash),
2399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // use the toplevel window which must be already snapped.
2400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (gfx::Screen::GetScreenFor(window_) !=
2401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE)) {
2402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    snapped = window_->GetRootWindow();
2403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
2404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    snapped = window_->GetToplevelWindow();
2405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (snapped && snapped != window_)
2407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ui::SnapLayerToPhysicalPixelBoundary(snapped->layer(), window_->layer());
24085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
24095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  has_snapped_to_boundary_ = true;
2410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2412116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderWidgetHostViewAura::InternalSetBounds(const gfx::Rect& rect) {
2413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (HasDisplayPropertyChanged(window_))
2414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    host_->InvalidateScreenInfo();
2415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SnapToPhysicalPixelBoundary();
2417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Don't recursively call SetBounds if this bounds update is the result of
2418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // a Window::SetBoundsInternal call.
2419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!in_bounds_changed_)
2420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    window_->SetBounds(rect);
2421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  host_->WasResized();
2422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  delegated_frame_host_->WasResized();
2423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (touch_editing_client_) {
2424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    touch_editing_client_->OnSelectionOrCursorChanged(selection_anchor_rect_,
2425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      selection_focus_rect_);
2426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
2428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Create the legacy dummy window which corresponds to the bounds of the
2429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // webcontents. This will be passed as the container window for windowless
2430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // plugins.
2431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Plugins like Flash assume the container window which is returned via the
2432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // NPNVnetscapeWindow property corresponds to the bounds of the webpage.
2433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // This is not true in Aura where we have only HWND which is the main Aura
2434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // window. If we return this window to plugins like Flash then it causes the
2435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // coordinate translations done by these plugins to break.
2436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Additonally the legacy dummy window is needed for accessibility and for
2437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // scrolling to work in legacy drivers for trackpoints/trackpads, etc.
2438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!legacy_window_destroyed_ && GetNativeViewId()) {
2439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!legacy_render_widget_host_HWND_) {
2440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      legacy_render_widget_host_HWND_ = LegacyRenderWidgetHostHWND::Create(
2441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          reinterpret_cast<HWND>(GetNativeViewId()));
2442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
2443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (legacy_render_widget_host_HWND_) {
2444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      legacy_render_widget_host_HWND_->set_host(this);
2445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      legacy_render_widget_host_HWND_->SetBounds(
2446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          window_->GetBoundsInRootWindow());
2447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // There are cases where the parent window is created, made visible and
2448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // the associated RenderWidget is also visible before the
2449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // LegacyRenderWidgetHostHWND instace is created. Ensure that it is shown
2450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // here.
2451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (!host_->is_hidden())
2452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        legacy_render_widget_host_HWND_->Show();
2453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
2454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (mouse_locked_)
2457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    UpdateMouseLockRegion();
2458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SchedulePaintIfNotInClip(
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& clip) {
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!clip.IsEmpty()) {
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect to_paint = gfx::SubtractRects(rect, clip);
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!to_paint.IsEmpty())
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->SchedulePaintInRect(to_paint);
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SchedulePaintInRect(rect);
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::ShouldMoveToCenter() {
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect = window_->bounds();
2475b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  rect = ConvertRectToScreen(rect);
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int border_x = rect.width() * kMouseLockBorderPercentage / 100;
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int border_y = rect.height() * kMouseLockBorderPercentage / 100;
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return global_mouse_position_.x() < rect.x() + border_x ||
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      global_mouse_position_.x() > rect.right() - border_x ||
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      global_mouse_position_.y() < rect.y() + border_y ||
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      global_mouse_position_.y() > rect.bottom() - border_y;
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::AddedToRootWindow() {
2486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_->GetHost()->AddObserver(this);
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateScreenInfo(window_);
2488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::client::CursorClient* cursor_client =
2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      aura::client::GetCursorClient(window_->GetRootWindow());
2491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client) {
2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->AddObserver(this);
2493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible());
2494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (HasFocus()) {
2496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::InputMethod* input_method = GetInputMethod();
2497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (input_method)
2498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      input_method->SetFocusedTextInputClient(this);
2499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
25005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
25015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
25025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The parent may have changed here. Ensure that the legacy window is
25035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // reparented accordingly.
25045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
25055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->UpdateParent(
25065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        reinterpret_cast<HWND>(GetNativeViewId()));
25075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
25085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->AddedToWindow();
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::RemovingFromRootWindow() {
2513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::client::CursorClient* cursor_client =
2514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      aura::client::GetCursorClient(window_->GetRootWindow());
2515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client)
2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->RemoveObserver(this);
2517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DetachFromInputMethod();
2519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_->GetHost()->RemoveObserver(this);
2521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->RemovingFromWindow();
25225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
25235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
25245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Update the legacy window's parent temporarily to the desktop window. It
25255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // will eventually get reparented to the right root.
25265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
25275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->UpdateParent(::GetDesktopWindow());
25285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::DetachFromInputMethod() {
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::InputMethod* input_method = GetInputMethod();
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (input_method && input_method->GetTextInputClient() == this)
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_method->SetFocusedTextInputClient(NULL);
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2537e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid RenderWidgetHostViewAura::ForwardKeyboardEvent(
2538e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const NativeWebKeyboardEvent& event) {
2539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
2540c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ui::TextEditKeyBindingsDelegateAuraLinux* keybinding_delegate =
2541e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ui::GetTextEditKeyBindingsDelegate();
2542c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::vector<ui::TextEditCommandAuraLinux> commands;
2543e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!event.skip_in_browser &&
2544e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      keybinding_delegate &&
2545e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      event.os_event &&
2546e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      keybinding_delegate->MatchEvent(*event.os_event, &commands)) {
2547e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // Transform from ui/ types to content/ types.
2548e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    EditCommands edit_commands;
2549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (std::vector<ui::TextEditCommandAuraLinux>::const_iterator it =
2550e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch             commands.begin(); it != commands.end(); ++it) {
2551e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      edit_commands.push_back(EditCommand(it->GetCommandString(),
2552e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                          it->argument()));
2553e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
2554e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    host_->Send(new InputMsg_SetEditCommandsForNextKeyEvent(
2555e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        host_->GetRoutingID(), edit_commands));
2556e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    NativeWebKeyboardEvent copy_event(event);
2557e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    copy_event.match_edit_command = true;
2558e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    host_->ForwardKeyboardEvent(copy_event);
2559e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
2560e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
2561e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif
2562e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2563e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  host_->ForwardKeyboardEvent(event);
2564e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
2565e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2566116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSkColorType RenderWidgetHostViewAura::PreferredReadbackFormat() {
2567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return kN32_SkColorType;
25685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
25695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// DelegatedFrameHost, public:
2572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ui::Compositor* RenderWidgetHostViewAura::GetCompositor() const {
2574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
2575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return host ? host->compositor() : NULL;
25765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
25775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ui::Layer* RenderWidgetHostViewAura::GetLayer() {
2579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return window_->layer();
2580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)RenderWidgetHostImpl* RenderWidgetHostViewAura::GetHost() {
2583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return host_;
2584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2585effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool RenderWidgetHostViewAura::IsVisible() {
2587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return IsShowing();
2588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Size RenderWidgetHostViewAura::DesiredFrameSize() {
2591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return window_->bounds().size();
2592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)float RenderWidgetHostViewAura::CurrentDeviceScaleFactor() {
2595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return current_device_scale_factor_;
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Size RenderWidgetHostViewAura::ConvertViewSizeToPixel(
2599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const gfx::Size& size) {
2600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return content::ConvertViewSizeToPixel(this, size);
2601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)scoped_ptr<ResizeLock> RenderWidgetHostViewAura::CreateResizeLock(
2604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bool defer_compositor_lock) {
2605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Size desired_size = window_->bounds().size();
2606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return scoped_ptr<ResizeLock>(new CompositorResizeLock(
2607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      window_->GetHost(),
2608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      desired_size,
2609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      defer_compositor_lock,
2610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(kResizeLockTimeoutMs)));
2611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DelegatedFrameHost* RenderWidgetHostViewAura::GetDelegatedFrameHost() const {
2614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return delegated_frame_host_.get();
2615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// RenderWidgetHostViewBase, public:
2619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RenderWidgetHostViewBase::GetDefaultScreenInfo(WebScreenInfo* results) {
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetScreenInfoForWindow(results, NULL);
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2626