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"
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/renderer_host/render_view_host_impl.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/ui_events_helper.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/web_input_event_aura.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/gl_helper.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_messages.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/content_browser_client.h"
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/overscroll_configuration.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/public/browser/render_widget_host_view_frame_subscriber.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/common/content_switches.h"
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebScreenInfo.h"
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/cursor_client.h"
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/client/cursor_client_observer.h"
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/focus_client.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/screen_position_client.h"
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/client/window_tree_client.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_observer.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_tracker.h"
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/scoped_clipboard_writer.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ime/input_method.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_types.h"
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/compositor/compositor_vsync_manager.h"
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h"
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/gestures/gesture_recognizer.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h"
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_client.h"
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/scoped_tooltip_disabler.h"
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/tooltip_client.h"
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/transient_window_client.h"
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/wm/public/window_types.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_manager_win.h"
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_win.h"
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/legacy_render_widget_host_win.h"
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/plugin_constants_win.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/hidden_window.h"
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/gdi_util.h"
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/win/dpi.h"
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/common/input_messages.h"
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/linux/text_edit_command_auralinux.h"
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h"
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using gfx::RectToSkIRect;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using gfx::SkIRectToRect;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebScreenInfo;
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebInputEvent;
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebGestureEvent;
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In mouse lock mode, we need to prevent the (invisible) cursor from hitting
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the border of the view, in order to get valid movement information. However,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forcing the cursor back to the center of the view after each mouse move
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// doesn't work well. It reduces the frequency of useful mouse move messages
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// significantly. Therefore, we move the cursor to the center of the view only
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if it approaches the border. |kMouseLockBorderPercentage| specifies the width
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the border area, in percentage of the corresponding dimension.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMouseLockBorderPercentage = 15;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When accelerated compositing is enabled and a widget resize is pending,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we delay further resizes of the UI. The following constant is the maximum
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// length of time that we should delay further UI resizes while waiting for a
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resized frame from a renderer.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kResizeLockTimeoutMs = 67;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to associate a plugin HWND with its RenderWidgetHostViewAura instance.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kWidgetOwnerProperty[] = L"RenderWidgetHostViewAuraOwner";
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL CALLBACK WindowDestroyingCallback(HWND window, LPARAM param) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* widget =
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<RenderWidgetHostViewAura*>(param);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == widget) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Properties set on HWNDs must be removed to avoid leaks.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RemoveProp(window, kWidgetOwnerProperty);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostViewBase::DetachPluginWindowsCallback(window);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL CALLBACK HideWindowsCallback(HWND window, LPARAM param) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* widget =
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<RenderWidgetHostViewAura*>(param);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == widget)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetParent(window, ui::GetHiddenWindow());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL CALLBACK ShowWindowsCallback(HWND window, LPARAM param) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* widget =
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<RenderWidgetHostViewAura*>(param);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == widget &&
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      widget->GetNativeView()->GetHost()) {
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    HWND parent = widget->GetNativeView()->GetHost()->GetAcceleratedWidget();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetParent(window, parent);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return TRUE;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct CutoutRectsParams {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* widget;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<gfx::Rect> cutout_rects;
161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<HWND, WebPluginGeometry>* geometry;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Used to update the region for the windowed plugin to draw in. We start with
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the clip rect from the renderer, then remove the cutout rects from the
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// renderer, and then remove the transient windows from the root window and the
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// constrained windows from the parent window.
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BOOL CALLBACK SetCutoutRectsCallback(HWND window, LPARAM param) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CutoutRectsParams* params = reinterpret_cast<CutoutRectsParams*>(param);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == params->widget) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // First calculate the offset of this plugin from the root window, since
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the cutouts are relative to the root window.
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    HWND parent =
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        params->widget->GetNativeView()->GetHost()->GetAcceleratedWidget();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    POINT offset;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    offset.x = offset.y = 0;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MapWindowPoints(window, parent, &offset, 1);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Now get the cached clip rect and cutouts for this plugin window that came
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // from the renderer.
182ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    std::map<HWND, WebPluginGeometry>::iterator i = params->geometry->begin();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    while (i != params->geometry->end() &&
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i->second.window != window &&
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           GetParent(i->second.window) != window) {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++i;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i == params->geometry->end()) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return TRUE;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HRGN hrgn = CreateRectRgn(i->second.clip_rect.x(),
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              i->second.clip_rect.y(),
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              i->second.clip_rect.right(),
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              i->second.clip_rect.bottom());
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We start with the cutout rects that came from the renderer, then add the
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ones that came from transient and constrained windows.
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<gfx::Rect> cutout_rects = i->second.cutout_rects;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < params->cutout_rects.size(); ++i) {
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect offset_cutout = params->cutout_rects[i];
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offset_cutout.Offset(-offset.x, -offset.y);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cutout_rects.push_back(offset_cutout);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::SubtractRectanglesFromRegion(hrgn, cutout_rects);
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // If we don't have any cutout rects then no point in messing with the
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // window region.
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (cutout_rects.size())
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SetWindowRgn(window, hrgn, TRUE);
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return TRUE;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A callback function for EnumThreadWindows to enumerate and dismiss
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// any owned popup windows.
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BOOL CALLBACK DismissOwnedPopups(HWND window, LPARAM arg) {
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const HWND toplevel_hwnd = reinterpret_cast<HWND>(arg);
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (::IsWindowVisible(window)) {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const HWND owner = ::GetWindow(window, GW_OWNER);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (toplevel_hwnd == owner) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ::PostMessage(window, WM_CANCELMODE, 0, 0);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void UpdateWebTouchEventAfterDispatch(blink::WebTouchEvent* event,
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                      blink::WebTouchPoint* point) {
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (point->state != blink::WebTouchPoint::StateReleased &&
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      point->state != blink::WebTouchPoint::StateCancelled)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --event->touchesLength;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned i = point - event->touches;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i < event->touchesLength;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++i) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->touches[i] = event->touches[i + 1];
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CanRendererHandleEvent(const ui::MouseEvent* event) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() == ui::ET_MOUSE_CAPTURE_CHANGED)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Renderer cannot handle WM_XBUTTON or NC events.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->native_event().message) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_XBUTTONDOWN:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_XBUTTONUP:
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_XBUTTONDBLCLK:
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_NCMOUSELEAVE:
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_NCMOUSEMOVE:
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCLBUTTONDOWN:
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCLBUTTONUP:
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCLBUTTONDBLCLK:
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCRBUTTONDOWN:
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCRBUTTONUP:
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCRBUTTONDBLCLK:
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCMBUTTONDOWN:
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCMBUTTONUP:
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCMBUTTONDBLCLK:
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_NCXBUTTONDOWN:
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_NCXBUTTONUP:
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_NCXBUTTONDBLCLK:
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#elif defined(USE_X11)
27323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Renderer only supports standard mouse buttons, so ignore programmable
27423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // buttons.
27523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  switch (event->type()) {
27623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
27723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case ui::ET_MOUSE_RELEASED:
27823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return event->IsAnyButton();
27923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    default:
28023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      break;
28123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We don't mark these as handled so that they're sent back to the
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DefWindowProc so it can generate WM_APPCOMMAND as necessary.
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsXButtonUpEvent(const ui::MouseEvent* event) {
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (event->native_event().message) {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_XBUTTONUP:
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_NCXBUTTONUP:
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetScreenInfoForWindow(WebScreenInfo* results, aura::Window* window) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Display display = window ?
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(window)->GetDisplayNearestWindow(window) :
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(window)->GetPrimaryDisplay();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->rect = display.bounds();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->availableRect = display.work_area();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(derat|oshima): Don't hardcode this. Get this from display object.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->depth = 24;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->depthPerComponent = 8;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results->deviceScaleFactor = display.device_scale_factor();
309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The Display rotation and the WebScreenInfo orientation are not the same
311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // angle. The former is the physical display rotation while the later is the
312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // rotation required by the content to be shown properly on the screen, in
313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // other words, relative to the physical display.
3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  results->orientationAngle = display.RotationAsDegree();
315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (results->orientationAngle == 90)
316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    results->orientationAngle = 270;
317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  else if (results->orientationAngle == 270)
318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    results->orientationAngle = 90;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PointerEventActivates(const ui::Event& event) {
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.type() == ui::ET_MOUSE_PRESSED)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.type() == ui::ET_GESTURE_BEGIN) {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ui::GestureEvent& gesture =
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<const ui::GestureEvent&>(event);
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gesture.details().touch_points() == 1;
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We need to watch for mouse events outside a Web Popup or its parent
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and dismiss the popup for certain events.
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RenderWidgetHostViewAura::EventFilterForPopupExit
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public ui::EventHandler {
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit EventFilterForPopupExit(RenderWidgetHostViewAura* rwhva)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : rwhva_(rwhva) {
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(rwhva_);
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::Env::GetInstance()->AddPreTargetHandler(this);
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~EventFilterForPopupExit() {
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::Env::GetInstance()->RemovePreTargetHandler(this);
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ui::EventHandler
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rwhva_->ApplyEventFilterForPopupExit(event);
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rwhva_->ApplyEventFilterForPopupExit(event);
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* rwhva_;
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EventFilterForPopupExit);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::ApplyEventFilterForPopupExit(
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::LocatedEvent* event) {
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (in_shutdown_ || is_fullscreen_ || !event->target())
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (event->type() != ui::ET_MOUSE_PRESSED &&
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event->type() != ui::ET_TOUCH_PRESSED) {
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = static_cast<aura::Window*>(event->target());
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (target != window_ &&
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      (!popup_parent_host_view_ ||
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)       target != popup_parent_host_view_->window_)) {
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Note: popup_parent_host_view_ may be NULL when there are multiple
381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // popup children per view. See: RenderWidgetHostViewAura::InitAsPopup().
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    in_shutdown_ = true;
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->Shutdown();
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We have to implement the WindowObserver interface on a separate object
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// because clang doesn't like implementing multiple interfaces that have
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// methods with the same name. This object is owned by the
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHostViewAura::WindowObserver : public aura::WindowObserver {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit WindowObserver(RenderWidgetHostViewAura* view)
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : view_(view) {
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->AddObserver(this);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~WindowObserver() {
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->RemoveObserver(this);
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::WindowObserver:
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowAddedToRootWindow(aura::Window* window) OVERRIDE {
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window == view_->window_)
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->AddedToRootWindow();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowRemovingFromRootWindow(aura::Window* window,
409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                              aura::Window* new_root) OVERRIDE {
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window == view_->window_)
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->RemovingFromRootWindow();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* view_;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WindowObserver);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, public:
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : host_(RenderWidgetHostImpl::From(host)),
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      window_(new aura::Window(this)),
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      delegated_frame_host_(new DelegatedFrameHost(this)),
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in_shutdown_(false),
428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      in_bounds_changed_(false),
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_fullscreen_(false),
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_parent_host_view_(NULL),
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_child_host_view_(NULL),
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_loading_(false),
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT),
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      can_compose_inline_(true),
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_composition_text_(false),
437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      accept_return_character_(false),
438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      last_swapped_software_frame_scale_factor_(1.f),
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      paint_canvas_(NULL),
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      synthetic_move_sent_(false),
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cursor_visibility_state_in_renderer_(UNKNOWN),
4421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      touch_editing_client_(NULL),
4431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      weak_ptr_factory_(this) {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetView(this);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_observer_.reset(new WindowObserver(this));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetTooltipText(window_, &tooltip_);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetActivationDelegate(window_, this);
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::SetActivationChangeObserver(window_, this);
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::SetFocusChangeObserver(window_, this);
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  window_->set_layer_owner_delegate(delegated_frame_host_.get());
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Screen::GetScreenFor(window_)->AddObserver(this);
45246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
45346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool overscroll_enabled = CommandLine::ForCurrentProcess()->
45446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0";
45546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetOverscrollControllerEnabled(overscroll_enabled);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, RenderWidgetHostView implementation:
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::InitAsChild(
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::NativeView parent_view) {
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetType(ui::wm::WINDOW_TYPE_CONTROL);
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Init(aura::WINDOW_LAYER_TEXTURED);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetName("RenderWidgetHostViewAura");
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::InitAsPopup(
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostView* parent_host_view,
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect& bounds_in_screen) {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_parent_host_view_ =
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<RenderWidgetHostViewAura*>(parent_host_view);
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TransientWindowClient may be NULL during tests.
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::client::TransientWindowClient* transient_window_client =
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::client::GetTransientWindowClient();
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* old_child =
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      popup_parent_host_view_->popup_child_host_view_;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (old_child) {
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(jhorwich): Allow multiple popup_child_host_view_ per view, or
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // similar mechanism to ensure a second popup doesn't cause the first one
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // to never get a chance to filter events. See crbug.com/160589.
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(old_child->popup_parent_host_view_ == popup_parent_host_view_);
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (transient_window_client) {
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      transient_window_client->RemoveTransientChild(
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        popup_parent_host_view_->window_, old_child->window_);
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    old_child->popup_parent_host_view_ = NULL;
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_parent_host_view_->popup_child_host_view_ = this;
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetType(ui::wm::WINDOW_TYPE_MENU);
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Init(aura::WINDOW_LAYER_TEXTURED);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetName("RenderWidgetHostViewAura");
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = popup_parent_host_view_->window_->GetRootWindow();
4961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::client::ParentWindowWithContext(window_, root, bounds_in_screen);
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Setting the transient child allows for the popup to get mouse events when
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in a system modal dialog.
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This fixes crbug.com/328593.
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (transient_window_client) {
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    transient_window_client->AddTransientChild(
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        popup_parent_host_view_->window_, window_);
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetBounds(bounds_in_screen);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Show();
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_WIN) && !defined(OS_CHROMEOS)
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (NeedsInputGrab())
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window_->SetCapture();
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  event_filter_for_popup_exit_.reset(new EventFilterForPopupExit(this));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::InitAsFullscreen(
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostView* reference_host_view) {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_fullscreen_ = true;
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetType(ui::wm::WINDOW_TYPE_NORMAL);
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Init(aura::WINDOW_LAYER_TEXTURED);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetName("RenderWidgetHostViewAura");
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* parent = NULL;
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reference_host_view) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* reference_window =
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<RenderWidgetHostViewAura*>(reference_host_view)->window_;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reference_window) {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_tracker_.reset(new aura::WindowTracker);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_tracker_->Add(reference_window);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Display display = gfx::Screen::GetScreenFor(window_)->
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetDisplayNearestWindow(reference_window);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent = reference_window->GetRootWindow();
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds = display.bounds();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::client::ParentWindowWithContext(window_, parent, bounds);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Show();
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Focus();
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHost* RenderWidgetHostViewAura::GetRenderWidgetHost() const {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::WasShown() {
54768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(host_);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_->is_hidden())
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasShown();
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = window_->GetRootWindow();
55368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (root) {
55468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    aura::client::CursorClient* cursor_client =
55568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        aura::client::GetCursorClient(root);
55668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (cursor_client)
55768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible());
55868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->WasShown();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_) {
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Reparent the legacy Chrome_RenderWidgetHostHWND window to the parent
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // window before reparenting any plugins. This ensures that the plugin
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // windows stay on top of the child Zorder in the parent and receive
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // mouse events, etc.
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->UpdateParent(
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        GetNativeView()->GetHost()->GetAcceleratedWidget());
5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->SetBounds(
5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_->GetBoundsInRootWindow());
5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LPARAM lparam = reinterpret_cast<LPARAM>(this);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::WasHidden() {
57968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!host_ || host_->is_hidden())
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasHidden();
582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->WasHidden();
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  constrained_rects_.clear();
586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host) {
588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    HWND parent = host->GetAcceleratedWidget();
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LPARAM lparam = reinterpret_cast<LPARAM>(this);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnumChildWindows(parent, HideWindowsCallback, lparam);
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // We reparent the legacy Chrome_RenderWidgetHostHWND window to the global
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // hidden window on the same lines as Windowed plugin windows.
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (legacy_render_widget_host_HWND_)
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      legacy_render_widget_host_HWND_->UpdateParent(ui::GetHiddenWindow());
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetSize(const gfx::Size& size) {
6001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // For a SetSize operation, we don't care what coordinate system the origin
6011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // of the window is in, it's only important to make sure that the origin
6021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // remains constant after the operation.
6031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InternalSetBounds(gfx::Rect(window_->bounds().origin(), size));
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetBounds(const gfx::Rect& rect) {
6071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Point relative_origin(rect.origin());
608a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
6091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // RenderWidgetHostViewAura::SetBounds() takes screen coordinates, but
6101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Window::SetBounds() takes parent coordinates, so do the conversion here.
6111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = window_->GetRootWindow();
6121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (root) {
6131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::client::ScreenPositionClient* screen_position_client =
6141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        aura::client::GetScreenPositionClient(root);
6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (screen_position_client) {
6161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      screen_position_client->ConvertPointFromScreen(
6171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          window_->parent(), &relative_origin);
6181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
6201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InternalSetBounds(gfx::Rect(relative_origin, rect.size()));
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView RenderWidgetHostViewAura::GetNativeView() const {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeViewId RenderWidgetHostViewAura::GetNativeViewId() const {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host)
632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return reinterpret_cast<gfx::NativeViewId>(host->GetAcceleratedWidget());
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<gfx::NativeViewId>(NULL);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeViewAccessible RenderWidgetHostViewAura::GetNativeViewAccessible() {
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return static_cast<gfx::NativeViewAccessible>(NULL);
642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HWND hwnd = host->GetAcceleratedWidget();
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBrowserAccessibilityManagerIfNeeded();
6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager();
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (manager)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return manager->GetRoot()->ToBrowserAccessibilityWin();
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<gfx::NativeViewAccessible>(NULL);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ui::TextInputClient* RenderWidgetHostViewAura::GetTextInputClient() {
655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return this;
656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::SetKeyboardFocus() {
659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (CanFocus()) {
661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    aura::WindowTreeHost* host = window_->GetHost();
662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (host)
663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ::SetFocus(host->GetAcceleratedWidget());
664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
668effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochRenderFrameHostImpl* RenderWidgetHostViewAura::GetFocusedFrame() {
669effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!host_->IsRenderView())
670effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
671effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderViewHost* rvh = RenderViewHost::From(host_);
672effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FrameTreeNode* focused_frame =
673effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      rvh->GetDelegate()->GetFrameTree()->GetFocusedFrame();
674effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!focused_frame)
675effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
676effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
677effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return focused_frame->current_frame_host();
678effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
679effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::MovePluginWindows(
681ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const std::vector<WebPluginGeometry>& plugin_window_moves) {
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to clip the rectangle to the tab's viewport, otherwise we will draw
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // over the browser UI.
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!window_->GetRootWindow()) {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(plugin_window_moves.empty());
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HWND parent = window_->GetHost()->GetAcceleratedWidget();
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect view_bounds = window_->GetBoundsInRootWindow();
691ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::vector<WebPluginGeometry> moves = plugin_window_moves;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  gfx::Rect view_port(view_bounds.size());
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < moves.size(); ++i) {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect clip(moves[i].clip_rect);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector2d view_port_offset(
6985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        moves[i].window_rect.OffsetFromOrigin());
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    clip.Offset(view_port_offset);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    clip.Intersect(view_port);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    clip.Offset(-view_port_offset);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    moves[i].clip_rect = clip;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    moves[i].window_rect.Offset(view_bounds.OffsetFromOrigin());
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    plugin_window_moves_[moves[i].window] = moves[i];
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // constrained_rects_ are relative to the root window. We want to convert
709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // them to be relative to the plugin window.
710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (size_t j = 0; j < constrained_rects_.size(); ++j) {
711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Rect offset_cutout = constrained_rects_[j];
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offset_cutout -= moves[i].window_rect.OffsetFromOrigin();
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      moves[i].cutout_rects.push_back(offset_cutout);
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MovePluginWindowsHelper(parent, moves);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure each plugin window (or its wrapper if it exists) has a pointer to
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |this|.
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < moves.size(); ++i) {
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HWND window = moves[i].window;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (GetParent(window) != parent) {
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window = GetParent(window);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!GetProp(window, kWidgetOwnerProperty))
7273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      SetProp(window, kWidgetOwnerProperty, this);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Focus() {
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure we have a FocusClient before attempting to Focus(). In some
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // situations we may not yet be in a valid Window hierarchy (such as reloading
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // after out of memory discarded the tab).
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::FocusClient* client = aura::client::GetFocusClient(window_);
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (client)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->Focus();
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Blur() {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->Blur();
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::HasFocus() const {
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_->HasFocus();
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::IsSurfaceAvailableForCopy() const {
750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return delegated_frame_host_->CanCopyToBitmap();
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Show() {
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->Show();
75568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  WasShown();
7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->Show();
7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Hide() {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->Hide();
76468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  WasHidden();
7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->Hide();
7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::IsShowing() {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_->IsVisible();
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::GetViewBounds() const {
776cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return window_->GetBoundsInScreen();
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
779cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderWidgetHostViewAura::SetBackgroundOpaque(bool opaque) {
780cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderWidgetHostViewBase::SetBackgroundOpaque(opaque);
781cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host_->SetBackgroundOpaque(opaque);
782cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  window_->layer()->SetFillsBoundsOpaquely(opaque);
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liugfx::Size RenderWidgetHostViewAura::GetVisibleViewportSize() const {
786cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Rect requested_rect(GetRequestedRendererSize());
787cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  requested_rect.Inset(insets_);
788cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return requested_rect.size();
7895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RenderWidgetHostViewAura::SetInsets(const gfx::Insets& insets) {
7925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (insets != insets_) {
7935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    insets_ = insets;
7945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    host_->WasResized();
7955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
7965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::UpdateCursor(const WebCursor& cursor) {
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_cursor_ = cursor;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Display display = gfx::Screen::GetScreenFor(window_)->
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDisplayNearestWindow(window_);
8022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  current_cursor_.SetDisplayInfo(display);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursorIfOverSelf();
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetIsLoading(bool is_loading) {
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_loading_ = is_loading;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursorIfOverSelf();
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
811f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void RenderWidgetHostViewAura::TextInputStateChanged(
812f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const ViewHostMsg_TextInputState_Params& params) {
813f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (text_input_type_ != params.type ||
814f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      text_input_mode_ != params.mode ||
815f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      can_compose_inline_ != params.can_compose_inline) {
816f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    text_input_type_ = params.type;
817f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    text_input_mode_ = params.mode;
818f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    can_compose_inline_ = params.can_compose_inline;
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (GetInputMethod())
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetInputMethod()->OnTextInputTypeChanged(this);
821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (touch_editing_client_)
822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      touch_editing_client_->OnTextInputTypeChanged(text_input_type_);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (params.show_ime_if_needed && params.type != ui::TEXT_INPUT_TYPE_NONE) {
8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (GetInputMethod())
8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetInputMethod()->ShowImeIfNeeded();
8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ImeCancelComposition() {
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetInputMethod())
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetInputMethod()->CancelComposition(this);
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ImeCompositionRangeChanged(
83758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const gfx::Range& range,
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<gfx::Rect>& character_bounds) {
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  composition_character_bounds_ = character_bounds;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostViewAura::RenderProcessGone(base::TerminationStatus status,
8437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 int error_code) {
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursorIfOverSelf();
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Destroy();
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Destroy() {
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Beware, this function is not called on all destruction paths. It will
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implicitly end up calling ~RenderWidgetHostViewAura though, so all
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destruction/cleanup code should happen there, not here.
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_shutdown_ = true;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete window_;
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
856a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostViewAura::SetTooltipText(
857a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& tooltip_text) {
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tooltip_ = tooltip_text;
8591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
86090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  aura::client::TooltipClient* tooltip_client =
86190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      aura::client::GetTooltipClient(root_window);
86290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (tooltip_client) {
86390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    tooltip_client->UpdateTooltip(window_);
86490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Content tooltips should be visible indefinitely.
86590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    tooltip_client->SetTooltipShownTimeout(window_, 0);
86690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
869a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostViewAura::SelectionChanged(const base::string16& text,
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                size_t offset,
87158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                const gfx::Range& range) {
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewBase::SelectionChanged(text, offset, range);
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) && !defined(OS_CHROMEOS)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (text.empty() || range.is_empty())
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
87723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  size_t pos = range.GetMin() - offset;
87823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  size_t n = range.length();
87923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
88023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(pos + n <= text.length()) << "The text can not fully cover range.";
88123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (pos >= text.length()) {
88223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    NOTREACHED() << "The text can not cover range.";
88323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
88423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Set the CLIPBOARD_TYPE_SELECTION to the ui::Clipboard.
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ScopedClipboardWriter clipboard_writer(
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Clipboard::GetForCurrentThread(),
8894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ui::CLIPBOARD_TYPE_SELECTION);
89023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  clipboard_writer.WriteText(text.substr(pos, n));
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(USE_X11) && !defined(OS_CHROMEOS)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
894cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size RenderWidgetHostViewAura::GetRequestedRendererSize() const {
895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return delegated_frame_host_->GetRequestedRendererSize();
896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SelectionBoundsChanged(
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ViewHostMsg_SelectionBounds_Params& params) {
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (selection_anchor_rect_ == params.anchor_rect &&
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      selection_focus_rect_ == params.focus_rect)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_anchor_rect_ = params.anchor_rect;
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_focus_rect_ = params.focus_rect;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetInputMethod())
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetInputMethod()->OnCaretBoundsChanged(this);
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_) {
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_editing_client_->OnSelectionOrCursorChanged(selection_anchor_rect_,
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        selection_focus_rect_);
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::ScrollOffsetChanged() {
9171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = window_->GetRootWindow();
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!root)
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::CursorClient* cursor_client =
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::GetCursorClient(root);
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cursor_client && !cursor_client->IsCursorVisible())
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cursor_client->DisableMouseEvents();
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
926eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderWidgetHostViewAura::CopyFromCompositingSurface(
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& src_subrect,
928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const gfx::Size& dst_size,
9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Callback<void(bool, const SkBitmap&)>& callback,
9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SkBitmap::Config config) {
931010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->CopyFromCompositingSurface(
932010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      src_subrect, dst_size, callback, config);
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::CopyFromCompositingSurfaceToVideoFrame(
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Rect& src_subrect,
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const scoped_refptr<media::VideoFrame>& target,
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Callback<void(bool)>& callback) {
939010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame(
940010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      src_subrect, target, callback);
941a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
942a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostViewAura::CanCopyToVideoFrame() const {
944010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return delegated_frame_host_->CanCopyToVideoFrame();
945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool RenderWidgetHostViewAura::CanSubscribeFrame() const {
948010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return delegated_frame_host_->CanSubscribeFrame();
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::BeginFrameSubscription(
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) {
953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->BeginFrameSubscription(subscriber.Pass());
954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::EndFrameSubscription() {
957010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->EndFrameSubscription();
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceInitialized(int host_id,
961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                             int route_id) {
962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
96446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void RenderWidgetHostViewAura::SnapToPhysicalPixelBoundary() {
96546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The top left corner of our view in window coordinates might not land on a
96646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // device pixel boundary if we have a non-integer device scale. In that case,
96746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // to avoid the web contents area looking blurry we translate the web contents
96846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // in the +x, +y direction to land on the nearest pixel boundary. This may
96946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // cause the bottom and right edges to be clipped slightly, but that's ok.
97046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gfx::Point view_offset_dips = window_->GetBoundsInRootWindow().origin();
97146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gfx::PointF view_offset = view_offset_dips;
97246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  view_offset.Scale(current_device_scale_factor_);
97346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gfx::PointF view_offset_snapped(std::ceil(view_offset.x()),
97446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                  std::ceil(view_offset.y()));
97546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
97646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gfx::Vector2dF fudge = view_offset_snapped - view_offset;
97746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  fudge.Scale(1.0 / current_device_scale_factor_);
978f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetLayer()->SetSubpixelPositionOffset(fudge);
97946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
98046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void RenderWidgetHostViewAura::InternalSetBounds(const gfx::Rect& rect) {
9821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (HasDisplayPropertyChanged(window_))
9831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    host_->InvalidateScreenInfo();
9841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
985f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SnapToPhysicalPixelBoundary();
986a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Don't recursively call SetBounds if this bounds update is the result of
987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // a Window::SetBoundsInternal call.
988a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!in_bounds_changed_)
989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    window_->SetBounds(rect);
9901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  host_->WasResized();
991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->WasResized();
9921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (touch_editing_client_) {
9931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    touch_editing_client_->OnSelectionOrCursorChanged(selection_anchor_rect_,
9941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      selection_focus_rect_);
9951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Create the legacy dummy window which corresponds to the bounds of the
9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // webcontents. This will be passed as the container window for windowless
9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // plugins.
1000f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Plugins like Flash assume the container window which is returned via the
1001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // NPNVnetscapeWindow property corresponds to the bounds of the webpage.
1002f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This is not true in Aura where we have only HWND which is the main Aura
1003f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // window. If we return this window to plugins like Flash then it causes the
1004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // coordinate translations done by these plugins to break.
10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Additonally the legacy dummy window is needed for accessibility and for
10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // scrolling to work in legacy drivers for trackpoints/trackpads, etc.
10075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (GetNativeViewId()) {
10085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!legacy_render_widget_host_HWND_) {
10095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      legacy_render_widget_host_HWND_ = LegacyRenderWidgetHostHWND::Create(
10105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          reinterpret_cast<HWND>(GetNativeViewId()));
1011f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      BrowserAccessibilityManagerWin* manager =
1012f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          static_cast<BrowserAccessibilityManagerWin*>(
1013f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              GetBrowserAccessibilityManager());
1014f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (manager)
1015f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        manager->SetAccessibleHWND(legacy_render_widget_host_HWND_.get());
10165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
10175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (legacy_render_widget_host_HWND_) {
10185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      legacy_render_widget_host_HWND_->SetBounds(
10195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          window_->GetBoundsInRootWindow());
10205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1021f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1022effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1023effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (mouse_locked_)
1024effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    UpdateMouseLockRegion();
1025f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
10261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
10271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1028010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_WIN)
1029010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool RenderWidgetHostViewAura::UsesNativeWindowFrame() const {
1030010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return (legacy_render_widget_host_HWND_ != NULL);
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::UpdateConstrainedWindowRects(
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<gfx::Rect>& rects) {
10355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check this before setting constrained_rects_, so that next time they're set
10365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and we have a root window we don't early return.
1037a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!window_->GetHost())
10385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
10395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1040f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (rects == constrained_rects_)
1041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  constrained_rects_ = rects;
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1045a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HWND parent = window_->GetHost()->GetAcceleratedWidget();
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CutoutRectsParams params;
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.widget = this;
1048f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  params.cutout_rects = constrained_rects_;
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.geometry = &plugin_window_moves_;
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LPARAM lparam = reinterpret_cast<LPARAM>(&params);
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EnumChildWindows(parent, SetCutoutRectsCallback, lparam);
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1053effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1054effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderWidgetHostViewAura::UpdateMouseLockRegion() {
1055effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Clip the cursor if chrome is running on regular desktop.
1056effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (gfx::Screen::GetScreenFor(window_) == gfx::Screen::GetNativeScreen()) {
1057effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    RECT window_rect = window_->GetBoundsInScreen().ToRECT();
1058effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ::ClipCursor(&window_rect);
1059effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1060effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped(
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel,
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int gpu_host_id) {
1066c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Oldschool composited mode is no longer supported.
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnSwapCompositorFrame(
1070ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    uint32 output_surface_id,
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<cc::CompositorFrame> frame) {
10723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TRACE_EVENT0("content", "RenderWidgetHostViewAura::OnSwapCompositorFrame");
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (frame->delegated_frame_data) {
1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    delegated_frame_host_->SwapDelegatedFrame(
1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        output_surface_id,
1076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        frame->delegated_frame_data.Pass(),
1077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        frame->metadata.device_scale_factor,
1078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        frame->metadata.latency_info);
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (frame->software_frame_data) {
1083c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DLOG(ERROR) << "Unable to use software frame in aura";
1084c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    RecordAction(
1085c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::UserMetricsAction("BadMessageTerminate_SharedMemoryAura"));
1086c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    host_->GetProcess()->ReceivedBadMessage();
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetHostViewAura::SetParentNativeViewAccessible(
109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gfx::NativeViewAccessible accessible_parent) {
109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (GetBrowserAccessibilityManager()) {
109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin()
109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ->set_parent_iaccessible(accessible_parent);
109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1099f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::NativeViewId RenderWidgetHostViewAura::GetParentForWindowlessPlugin()
1101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const {
11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_) {
11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return reinterpret_cast<gfx::NativeViewId>(
11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        legacy_render_widget_host_HWND_->hwnd());
11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return NULL;
1107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
110890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer(
11117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel,
11127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int gpu_host_id) {
1113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Oldschool composited mode is no longer supported.
11147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
11157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() {
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() {
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::HasAcceleratedSurface(
1123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const gfx::Size& desired_size) {
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matter what is returned here as GetBackingStore is the only caller of this
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // method. TODO(jbates) implement this if other Aura code needs it.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::GetScreenInfo(WebScreenInfo* results) {
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetScreenInfoForWindow(results, window_->GetRootWindow() ? window_ : NULL);
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::GetBoundsInRootWindow() {
1135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  aura::Window* top_level = window_->GetToplevelWindow();
1136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Rect bounds(top_level->GetBoundsInScreen());
1137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
11380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_WIN)
1139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // TODO(zturner,iyengar): This will break when we remove support for NPAPI and
1140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // remove the legacy hwnd, so a better fix will need to be decided when that
1141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // happens.
1142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (UsesNativeWindowFrame()) {
1143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // aura::Window doesn't take into account non-client area of native windows
1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // (e.g. HWNDs), so for that case ask Windows directly what the bounds are.
1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    aura::WindowTreeHost* host = top_level->GetHost();
1146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (!host)
1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return top_level->GetBoundsInScreen();
1148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RECT window_rect = {0};
1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    HWND hwnd = host->GetAcceleratedWidget();
1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ::GetWindowRect(hwnd, &window_rect);
1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bounds = gfx::Rect(window_rect);
1152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Maximized windows are outdented from the work area by the frame thickness
1154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // even though this "frame" is not painted.  This confuses code (and people)
1155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // that think of a maximized window as corresponding exactly to the work
1156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // area.  Correct for this by subtracting the frame thickness back off.
1157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (::IsZoomed(hwnd)) {
1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bounds.Inset(GetSystemMetrics(SM_CXSIZEFRAME),
1159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   GetSystemMetrics(SM_CYSIZEFRAME));
1160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bounds.Inset(GetSystemMetrics(SM_CXPADDEDBORDER),
1162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   GetSystemMetrics(SM_CXPADDEDBORDER));
1163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
1164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bounds = gfx::win::ScreenToDIPRect(bounds);
1167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
11680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return bounds;
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void RenderWidgetHostViewAura::WheelEventAck(
117346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const blink::WebMouseWheelEvent& event,
117446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    InputEventAckState ack_result) {
117546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (overscroll_controller_) {
117646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    overscroll_controller_->ReceivedEventACK(
117746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        event, (INPUT_EVENT_ACK_STATE_CONSUMED == ack_result));
117846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
117946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
118046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::GestureEventAck(
11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const blink::WebGestureEvent& event,
11835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputEventAckState ack_result) {
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_)
11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    touch_editing_client_->GestureEventAck(event.type);
118646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
118746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (overscroll_controller_) {
118846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    overscroll_controller_->ReceivedEventACK(
118946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        event, (INPUT_EVENT_ACK_STATE_CONSUMED == ack_result));
119046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ProcessAckedTouchEvent(
11947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const TouchEventWithLatencyInfo& touch, InputEventAckState ack_result) {
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<ui::TouchEvent> events;
11967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!MakeUITouchEventsFromWebTouchEvents(touch, &events,
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           SCREEN_COORDINATES))
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
1201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // |host| is NULL during tests.
1202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::EventResult result = (ack_result ==
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      INPUT_EVENT_ACK_STATE_CONSUMED) ? ui::ER_HANDLED : ui::ER_UNHANDLED;
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ScopedVector<ui::TouchEvent>::iterator iter = events.begin(),
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end = events.end(); iter != end; ++iter) {
1209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    host->dispatcher()->ProcessedTouchEvent((*iter), window_, result);
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<SyntheticGestureTarget>
1214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderWidgetHostViewAura::CreateSyntheticGestureTarget() {
1215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return scoped_ptr<SyntheticGestureTarget>(
1216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new SyntheticGestureTargetAura(host_));
1217a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
1218a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
121946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)InputEventAckState RenderWidgetHostViewAura::FilterInputEvent(
122046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const blink::WebInputEvent& input_event) {
122146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool consumed = false;
122246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (input_event.type == WebInputEvent::GestureFlingStart) {
122346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const WebGestureEvent& gesture_event =
122446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        static_cast<const WebGestureEvent&>(input_event);
122546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Zero-velocity touchpad flings are an Aura-specific signal that the
122646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // touchpad scroll has ended, and should not be forwarded to the renderer.
122746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad &&
122846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        !gesture_event.data.flingStart.velocityX &&
122946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        !gesture_event.data.flingStart.velocityY) {
123046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      consumed = true;
123146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
123246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
123346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
123446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (overscroll_controller_)
123546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    consumed |= overscroll_controller_->WillHandleEvent(input_event);
123646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
123746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return consumed && !WebTouchEvent::isTouchEventType(input_event.type)
123846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)             ? INPUT_EVENT_ACK_STATE_CONSUMED
123946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)             : INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
124046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
124146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::CreateBrowserAccessibilityManagerIfNeeded() {
12435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
1244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!GetBrowserAccessibilityManager()) {
1245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    gfx::NativeViewAccessible accessible_parent =
1246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        host_->GetParentNativeViewAccessible();
1247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    LegacyRenderWidgetHostHWND* parent_hwnd =
1248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        legacy_render_widget_host_HWND_.get();
1249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SetBrowserAccessibilityManager(new BrowserAccessibilityManagerWin(
12505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        legacy_render_widget_host_HWND_.get(), accessible_parent,
1251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        BrowserAccessibilityManagerWin::GetEmptyDocument(), host_));
12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
12535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
1254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!GetBrowserAccessibilityManager()) {
1255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SetBrowserAccessibilityManager(
1256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        BrowserAccessibilityManager::Create(
1257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            BrowserAccessibilityManager::GetEmptyDocument(), host_));
1258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::GLSurfaceHandle RenderWidgetHostViewAura::GetCompositingSurface() {
12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ImageTransportFactory::GetInstance()->GetSharedSurfaceHandle();
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::LockMouse() {
1267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
1268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!root_window)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_locked_ = true;
12754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_WIN)
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetCapture();
1277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
1278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  UpdateMouseLockRegion();
12794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::CursorClient* cursor_client =
1281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      aura::client::GetCursorClient(root_window);
1282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client) {
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cursor_client->HideCursor();
1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->LockCursor();
1285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1287b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (ShouldMoveToCenter()) {
1288b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    synthetic_move_sent_ = true;
1289b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    window_->MoveCursorTo(gfx::Rect(window_->bounds().size()).CenterPoint());
1290b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
12915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tooltip_disabler_.reset(new aura::client::ScopedTooltipDisabler(root_window));
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::UnlockMouse() {
12965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tooltip_disabler_.reset();
12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
1299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!mouse_locked_ || !root_window)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_locked_ = false;
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_WIN)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->ReleaseCapture();
1306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
1307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ::ClipCursor(NULL);
13084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->MoveCursorTo(unlocked_mouse_position_);
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::CursorClient* cursor_client =
1311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      aura::client::GetCursorClient(root_window);
1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client) {
1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->UnlockCursor();
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cursor_client->ShowCursor();
1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->LostMouseLock();
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, ui::TextInputClient implementation:
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetCompositionText(
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::CompositionText& composition) {
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): convert both renderer_host and renderer to use
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ui::CompositionText.
132946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<blink::WebCompositionUnderline> underlines;
133046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  underlines.reserve(composition.underlines.size());
133146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (std::vector<ui::CompositionUnderline>::const_iterator it =
133246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)           composition.underlines.begin();
133346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       it != composition.underlines.end(); ++it) {
13346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    underlines.push_back(
13356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        blink::WebCompositionUnderline(static_cast<unsigned>(it->start_offset),
13366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       static_cast<unsigned>(it->end_offset),
13376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       it->color,
13386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       it->thick,
13396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       it->background_color));
134046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): due to a bug of webkit, we can't use selection range with
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // composition string. See: https://bugs.webkit.org/show_bug.cgi?id=37788
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->ImeSetComposition(composition.text, underlines,
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           composition.selection.end(),
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           composition.selection.end());
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = !composition.text.empty();
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ConfirmCompositionText() {
1352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (host_ && has_composition_text_) {
1353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    host_->ImeConfirmComposition(base::string16(), gfx::Range::InvalidRange(),
1354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 false);
1355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ClearCompositionText() {
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_ && has_composition_text_)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->ImeCancelComposition();
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostViewAura::InsertText(const base::string16& text) {
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(text_input_type_ != ui::TEXT_INPUT_TYPE_NONE);
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_)
136858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    host_->ImeConfirmComposition(text, gfx::Range::InvalidRange(), false);
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::InsertChar(base::char16 ch, int flags) {
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (popup_child_host_view_ && popup_child_host_view_->NeedsInputGrab()) {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    popup_child_host_view_->InsertChar(ch, flags);
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Ignore character messages for VKEY_RETURN sent on CTRL+M. crbug.com/315547
1379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (host_ && (accept_return_character_ || ch != ui::VKEY_RETURN)) {
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double now = ui::EventTimeForNow().InSecondsF();
1381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Send a blink::WebInputEvent::Char event to |host_|.
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeWebKeyboardEvent webkit_event(ui::ET_KEY_PRESSED,
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        true /* is_char */,
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        ch,
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        flags,
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        now);
1387e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ForwardKeyboardEvent(webkit_event);
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gfx::NativeWindow RenderWidgetHostViewAura::GetAttachedWindow() const {
1392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return window_;
1393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::TextInputType RenderWidgetHostViewAura::GetTextInputType() const {
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return text_input_type_;
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochui::TextInputMode RenderWidgetHostViewAura::GetTextInputMode() const {
140058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return text_input_mode_;
1401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::CanComposeInline() const {
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return can_compose_inline_;
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::ConvertRectToScreen(
14088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const gfx::Rect& rect) const {
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point origin = rect.origin();
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point end = gfx::Point(rect.right(), rect.bottom());
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
141358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!root_window)
141458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return rect;
141558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  aura::client::ScreenPositionClient* screen_position_client =
141658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      aura::client::GetScreenPositionClient(root_window);
141758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!screen_position_client)
141858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return rect;
141958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  screen_position_client->ConvertPointToScreen(window_, &origin);
142058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  screen_position_client->ConvertPointToScreen(window_, &end);
142158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return gfx::Rect(origin.x(),
142258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   origin.y(),
142358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   end.x() - origin.x(),
142458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   end.y() - origin.y());
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::ConvertRectFromScreen(
14288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const gfx::Rect& rect) const {
1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point origin = rect.origin();
1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point end = gfx::Point(rect.right(), rect.bottom());
1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (root_window) {
1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::client::ScreenPositionClient* screen_position_client =
1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        aura::client::GetScreenPositionClient(root_window);
1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen_position_client->ConvertPointFromScreen(window_, &origin);
1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen_position_client->ConvertPointFromScreen(window_, &end);
1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return gfx::Rect(origin.x(),
1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     origin.y(),
1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     end.x() - origin.x(),
1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     end.y() - origin.y());
1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return rect;
1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::GetCaretBounds() const {
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect rect =
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::UnionRects(selection_anchor_rect_, selection_focus_rect_);
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertRectToScreen(rect);
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetCompositionCharacterBounds(
14548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    uint32 index,
14558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Rect* rect) const {
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(rect);
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index >= composition_character_bounds_.size())
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *rect = ConvertRectToScreen(composition_character_bounds_[index]);
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::HasCompositionText() const {
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return has_composition_text_;
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetTextRange(gfx::Range* range) const {
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_start(selection_text_offset_);
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_end(selection_text_offset_ + selection_text_.length());
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetCompositionTextRange(
14748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Range* range) const {
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetSelectionRange(gfx::Range* range) const {
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_start(selection_range_.start());
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_end(selection_range_.end());
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool RenderWidgetHostViewAura::SetSelectionRange(const gfx::Range& range) {
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool RenderWidgetHostViewAura::DeleteRange(const gfx::Range& range) {
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::GetTextFromRange(
149958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const gfx::Range& range,
1500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16* text) const {
150158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Range selection_text_range(selection_text_offset_,
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selection_text_offset_ + selection_text_.length());
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!selection_text_range.Contains(range)) {
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text->clear();
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selection_text_range.EqualsIgnoringDirection(range)) {
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Avoid calling substr whose performance is low.
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *text = selection_text_;
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *text = selection_text_.substr(
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        range.GetMin() - selection_text_offset_,
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        range.length());
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnInputMethodChanged() {
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetInputMethod())
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->SetInputMethodActive(GetInputMethod()->IsActive());
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement the newly added “locale” property of HTML DOM
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TextEvent.
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::ChangeTextDirectionAndLayoutAlignment(
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::i18n::TextDirection direction) {
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->UpdateTextDirection(
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      direction == base::i18n::RIGHT_TO_LEFT ?
1536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebTextDirectionRightToLeft :
1537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebTextDirectionLeftToRight);
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->NotifyTextDirection();
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ExtendSelectionAndDelete(
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t before, size_t after) {
1544effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderFrameHostImpl* rfh = GetFocusedFrame();
1545effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (rfh)
1546effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    rfh->ExtendSelectionAndDelete(before, after);
1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::EnsureCaretInRect(const gfx::Rect& rect) {
1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect intersected_rect(
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::IntersectRects(rect, window_->GetBoundsInScreen()));
1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (intersected_rect.IsEmpty())
1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_->ScrollFocusedEditableNodeIntoRect(
1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ConvertRectFromScreen(intersected_rect));
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::OnCandidateWindowShown() {
1561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  host_->CandidateWindowShown();
1562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::OnCandidateWindowUpdated() {
1565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  host_->CandidateWindowUpdated();
1566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::OnCandidateWindowHidden() {
1569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  host_->CandidateWindowHidden();
1570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
157246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool RenderWidgetHostViewAura::IsEditingCommandEnabled(int command_id) {
157346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return false;
157446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
157546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
157646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void RenderWidgetHostViewAura::ExecuteEditingCommand(int command_id) {
157746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
157846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostViewAura, gfx::DisplayObserver implementation:
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnDisplayAdded(
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Display& new_display) {
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnDisplayRemoved(
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Display& old_display) {
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderWidgetHostViewAura::OnDisplayMetricsChanged(
1591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Display& display, uint32_t metrics) {
1592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The screen info should be updated regardless of the metric change.
1593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Screen* screen = gfx::Screen::GetScreenFor(window_);
1594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (display.id() == screen->GetDisplayNearestWindow(window_).id()) {
1595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UpdateScreenInfo(window_);
1596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    current_cursor_.SetDisplayInfo(display);
1597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UpdateCursorIfOverSelf();
1598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, aura::WindowDelegate implementation:
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size RenderWidgetHostViewAura::GetMinimumSize() const {
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size();
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size RenderWidgetHostViewAura::GetMaximumSize() const {
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size();
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnBoundsChanged(const gfx::Rect& old_bounds,
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               const gfx::Rect& new_bounds) {
1614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::AutoReset<bool> in_bounds_changed(&in_bounds_changed_, true);
16155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We care about this whenever RenderWidgetHostViewAura is not owned by a
16165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // WebContentsViewAura since changes to the Window's bounds need to be
16175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // messaged to the renderer.  WebContentsViewAura invokes SetSize() or
16185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // SetBounds() itself.  No matter how we got here, any redundant calls are
16195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // harmless.
16205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetSize(new_bounds.size());
16215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
16225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (GetInputMethod())
16235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    GetInputMethod()->OnCaretBoundsChanged(this);
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor RenderWidgetHostViewAura::GetCursor(const gfx::Point& point) {
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui::kCursorNone;
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return current_cursor_.GetNativeCursor();
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderWidgetHostViewAura::GetNonClientComponent(
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& point) const {
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HTCLIENT;
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::ShouldDescendIntoChildForEventHandling(
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* child,
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& location) {
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::CanFocus() {
1644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return popup_type_ == blink::WebPopupTypeNone;
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnCaptureLost() {
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->LostCapture();
1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_)
16505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    touch_editing_client_->EndTouchEditing(false);
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnPaint(gfx::Canvas* canvas) {
16540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // For non-opaque windows, we don't draw anything, since we depend on the
16550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // canvas coming from the compositor to already be initialized as
16560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // transparent.
16570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (window_->layer()->fills_bounds_opaquely())
16580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    canvas->DrawColor(SK_ColorWHITE);
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnDeviceScaleFactorChanged(
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float device_scale_factor) {
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateScreenInfo(window_);
16672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
16682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  const gfx::Display display = gfx::Screen::GetScreenFor(window_)->
16692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      GetDisplayNearestWindow(window_);
16702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DCHECK_EQ(device_scale_factor, display.device_scale_factor());
16712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  current_cursor_.SetDisplayInfo(display);
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostViewAura::OnWindowDestroying(aura::Window* window) {
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND parent = NULL;
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the tab was hidden and it's closed, host_->is_hidden would have been
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reset to false in RenderWidgetHostImpl::RendererExited.
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!window_->GetRootWindow() || host_->is_hidden()) {
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent = ui::GetHiddenWindow();
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent = window_->GetHost()->GetAcceleratedWidget();
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LPARAM lparam = reinterpret_cast<LPARAM>(this);
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnumChildWindows(parent, WindowDestroyingCallback, lparam);
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
168758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
168858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Make sure that the input method no longer references to this object before
168958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // this object is removed from the root window (i.e. this object loses access
169058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // to the input method).
169158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui::InputMethod* input_method = GetInputMethod();
169258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (input_method)
169358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    input_method->DetachTextInputClient(this);
169446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
169546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (overscroll_controller_)
169646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    overscroll_controller_->Reset();
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostViewAura::OnWindowDestroyed(aura::Window* window) {
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->ViewDestroyed();
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnWindowTargetVisibilityChanged(bool visible) {
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::HasHitTestMask() const {
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::GetHitTestMask(gfx::Path* mask) const {
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, ui::EventHandler implementation:
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnKeyEvent(ui::KeyEvent* event) {
1718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnKeyEvent");
1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (popup_child_host_view_ && popup_child_host_view_->NeedsInputGrab()) {
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_child_host_view_->OnKeyEvent(event);
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event->handled())
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to handle the Escape key for Pepper Flash.
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_fullscreen_ && event->key_code() == ui::VKEY_ESCAPE) {
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Focus the window we were created from.
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (host_tracker_.get() && !host_tracker_->windows().empty()) {
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::Window* host = *(host_tracker_->windows().begin());
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::FocusClient* client = aura::client::GetFocusClient(host);
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (client) {
17352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        // Calling host->Focus() may delete |this|. We create a local observer
17362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        // for that. In that case we exit without further access to any members.
17372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        aura::WindowTracker tracker;
17382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        aura::Window* window = window_;
17392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        tracker.Add(window);
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host->Focus();
17412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        if (!tracker.Contains(window)) {
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          event->SetHandled();
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          return;
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!in_shutdown_) {
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in_shutdown_ = true;
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_->Shutdown();
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
17525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (event->key_code() == ui::VKEY_RETURN) {
17535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Do not forward return key release events if no press event was handled.
17545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (event->type() == ui::ET_KEY_RELEASED && !accept_return_character_)
17555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
17565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Accept return key character events between press and release events.
1757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      accept_return_character_ = event->type() == ui::ET_KEY_PRESSED;
17585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We don't have to communicate with an input method here.
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!event->HasNativeEvent()) {
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NativeWebKeyboardEvent webkit_event(
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event->type(),
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          event->is_char(),
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          event->is_char() ? event->GetCharacter() : event->key_code(),
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event->flags(),
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ui::EventTimeForNow().InSecondsF());
1768e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ForwardKeyboardEvent(webkit_event);
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NativeWebKeyboardEvent webkit_event(event);
1771e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ForwardKeyboardEvent(webkit_event);
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnMouseEvent(ui::MouseEvent* event) {
1778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnMouseEvent");
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_) {
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::client::CursorClient* cursor_client =
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        aura::client::GetCursorClient(window_->GetRootWindow());
1786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(!cursor_client || !cursor_client->IsCursorVisible());
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (event->type() == ui::ET_MOUSEWHEEL) {
1789f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebMouseWheelEvent mouse_wheel_event =
1790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent*>(event));
1791868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (mouse_wheel_event.deltaX != 0 || mouse_wheel_event.deltaY != 0)
1792868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        host_->ForwardWheelEvent(mouse_wheel_event);
1793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return;
1794868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
1795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point center(gfx::Rect(window_->bounds().size()).CenterPoint());
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // If we receive non client mouse messages while we are in the locked state
17990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // it probably means that the mouse left the borders of our window and
18000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // needs to be moved back to the center.
18010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (event->flags() & ui::EF_IS_NON_CLIENT) {
18020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      synthetic_move_sent_ = true;
18030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      window_->MoveCursorTo(center);
18040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return;
18050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
18060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseEvent mouse_event = MakeWebMouseEvent(event);
18080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_move_to_center_event = (event->type() == ui::ET_MOUSE_MOVED ||
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event->type() == ui::ET_MOUSE_DRAGGED) &&
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mouse_event.x == center.x() && mouse_event.y == center.y();
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ModifyEventMovementAndCoords(&mouse_event);
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool should_not_forward = is_move_to_center_event && synthetic_move_sent_;
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (should_not_forward) {
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      synthetic_move_sent_ = false;
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Check if the mouse has reached the border and needs to be centered.
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ShouldMoveToCenter()) {
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        synthetic_move_sent_ = true;
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_->MoveCursorTo(center);
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Forward event to renderer.
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (CanRendererHandleEvent(event) &&
1826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          !(event->flags() & ui::EF_FROM_TOUCH)) {
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host_->ForwardMouseEvent(mouse_event);
1828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // Ensure that we get keyboard focus on mouse down as a plugin window
1829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // may have grabbed keyboard focus.
1830f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if (event->type() == ui::ET_MOUSE_PRESSED)
1831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          SetKeyboardFocus();
1832f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // As the overscroll is handled during scroll events from the trackpad, the
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RWHVA window is transformed by the overscroll controller. This transform
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // triggers a synthetic mouse-move event to be generated (by the aura
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RootWindow). But this event interferes with the overscroll gesture. So,
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ignore such synthetic mouse-move events if an overscroll gesture is in
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // progress.
184346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (overscroll_controller_ &&
184446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      overscroll_controller_->overscroll_mode() != OVERSCROLL_NONE &&
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event->flags() & ui::EF_IS_SYNTHESIZED &&
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (event->type() == ui::ET_MOUSE_ENTERED ||
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       event->type() == ui::ET_MOUSE_EXITED ||
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       event->type() == ui::ET_MOUSE_MOVED)) {
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->StopPropagation();
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() == ui::ET_MOUSEWHEEL) {
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We get mouse wheel/scroll messages even if we are not in the foreground.
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // So here we check if we have any owned popup windows in the foreground and
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // dismiss them.
1858a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    aura::WindowTreeHost* host = window_->GetHost();
1859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (host) {
1860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      HWND parent = host->GetAcceleratedWidget();
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HWND toplevel_hwnd = ::GetAncestor(parent, GA_ROOT);
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EnumThreadWindows(GetCurrentThreadId(),
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        DismissOwnedPopups,
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        reinterpret_cast<LPARAM>(toplevel_hwnd));
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseWheelEvent mouse_wheel_event =
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent*>(event));
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mouse_wheel_event.deltaX != 0 || mouse_wheel_event.deltaY != 0)
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_->ForwardWheelEvent(mouse_wheel_event);
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (CanRendererHandleEvent(event) &&
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             !(event->flags() & ui::EF_FROM_TOUCH)) {
1873f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseEvent mouse_event = MakeWebMouseEvent(event);
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ModifyEventMovementAndCoords(&mouse_event);
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->ForwardMouseEvent(mouse_event);
1876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Ensure that we get keyboard focus on mouse down as a plugin window may
1877f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // have grabbed keyboard focus.
1878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (event->type() == ui::ET_MOUSE_PRESSED)
1879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SetKeyboardFocus();
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->type()) {
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->SetCapture();
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Confirm existing composition text on mouse click events, to make sure
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the input caret won't be moved with an ongoing composition text.
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FinishImeCompositionSession();
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_RELEASED:
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->ReleaseCapture();
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Needed to propagate mouse event to |window_->parent()->delegate()|, but
18975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // note that it might be something other than a WebContentsViewAura instance.
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pkotwicz): Find a better way of doing this.
1899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // In fullscreen mode which is typically used by flash, don't forward
1900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the mouse events to the parent. The renderer and the plugin process
1901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // handle these events.
1902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!is_fullscreen_ && window_->parent()->delegate() &&
19035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !(event->flags() & ui::EF_FROM_TOUCH)) {
19045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    event->ConvertLocationToTarget(window_, window_->parent());
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->parent()->delegate()->OnMouseEvent(event);
19065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsXButtonUpEvent(event))
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->SetHandled();
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnScrollEvent(ui::ScrollEvent* event) {
1913868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnScrollEvent");
1914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
1915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event->type() == ui::ET_SCROLL) {
19185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_WIN)
19195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(ananta)
19205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Investigate if this is true for Windows 8 Metro ASH as well.
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event->finger_count() != 2)
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
19235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1924f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebGestureEvent gesture_event =
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        MakeWebGestureEventFlingCancel();
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->ForwardGestureEvent(gesture_event);
1927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseWheelEvent mouse_wheel_event =
19287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        MakeWebMouseWheelEvent(event);
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->ForwardWheelEvent(mouse_wheel_event);
19305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RecordAction(base::UserMetricsAction("TrackpadScroll"));
19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (event->type() == ui::ET_SCROLL_FLING_START ||
19327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)             event->type() == ui::ET_SCROLL_FLING_CANCEL) {
1933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebGestureEvent gesture_event =
19347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        MakeWebGestureEvent(event);
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->ForwardGestureEvent(gesture_event);
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event->type() == ui::ET_SCROLL_FLING_START)
19375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordAction(base::UserMetricsAction("TrackpadScrollFling"));
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnTouchEvent(ui::TouchEvent* event) {
1944868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnTouchEvent");
1945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the touch event first.
1949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebTouchPoint* point = UpdateWebTouchEventFromUIEvent(*event,
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                &touch_event_);
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forward the touch event only if a touch point was updated, and there's a
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // touch-event handler in the page, and no other touch-event is in the queue.
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is important to always consume the event if there is a touch-event
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handler in the page, or some touch-event is already in the queue, even if
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no point has been updated, to make sure that this event does not get
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // processed by the gesture recognizer before the events in the queue.
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host_->ShouldForwardTouchEvent())
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->StopPropagation();
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (point) {
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (host_->ShouldForwardTouchEvent())
19637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      host_->ForwardTouchEventWithLatencyInfo(touch_event_, *event->latency());
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateWebTouchEventAfterDispatch(&touch_event_, point);
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnGestureEvent(ui::GestureEvent* event) {
1969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnGestureEvent");
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((event->type() == ui::ET_GESTURE_PINCH_BEGIN ||
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->type() == ui::ET_GESTURE_PINCH_UPDATE ||
19725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event->type() == ui::ET_GESTURE_PINCH_END) && !pinch_zoom_enabled_) {
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->SetHandled();
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostDelegate* delegate = NULL;
1981a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host_->IsRenderView())
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate = RenderViewHost::From(host_)->GetDelegate();
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate && event->type() == ui::ET_GESTURE_BEGIN &&
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->details().touch_points() == 1) {
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->HandleGestureBegin();
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1989f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture = MakeWebGestureEvent(event);
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() == ui::ET_GESTURE_TAP_DOWN) {
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Webkit does not stop a fling-scroll on tap-down. So explicitly send an
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // event to stop any in-progress flings.
1993f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebGestureEvent fling_cancel = gesture;
1994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fling_cancel.type = blink::WebInputEvent::GestureFlingCancel;
199546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fling_cancel.sourceDevice = blink::WebGestureDeviceTouchscreen;
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->ForwardGestureEvent(fling_cancel);
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (gesture.type != blink::WebInputEvent::Undefined) {
2000eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    host_->ForwardGestureEventWithLatencyInfo(gesture, *event->latency());
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN ||
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event->type() == ui::ET_GESTURE_SCROLL_UPDATE ||
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event->type() == ui::ET_GESTURE_SCROLL_END) {
20055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordAction(base::UserMetricsAction("TouchscreenScroll"));
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (event->type() == ui::ET_SCROLL_FLING_START) {
20075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordAction(base::UserMetricsAction("TouchscreenScrollFling"));
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate && event->type() == ui::ET_GESTURE_END &&
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->details().touch_points() == 1) {
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->HandleGestureEnd();
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If a gesture is not processed by the webpage, then WebKit processes it
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (e.g. generates synthetic mouse events).
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, aura::client::ActivationDelegate implementation:
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostViewAura::ShouldActivate() const {
2025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
2026a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
2028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const ui::Event* event = host->dispatcher()->current_event();
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!event)
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_fullscreen_;
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostViewAura,
20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//     aura::client::ActivationChangeObserver implementation:
20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnWindowActivated(aura::Window* gained_active,
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 aura::Window* lost_active) {
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(window_ == gained_active || window_ == lost_active);
20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (window_ == gained_active) {
2042a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const ui::Event* event = window_->GetHost()->dispatcher()->current_event();
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event && PointerEventActivates(*event))
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->OnPointerEventActivate();
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// RenderWidgetHostViewAura, aura::client::CursorClientObserver implementation:
2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::OnCursorVisibilityChanged(bool is_visible) {
2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifyRendererOfCursorVisibilityState(is_visible);
2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostViewAura, aura::client::FocusChangeObserver implementation:
20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnWindowFocused(aura::Window* gained_focus,
20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               aura::Window* lost_focus) {
20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(window_ == gained_focus || window_ == lost_focus);
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (window_ == gained_focus) {
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We need to honor input bypass if the associated tab is does not want
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // input. This gives the current focused window a chance to be the text
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // input client and handle events.
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_->ignore_input_events())
20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->GotFocus();
20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->SetActive(true);
20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::InputMethod* input_method = GetInputMethod();
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (input_method) {
20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Ask the system-wide IME to send all TextInputClient messages to |this|
20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // object.
20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      input_method->SetFocusedTextInputClient(this);
20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->SetInputMethodActive(input_method->IsActive());
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Often the application can set focus to the view in response to a key
20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // down. However the following char event shouldn't be sent to the web
20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // page.
20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->SuppressNextCharEvents();
20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->SetInputMethodActive(false);
20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2085c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2086c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager();
2087c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (manager)
2088c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      manager->OnWindowFocused();
20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (window_ == lost_focus) {
20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->SetActive(false);
20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->Blur();
20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DetachFromInputMethod();
20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->SetInputMethodActive(false);
20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (touch_editing_client_)
20975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      touch_editing_client_->EndTouchEditing(false);
2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (overscroll_controller_)
210046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      overscroll_controller_->Cancel();
210146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager();
2103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (manager)
2104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      manager->OnWindowBlurred();
2105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If we lose the focus while fullscreen, close the window; Pepper Flash
2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // won't do it for us (unlike NPAPI Flash). However, we do not close the
2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // window if we lose the focus to a window on another display.
2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Screen* screen = gfx::Screen::GetScreenFor(window_);
2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool focusing_other_display =
2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gained_focus && screen->GetNumDisplays() > 1 &&
2112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        (screen->GetDisplayNearestWindow(window_).id() !=
2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         screen->GetDisplayNearestWindow(gained_focus).id());
2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (is_fullscreen_ && !in_shutdown_ && !focusing_other_display) {
2115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
2116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // On Windows, if we are switching to a non Aura Window on a different
2117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // screen we should not close the fullscreen window.
2118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (!gained_focus) {
2119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        POINT point = {0};
2120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ::GetCursorPos(&point);
2121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (screen->GetDisplayNearestWindow(window_).id() !=
2122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            screen->GetDisplayNearestPoint(gfx::Point(point)).id())
2123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          return;
2124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      }
2125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      in_shutdown_ = true;
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->Shutdown();
21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// RenderWidgetHostViewAura, aura::WindowTreeHostObserver implementation:
21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostViewAura::OnHostMoved(const aura::WindowTreeHost* host,
2136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           const gfx::Point& new_origin) {
2137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TRACE_EVENT1("ui", "RenderWidgetHostViewAura::OnHostMoved",
2138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)               "new_origin", new_origin.ToString());
2139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateScreenInfo(window_);
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, private:
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostViewAura::~RenderWidgetHostViewAura() {
2147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_)
2148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_editing_client_->OnViewDestroyed();
21495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_.reset();
21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_observer_.reset();
2152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (window_->GetHost())
2153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    window_->GetHost()->RemoveObserver(this);
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnlockMouse();
21551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (popup_parent_host_view_) {
21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(popup_parent_host_view_->popup_child_host_view_ == NULL ||
21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           popup_parent_host_view_->popup_child_host_view_ == this);
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    popup_parent_host_view_->popup_child_host_view_ = NULL;
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (popup_child_host_view_) {
21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(popup_child_host_view_->popup_parent_host_view_ == NULL ||
21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           popup_child_host_view_->popup_parent_host_view_ == this);
21632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_child_host_view_->popup_parent_host_view_ = NULL;
21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  event_filter_for_popup_exit_.reset();
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetTooltipText(window_, NULL);
21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Screen::GetScreenFor(window_)->RemoveObserver(this);
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This call is usually no-op since |this| object is already removed from the
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Aura root window and we don't have a way to get an input method object
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // associated with the window, but just in case.
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DetachFromInputMethod();
21734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
21755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  legacy_render_widget_host_HWND_.reset(NULL);
2176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() {
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point screen_point =
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
21821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!root_window)
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Point root_window_point = screen_point;
21875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::client::ScreenPositionClient* screen_position_client =
21885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::client::GetScreenPositionClient(root_window);
21895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (screen_position_client) {
21905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    screen_position_client->ConvertPointFromScreen(
21915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        root_window, &root_window_point);
21925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (root_window->GetEventHandlerForPoint(root_window_point) != window_)
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeCursor cursor = current_cursor_.GetNativeCursor();
21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do not show loading cursor when the cursor is currently hidden.
21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_loading_ && cursor != ui::kCursorNone)
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor = ui::kCursorPointer;
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::CursorClient* cursor_client =
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::client::GetCursorClient(root_window);
22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cursor_client) {
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor_client->SetCursor(cursor);
22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::InputMethod* RenderWidgetHostViewAura::GetInputMethod() const {
22101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!root_window)
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_window->GetProperty(aura::client::kRootWindowInputMethodKey);
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::NeedsInputGrab() {
2217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return popup_type_ == blink::WebPopupTypeSelect;
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::FinishImeCompositionSession() {
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!has_composition_text_)
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (host_) {
2224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    host_->ImeConfirmComposition(base::string16(), gfx::Range::InvalidRange(),
2225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 false);
2226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImeCancelComposition();
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ModifyEventMovementAndCoords(
2231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseEvent* event) {
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the mouse has just entered, we must report zero movementX/Y. Hence we
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reset any global_mouse_position set previously.
2234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (event->type == blink::WebInputEvent::MouseEnter ||
2235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      event->type == blink::WebInputEvent::MouseLeave)
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global_mouse_position_.SetPoint(event->globalX, event->globalY);
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Movement is computed by taking the difference of the new cursor position
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the previous. Under mouse lock the cursor will be warped back to the
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // center so that we are not limited by clipping boundaries.
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do not measure movement as the delta from cursor to center because
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we may receive more mouse movement events before our warp has taken
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // effect.
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->movementX = event->globalX - global_mouse_position_.x();
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->movementY = event->globalY - global_mouse_position_.y();
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global_mouse_position_.SetPoint(event->globalX, event->globalY);
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Under mouse lock, coordinates of mouse are locked to what they were when
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mouse lock was entered.
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_) {
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->x = unlocked_mouse_position_.x();
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->y = unlocked_mouse_position_.y();
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->windowX = unlocked_mouse_position_.x();
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->windowY = unlocked_mouse_position_.y();
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->globalX = unlocked_global_mouse_position_.x();
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->globalY = unlocked_global_mouse_position_.y();
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unlocked_mouse_position_.SetPoint(event->windowX, event->windowY);
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unlocked_global_mouse_position_.SetPoint(event->globalX, event->globalY);
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::NotifyRendererOfCursorVisibilityState(
2265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool is_visible) {
2266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (host_->is_hidden() ||
2267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (cursor_visibility_state_in_renderer_ == VISIBLE && is_visible) ||
2268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (cursor_visibility_state_in_renderer_ == NOT_VISIBLE && !is_visible))
2269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  cursor_visibility_state_in_renderer_ = is_visible ? VISIBLE : NOT_VISIBLE;
2272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_->SendCursorVisibilityState(is_visible);
2273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
227546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void RenderWidgetHostViewAura::SetOverscrollControllerEnabled(bool enabled) {
227646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!enabled)
227746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    overscroll_controller_.reset();
227846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  else if (!overscroll_controller_)
227946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    overscroll_controller_.reset(new OverscrollController());
228046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
228146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SchedulePaintIfNotInClip(
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& clip) {
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!clip.IsEmpty()) {
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect to_paint = gfx::SubtractRects(rect, clip);
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!to_paint.IsEmpty())
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->SchedulePaintInRect(to_paint);
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SchedulePaintInRect(rect);
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::ShouldMoveToCenter() {
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect = window_->bounds();
2296b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  rect = ConvertRectToScreen(rect);
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int border_x = rect.width() * kMouseLockBorderPercentage / 100;
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int border_y = rect.height() * kMouseLockBorderPercentage / 100;
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return global_mouse_position_.x() < rect.x() + border_x ||
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      global_mouse_position_.x() > rect.right() - border_x ||
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      global_mouse_position_.y() < rect.y() + border_y ||
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      global_mouse_position_.y() > rect.bottom() - border_y;
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::AddedToRootWindow() {
2307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_->GetHost()->AddObserver(this);
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateScreenInfo(window_);
2309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::client::CursorClient* cursor_client =
2311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      aura::client::GetCursorClient(window_->GetRootWindow());
2312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client) {
2313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->AddObserver(this);
2314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible());
2315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (HasFocus()) {
2317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::InputMethod* input_method = GetInputMethod();
2318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (input_method)
2319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      input_method->SetFocusedTextInputClient(this);
2320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
23215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
23225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
23235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The parent may have changed here. Ensure that the legacy window is
23245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // reparented accordingly.
23255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
23265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->UpdateParent(
23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        reinterpret_cast<HWND>(GetNativeViewId()));
23285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
23295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->AddedToWindow();
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::RemovingFromRootWindow() {
2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::client::CursorClient* cursor_client =
2335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      aura::client::GetCursorClient(window_->GetRootWindow());
2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client)
2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->RemoveObserver(this);
2338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DetachFromInputMethod();
2340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_->GetHost()->RemoveObserver(this);
2342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegated_frame_host_->RemovingFromWindow();
23435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
23445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
23455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Update the legacy window's parent temporarily to the desktop window. It
23465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // will eventually get reparented to the right root.
23475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
23485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->UpdateParent(::GetDesktopWindow());
23495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::DetachFromInputMethod() {
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::InputMethod* input_method = GetInputMethod();
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (input_method && input_method->GetTextInputClient() == this)
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_method->SetFocusedTextInputClient(NULL);
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2358e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid RenderWidgetHostViewAura::ForwardKeyboardEvent(
2359e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const NativeWebKeyboardEvent& event) {
2360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
2361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ui::TextEditKeyBindingsDelegateAuraLinux* keybinding_delegate =
2362e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ui::GetTextEditKeyBindingsDelegate();
2363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::vector<ui::TextEditCommandAuraLinux> commands;
2364e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!event.skip_in_browser &&
2365e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      keybinding_delegate &&
2366e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      event.os_event &&
2367e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      keybinding_delegate->MatchEvent(*event.os_event, &commands)) {
2368e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // Transform from ui/ types to content/ types.
2369e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    EditCommands edit_commands;
2370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (std::vector<ui::TextEditCommandAuraLinux>::const_iterator it =
2371e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch             commands.begin(); it != commands.end(); ++it) {
2372e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      edit_commands.push_back(EditCommand(it->GetCommandString(),
2373e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                          it->argument()));
2374e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
2375e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    host_->Send(new InputMsg_SetEditCommandsForNextKeyEvent(
2376e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        host_->GetRoutingID(), edit_commands));
2377e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    NativeWebKeyboardEvent copy_event(event);
2378e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    copy_event.match_edit_command = true;
2379e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    host_->ForwardKeyboardEvent(copy_event);
2380e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
2381e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
2382e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif
2383e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2384e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  host_->ForwardKeyboardEvent(event);
2385e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
2386e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)SkBitmap::Config RenderWidgetHostViewAura::PreferredReadbackFormat() {
2388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return SkBitmap::kARGB_8888_Config;
23895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
23905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// DelegatedFrameHost, public:
2393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ui::Compositor* RenderWidgetHostViewAura::GetCompositor() const {
2395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
2396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return host ? host->compositor() : NULL;
23975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
23985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ui::Layer* RenderWidgetHostViewAura::GetLayer() {
2400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return window_->layer();
2401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)RenderWidgetHostImpl* RenderWidgetHostViewAura::GetHost() {
2404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return host_;
2405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RenderWidgetHostViewAura::SchedulePaintInRect(
2408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const gfx::Rect& damage_rect_in_dip) {
2409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  window_->SchedulePaintInRect(damage_rect_in_dip);
2410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
2411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool RenderWidgetHostViewAura::IsVisible() {
2413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return IsShowing();
2414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Size RenderWidgetHostViewAura::DesiredFrameSize() {
2417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return window_->bounds().size();
2418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)float RenderWidgetHostViewAura::CurrentDeviceScaleFactor() {
2421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return current_device_scale_factor_;
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Size RenderWidgetHostViewAura::ConvertViewSizeToPixel(
2425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const gfx::Size& size) {
2426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return content::ConvertViewSizeToPixel(this, size);
2427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)scoped_ptr<ResizeLock> RenderWidgetHostViewAura::CreateResizeLock(
2430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bool defer_compositor_lock) {
2431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Size desired_size = window_->bounds().size();
2432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return scoped_ptr<ResizeLock>(new CompositorResizeLock(
2433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      window_->GetHost(),
2434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      desired_size,
2435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      defer_compositor_lock,
2436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(kResizeLockTimeoutMs)));
2437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DelegatedFrameHost* RenderWidgetHostViewAura::GetDelegatedFrameHost() const {
2440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return delegated_frame_host_.get();
2441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// RenderWidgetHostViewBase, public:
2445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RenderWidgetHostViewBase::GetDefaultScreenInfo(WebScreenInfo* results) {
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetScreenInfoForWindow(results, NULL);
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2452