render_widget_host_view_aura.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
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"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (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"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_provider.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame_ack.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/output/copy_output_request.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/output/copy_output_result.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/resources/texture_mailbox.h"
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "cc/trees/layer_tree_settings.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_manager.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_state_impl.h"
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/frame_host/frame_tree.h"
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/frame_host/frame_tree_node.h"
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/frame_host/render_frame_host_impl.h"
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/browser/gpu/compositor_util.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/compositor_resize_lock_aura.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/dip_util.h"
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/renderer_host/input/synthetic_gesture_target_aura.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/overscroll_controller.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_delegate.h"
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/renderer_host/render_view_host_impl.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/ui_events_helper.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/web_input_event_aura.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/gl_helper.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_messages.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/port/browser/render_widget_host_view_frame_subscriber.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_widget_host_view_port.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/content_browser_client.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/video_util.h"
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "skia/ext/image_operations.h"
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebScreenInfo.h"
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/cursor_client.h"
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/client/cursor_client_observer.h"
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/focus_client.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/screen_position_client.h"
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/client/window_tree_client.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_observer.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_tracker.h"
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/scoped_clipboard_writer.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ime/input_method.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_types.h"
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/compositor/compositor_vsync_manager.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h"
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/gestures/gesture_recognizer.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h"
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_client.h"
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/scoped_tooltip_disabler.h"
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/tooltip_client.h"
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/transient_window_client.h"
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/wm/public/window_types.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_manager_win.h"
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_win.h"
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/legacy_render_widget_host_win.h"
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/plugin_constants_win.h"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/hidden_window.h"
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/gdi_util.h"
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/win/dpi.h"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/common/input_messages.h"
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/linux/text_edit_command_auralinux.h"
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h"
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using gfx::RectToSkIRect;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using gfx::SkIRectToRect;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebScreenInfo;
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In mouse lock mode, we need to prevent the (invisible) cursor from hitting
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the border of the view, in order to get valid movement information. However,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forcing the cursor back to the center of the view after each mouse move
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// doesn't work well. It reduces the frequency of useful mouse move messages
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// significantly. Therefore, we move the cursor to the center of the view only
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if it approaches the border. |kMouseLockBorderPercentage| specifies the width
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the border area, in percentage of the corresponding dimension.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMouseLockBorderPercentage = 15;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When accelerated compositing is enabled and a widget resize is pending,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we delay further resizes of the UI. The following constant is the maximum
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// length of time that we should delay further UI resizes while waiting for a
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resized frame from a renderer.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kResizeLockTimeoutMs = 67;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to associate a plugin HWND with its RenderWidgetHostViewAura instance.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kWidgetOwnerProperty[] = L"RenderWidgetHostViewAuraOwner";
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL CALLBACK WindowDestroyingCallback(HWND window, LPARAM param) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* widget =
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<RenderWidgetHostViewAura*>(param);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == widget) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Properties set on HWNDs must be removed to avoid leaks.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RemoveProp(window, kWidgetOwnerProperty);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostViewBase::DetachPluginWindowsCallback(window);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL CALLBACK HideWindowsCallback(HWND window, LPARAM param) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* widget =
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<RenderWidgetHostViewAura*>(param);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == widget)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetParent(window, ui::GetHiddenWindow());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL CALLBACK ShowWindowsCallback(HWND window, LPARAM param) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* widget =
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<RenderWidgetHostViewAura*>(param);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == widget &&
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      widget->GetNativeView()->GetHost()) {
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    HWND parent = widget->GetNativeView()->GetHost()->GetAcceleratedWidget();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetParent(window, parent);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return TRUE;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct CutoutRectsParams {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* widget;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<gfx::Rect> cutout_rects;
165ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<HWND, WebPluginGeometry>* geometry;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Used to update the region for the windowed plugin to draw in. We start with
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the clip rect from the renderer, then remove the cutout rects from the
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// renderer, and then remove the transient windows from the root window and the
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// constrained windows from the parent window.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BOOL CALLBACK SetCutoutRectsCallback(HWND window, LPARAM param) {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CutoutRectsParams* params = reinterpret_cast<CutoutRectsParams*>(param);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetProp(window, kWidgetOwnerProperty) == params->widget) {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // First calculate the offset of this plugin from the root window, since
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the cutouts are relative to the root window.
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    HWND parent =
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        params->widget->GetNativeView()->GetHost()->GetAcceleratedWidget();
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    POINT offset;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    offset.x = offset.y = 0;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MapWindowPoints(window, parent, &offset, 1);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Now get the cached clip rect and cutouts for this plugin window that came
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // from the renderer.
186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    std::map<HWND, WebPluginGeometry>::iterator i = params->geometry->begin();
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    while (i != params->geometry->end() &&
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i->second.window != window &&
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           GetParent(i->second.window) != window) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++i;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i == params->geometry->end()) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return TRUE;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HRGN hrgn = CreateRectRgn(i->second.clip_rect.x(),
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              i->second.clip_rect.y(),
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              i->second.clip_rect.right(),
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              i->second.clip_rect.bottom());
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We start with the cutout rects that came from the renderer, then add the
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ones that came from transient and constrained windows.
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<gfx::Rect> cutout_rects = i->second.cutout_rects;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < params->cutout_rects.size(); ++i) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect offset_cutout = params->cutout_rects[i];
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offset_cutout.Offset(-offset.x, -offset.y);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cutout_rects.push_back(offset_cutout);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::SubtractRectanglesFromRegion(hrgn, cutout_rects);
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // If we don't have any cutout rects then no point in messing with the
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // window region.
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (cutout_rects.size())
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SetWindowRgn(window, hrgn, TRUE);
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return TRUE;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A callback function for EnumThreadWindows to enumerate and dismiss
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// any owned popup windows.
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BOOL CALLBACK DismissOwnedPopups(HWND window, LPARAM arg) {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const HWND toplevel_hwnd = reinterpret_cast<HWND>(arg);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (::IsWindowVisible(window)) {
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const HWND owner = ::GetWindow(window, GW_OWNER);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (toplevel_hwnd == owner) {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ::PostMessage(window, WM_CANCELMODE, 0, 0);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void UpdateWebTouchEventAfterDispatch(blink::WebTouchEvent* event,
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                      blink::WebTouchPoint* point) {
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (point->state != blink::WebTouchPoint::StateReleased &&
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      point->state != blink::WebTouchPoint::StateCancelled)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --event->touchesLength;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned i = point - event->touches;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i < event->touchesLength;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++i) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->touches[i] = event->touches[i + 1];
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CanRendererHandleEvent(const ui::MouseEvent* event) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() == ui::ET_MOUSE_CAPTURE_CHANGED)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Renderer cannot handle WM_XBUTTON or NC events.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->native_event().message) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_XBUTTONDOWN:
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_XBUTTONUP:
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_XBUTTONDBLCLK:
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_NCMOUSELEAVE:
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_NCMOUSEMOVE:
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCLBUTTONDOWN:
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCLBUTTONUP:
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCLBUTTONDBLCLK:
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCRBUTTONDOWN:
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCRBUTTONUP:
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCRBUTTONDBLCLK:
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCMBUTTONDOWN:
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCMBUTTONUP:
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WM_NCMBUTTONDBLCLK:
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_NCXBUTTONDOWN:
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_NCXBUTTONUP:
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_NCXBUTTONDBLCLK:
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#elif defined(USE_X11)
27723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Renderer only supports standard mouse buttons, so ignore programmable
27823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // buttons.
27923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  switch (event->type()) {
28023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
28123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case ui::ET_MOUSE_RELEASED:
28223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return event->IsAnyButton();
28323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    default:
28423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      break;
28523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We don't mark these as handled so that they're sent back to the
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DefWindowProc so it can generate WM_APPCOMMAND as necessary.
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsXButtonUpEvent(const ui::MouseEvent* event) {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (event->native_event().message) {
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_XBUTTONUP:
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WM_NCXBUTTONUP:
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetScreenInfoForWindow(WebScreenInfo* results, aura::Window* window) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Display display = window ?
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(window)->GetDisplayNearestWindow(window) :
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(window)->GetPrimaryDisplay();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->rect = display.bounds();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->availableRect = display.work_area();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(derat|oshima): Don't hardcode this. Get this from display object.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->depth = 24;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results->depthPerComponent = 8;
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results->deviceScaleFactor = display.device_scale_factor();
3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  results->orientationAngle = display.RotationAsDegree();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PointerEventActivates(const ui::Event& event) {
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.type() == ui::ET_MOUSE_PRESSED)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.type() == ui::ET_GESTURE_BEGIN) {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ui::GestureEvent& gesture =
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<const ui::GestureEvent&>(event);
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gesture.details().touch_points() == 1;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We need to watch for mouse events outside a Web Popup or its parent
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and dismiss the popup for certain events.
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RenderWidgetHostViewAura::EventFilterForPopupExit
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public ui::EventHandler {
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit EventFilterForPopupExit(RenderWidgetHostViewAura* rwhva)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : rwhva_(rwhva) {
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(rwhva_);
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::Env::GetInstance()->AddPreTargetHandler(this);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~EventFilterForPopupExit() {
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::Env::GetInstance()->RemovePreTargetHandler(this);
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ui::EventHandler
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rwhva_->ApplyEventFilterForPopupExit(event);
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rwhva_->ApplyEventFilterForPopupExit(event);
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* rwhva_;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EventFilterForPopupExit);
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::ApplyEventFilterForPopupExit(
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::LocatedEvent* event) {
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (in_shutdown_ || is_fullscreen_ || !event->target())
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (event->type() != ui::ET_MOUSE_PRESSED &&
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event->type() != ui::ET_TOUCH_PRESSED) {
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = static_cast<aura::Window*>(event->target());
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (target != window_ &&
373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      (!popup_parent_host_view_ ||
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)       target != popup_parent_host_view_->window_)) {
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Note: popup_parent_host_view_ may be NULL when there are multiple
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // popup children per view. See: RenderWidgetHostViewAura::InitAsPopup().
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    in_shutdown_ = true;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->Shutdown();
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We have to implement the WindowObserver interface on a separate object
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// because clang doesn't like implementing multiple interfaces that have
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// methods with the same name. This object is owned by the
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHostViewAura::WindowObserver : public aura::WindowObserver {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit WindowObserver(RenderWidgetHostViewAura* view)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : view_(view) {
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->AddObserver(this);
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~WindowObserver() {
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->RemoveObserver(this);
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::WindowObserver:
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowAddedToRootWindow(aura::Window* window) OVERRIDE {
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window == view_->window_)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->AddedToRootWindow();
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowRemovingFromRootWindow(aura::Window* window,
404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                              aura::Window* new_root) OVERRIDE {
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window == view_->window_)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->RemovingFromRootWindow();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAura* view_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WindowObserver);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, public:
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : host_(RenderWidgetHostImpl::From(host)),
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      window_(new aura::Window(this)),
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in_shutdown_(false),
422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      in_bounds_changed_(false),
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_fullscreen_(false),
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_parent_host_view_(NULL),
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_child_host_view_(NULL),
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_loading_(false),
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT),
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      can_compose_inline_(true),
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_composition_text_(false),
431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      accept_return_character_(false),
43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      last_output_surface_id_(0),
4338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      pending_delegated_ack_count_(0),
434d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      skipped_frames_(false),
435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      last_swapped_software_frame_scale_factor_(1.f),
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      paint_canvas_(NULL),
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      synthetic_move_sent_(false),
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      can_lock_compositor_(YES),
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cursor_visibility_state_in_renderer_(UNKNOWN),
4401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      touch_editing_client_(NULL),
4411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      delegated_frame_evictor_(new DelegatedFrameEvictor(this)),
4421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      weak_ptr_factory_(this) {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetView(this);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_observer_.reset(new WindowObserver(this));
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetTooltipText(window_, &tooltip_);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetActivationDelegate(window_, this);
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::SetActivationChangeObserver(window_, this);
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::SetFocusChangeObserver(window_, this);
449effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  window_->set_layer_owner_delegate(this);
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Screen::GetScreenFor(window_)->AddObserver(this);
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ImageTransportFactory::GetInstance()->AddObserver(this);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, RenderWidgetHostView implementation:
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool RenderWidgetHostViewAura::OnMessageReceived(
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const IPC::Message& message) {
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool handled = true;
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAura, message)
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(kevers): Move to RenderWidgetHostViewImpl and consolidate IPC
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // messages for TextInput<State|Type>Changed. Corresponding code in
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // RenderWidgetHostViewAndroid should also be moved at the same time.
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_TextInputStateChanged,
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnTextInputStateChanged)
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return handled;
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::InitAsChild(
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::NativeView parent_view) {
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetType(ui::wm::WINDOW_TYPE_CONTROL);
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Init(aura::WINDOW_LAYER_TEXTURED);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetName("RenderWidgetHostViewAura");
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::InitAsPopup(
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostView* parent_host_view,
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect& bounds_in_screen) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_parent_host_view_ =
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<RenderWidgetHostViewAura*>(parent_host_view);
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TransientWindowClient may be NULL during tests.
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::client::TransientWindowClient* transient_window_client =
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::client::GetTransientWindowClient();
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* old_child =
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      popup_parent_host_view_->popup_child_host_view_;
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (old_child) {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(jhorwich): Allow multiple popup_child_host_view_ per view, or
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // similar mechanism to ensure a second popup doesn't cause the first one
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // to never get a chance to filter events. See crbug.com/160589.
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(old_child->popup_parent_host_view_ == popup_parent_host_view_);
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (transient_window_client) {
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      transient_window_client->RemoveTransientChild(
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        popup_parent_host_view_->window_, old_child->window_);
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    old_child->popup_parent_host_view_ = NULL;
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_parent_host_view_->popup_child_host_view_ = this;
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetType(ui::wm::WINDOW_TYPE_MENU);
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Init(aura::WINDOW_LAYER_TEXTURED);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetName("RenderWidgetHostViewAura");
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = popup_parent_host_view_->window_->GetRootWindow();
5061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::client::ParentWindowWithContext(window_, root, bounds_in_screen);
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Setting the transient child allows for the popup to get mouse events when
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in a system modal dialog.
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This fixes crbug.com/328593.
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (transient_window_client) {
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    transient_window_client->AddTransientChild(
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        popup_parent_host_view_->window_, window_);
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetBounds(bounds_in_screen);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Show();
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_WIN) && !defined(OS_CHROMEOS)
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (NeedsInputGrab())
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window_->SetCapture();
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  event_filter_for_popup_exit_.reset(new EventFilterForPopupExit(this));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::InitAsFullscreen(
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostView* reference_host_view) {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_fullscreen_ = true;
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetType(ui::wm::WINDOW_TYPE_NORMAL);
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Init(aura::WINDOW_LAYER_TEXTURED);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetName("RenderWidgetHostViewAura");
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* parent = NULL;
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reference_host_view) {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* reference_window =
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<RenderWidgetHostViewAura*>(reference_host_view)->window_;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reference_window) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_tracker_.reset(new aura::WindowTracker);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_tracker_->Add(reference_window);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Display display = gfx::Screen::GetScreenFor(window_)->
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetDisplayNearestWindow(reference_window);
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent = reference_window->GetRootWindow();
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds = display.bounds();
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::client::ParentWindowWithContext(window_, parent, bounds);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Show();
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Focus();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHost* RenderWidgetHostViewAura::GetRenderWidgetHost() const {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::WasShown() {
55768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(host_);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_->is_hidden())
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasShown();
5611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  delegated_frame_evictor_->SetVisible(true);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = window_->GetRootWindow();
56468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (root) {
56568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    aura::client::CursorClient* cursor_client =
56668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        aura::client::GetCursorClient(root);
56768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (cursor_client)
56868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible());
56968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (host_->is_accelerated_compositing_active() &&
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !released_front_lock_.get()) {
57368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ui::Compositor* compositor = GetCompositor();
57468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (compositor)
57568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      released_front_lock_ = compositor->GetCompositorLock();
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_) {
5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Reparent the legacy Chrome_RenderWidgetHostHWND window to the parent
5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // window before reparenting any plugins. This ensures that the plugin
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // windows stay on top of the child Zorder in the parent and receive
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // mouse events, etc.
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->UpdateParent(
585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        GetNativeView()->GetHost()->GetAcceleratedWidget());
5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->SetBounds(
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_->GetBoundsInRootWindow());
5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LPARAM lparam = reinterpret_cast<LPARAM>(this);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::WasHidden() {
59568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!host_ || host_->is_hidden())
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasHidden();
5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  delegated_frame_evictor_->SetVisible(false);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  released_front_lock_ = NULL;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  constrained_rects_.clear();
603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host) {
605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    HWND parent = host->GetAcceleratedWidget();
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LPARAM lparam = reinterpret_cast<LPARAM>(this);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnumChildWindows(parent, HideWindowsCallback, lparam);
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // We reparent the legacy Chrome_RenderWidgetHostHWND window to the global
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // hidden window on the same lines as Windowed plugin windows.
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (legacy_render_widget_host_HWND_)
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      legacy_render_widget_host_HWND_->UpdateParent(ui::GetHiddenWindow());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetSize(const gfx::Size& size) {
6171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // For a SetSize operation, we don't care what coordinate system the origin
6181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // of the window is in, it's only important to make sure that the origin
6191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // remains constant after the operation.
6201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InternalSetBounds(gfx::Rect(window_->bounds().origin(), size));
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetBounds(const gfx::Rect& rect) {
6241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Point relative_origin(rect.origin());
625a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
6261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // RenderWidgetHostViewAura::SetBounds() takes screen coordinates, but
6271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Window::SetBounds() takes parent coordinates, so do the conversion here.
6281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = window_->GetRootWindow();
6291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (root) {
6301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::client::ScreenPositionClient* screen_position_client =
6311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        aura::client::GetScreenPositionClient(root);
6321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (screen_position_client) {
6331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      screen_position_client->ConvertPointFromScreen(
6341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          window_->parent(), &relative_origin);
6351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
6371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InternalSetBounds(gfx::Rect(relative_origin, rect.size()));
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::MaybeCreateResizeLock() {
642d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!ShouldCreateResizeLock())
643d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(window_->GetHost());
645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(window_->GetHost()->compositor());
646d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
647d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Listen to changes in the compositor lock state.
648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ui::Compositor* compositor = window_->GetHost()->compositor();
649d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!compositor->HasObserver(this))
650d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    compositor->AddObserver(this);
651d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
652d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool defer_compositor_lock =
653d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      can_lock_compositor_ == NO_PENDING_RENDERER_FRAME ||
654d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      can_lock_compositor_ == NO_PENDING_COMMIT;
655d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
656d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (can_lock_compositor_ == YES)
657d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    can_lock_compositor_ = YES_DID_LOCK;
658d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
659d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  resize_lock_ = CreateResizeLock(defer_compositor_lock);
660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
662d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool RenderWidgetHostViewAura::ShouldCreateResizeLock() {
663d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // On Windows while resizing, the the resize locks makes us mis-paint a white
664d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // vertical strip (including the non-client area) if the content composition
665d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // is lagging the UI composition. So here we disable the throttling so that
666d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // the UI bits can draw ahead of the content thereby reducing the amount of
667d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // whiteout. Because this causes the content to be drawn at wrong sizes while
668d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // resizing we compensate by blocking the UI thread in Compositor::Draw() by
669d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // issuing a FinishAllRendering() if we are resizing.
67023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(OS_WIN)
671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return false;
67223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#else
673d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (resize_lock_)
674d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
675d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
676d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (host_->should_auto_resize())
677d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
678d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!host_->is_accelerated_compositing_active())
679d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
680d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
681d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::Size desired_size = window_->bounds().size();
682c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (desired_size == current_frame_size_in_dip_)
683d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
684d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
687d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
688d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ui::Compositor* compositor = host->compositor();
690d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!compositor)
691d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
692d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
693d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return true;
69423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif
695d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
696d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
697d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)scoped_ptr<ResizeLock> RenderWidgetHostViewAura::CreateResizeLock(
698d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    bool defer_compositor_lock) {
699d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::Size desired_size = window_->bounds().size();
700d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return scoped_ptr<ResizeLock>(new CompositorResizeLock(
70123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      window_->GetHost(),
702d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      desired_size,
703d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      defer_compositor_lock,
704d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(kResizeLockTimeoutMs)));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::RequestCopyOfOutput(
7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<cc::CopyOutputRequest> request) {
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->layer()->RequestCopyOfOutput(request.Pass());
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView RenderWidgetHostViewAura::GetNativeView() const {
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_;
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeViewId RenderWidgetHostViewAura::GetNativeViewId() const {
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host)
720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return reinterpret_cast<gfx::NativeViewId>(host->GetAcceleratedWidget());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<gfx::NativeViewId>(NULL);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeViewAccessible RenderWidgetHostViewAura::GetNativeViewAccessible() {
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return static_cast<gfx::NativeViewAccessible>(NULL);
730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HWND hwnd = host->GetAcceleratedWidget();
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBrowserAccessibilityManagerIfNeeded();
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager();
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (manager)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return manager->GetRoot()->ToBrowserAccessibilityWin();
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<gfx::NativeViewAccessible>(NULL);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::SetKeyboardFocus() {
743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (CanFocus()) {
745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    aura::WindowTreeHost* host = window_->GetHost();
746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (host)
747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ::SetFocus(host->GetAcceleratedWidget());
748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
752effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochRenderFrameHostImpl* RenderWidgetHostViewAura::GetFocusedFrame() {
753effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!host_->IsRenderView())
754effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
755effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderViewHost* rvh = RenderViewHost::From(host_);
756effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FrameTreeNode* focused_frame =
757effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      rvh->GetDelegate()->GetFrameTree()->GetFocusedFrame();
758effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!focused_frame)
759effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
760effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return focused_frame->current_frame_host();
762effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
763effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::MovePluginWindows(
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Vector2d& scroll_offset,
766ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const std::vector<WebPluginGeometry>& plugin_window_moves) {
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to clip the rectangle to the tab's viewport, otherwise we will draw
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // over the browser UI.
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!window_->GetRootWindow()) {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(plugin_window_moves.empty());
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HWND parent = window_->GetHost()->GetAcceleratedWidget();
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect view_bounds = window_->GetBoundsInRootWindow();
776ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::vector<WebPluginGeometry> moves = plugin_window_moves;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect view_port(scroll_offset.x(), scroll_offset.y(), view_bounds.width(),
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      view_bounds.height());
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < moves.size(); ++i) {
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect clip(moves[i].clip_rect);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector2d view_port_offset(
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        moves[i].window_rect.OffsetFromOrigin() + scroll_offset);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    clip.Offset(view_port_offset);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    clip.Intersect(view_port);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    clip.Offset(-view_port_offset);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    moves[i].clip_rect = clip;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    moves[i].window_rect.Offset(view_bounds.OffsetFromOrigin());
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    plugin_window_moves_[moves[i].window] = moves[i];
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // constrained_rects_ are relative to the root window. We want to convert
795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // them to be relative to the plugin window.
796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (size_t j = 0; j < constrained_rects_.size(); ++j) {
797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Rect offset_cutout = constrained_rects_[j];
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offset_cutout -= moves[i].window_rect.OffsetFromOrigin();
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      moves[i].cutout_rects.push_back(offset_cutout);
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MovePluginWindowsHelper(parent, moves);
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure each plugin window (or its wrapper if it exists) has a pointer to
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |this|.
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < moves.size(); ++i) {
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HWND window = moves[i].window;
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (GetParent(window) != parent) {
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window = GetParent(window);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!GetProp(window, kWidgetOwnerProperty))
8133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      SetProp(window, kWidgetOwnerProperty, this);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Focus() {
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure we have a FocusClient before attempting to Focus(). In some
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // situations we may not yet be in a valid Window hierarchy (such as reloading
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // after out of memory discarded the tab).
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::FocusClient* client = aura::client::GetFocusClient(window_);
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (client)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->Focus();
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Blur() {
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->Blur();
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::HasFocus() const {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_->HasFocus();
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::IsSurfaceAvailableForCopy() const {
8360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return CanCopyToBitmap();
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Show() {
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->Show();
84168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  WasShown();
8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->Show();
8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Hide() {
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->Hide();
85068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  WasHidden();
8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->Hide();
8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::IsShowing() {
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_->IsVisible();
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::GetViewBounds() const {
862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This is the size that we want the renderer to produce. While we're waiting
863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // for the correct frame (i.e. during a resize), don't change the size so that
864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // we don't pipeline more resizes than we can handle.
865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect bounds(window_->GetBoundsInScreen());
866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (resize_lock_.get())
867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return gfx::Rect(bounds.origin(), resize_lock_->expected_size());
868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return bounds;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::SetBackground(const SkBitmap& background) {
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewBase::SetBackground(background);
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetBackground(background);
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->layer()->SetFillsBoundsOpaquely(background.isOpaque());
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::UpdateCursor(const WebCursor& cursor) {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_cursor_ = cursor;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Display display = gfx::Screen::GetScreenFor(window_)->
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDisplayNearestWindow(window_);
8822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  current_cursor_.SetDisplayInfo(display);
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursorIfOverSelf();
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetIsLoading(bool is_loading) {
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_loading_ = is_loading;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursorIfOverSelf();
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostViewAura::TextInputTypeChanged(
8927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ui::TextInputType type,
89358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ui::TextInputMode input_mode,
89458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool can_compose_inline) {
8957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (text_input_type_ != type ||
89658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      text_input_mode_ != input_mode ||
8977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      can_compose_inline_ != can_compose_inline) {
8987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    text_input_type_ = type;
89958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    text_input_mode_ = input_mode;
9007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    can_compose_inline_ = can_compose_inline;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (GetInputMethod())
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetInputMethod()->OnTextInputTypeChanged(this);
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (touch_editing_client_)
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      touch_editing_client_->OnTextInputTypeChanged(text_input_type_);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::OnTextInputStateChanged(
9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ViewHostMsg_TextInputState_Params& params) {
9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (params.show_ime_if_needed && params.type != ui::TEXT_INPUT_TYPE_NONE) {
9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (GetInputMethod())
9125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetInputMethod()->ShowImeIfNeeded();
9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
9145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ImeCancelComposition() {
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetInputMethod())
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetInputMethod()->CancelComposition(this);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ImeCompositionRangeChanged(
92358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const gfx::Range& range,
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<gfx::Rect>& character_bounds) {
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  composition_character_bounds_ = character_bounds;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::DidUpdateBackingStore(
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect& scroll_rect,
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Vector2d& scroll_delta,
931868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::vector<gfx::Rect>& copy_rects,
9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<ui::LatencyInfo>& latency_info) {
9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < latency_info.size(); i++)
9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    software_latency_info_.push_back(latency_info[i]);
935868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use the state of the RenderWidgetHost and not the window as the two may
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // differ. In particular if the window is hidden but the renderer isn't and we
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ignore the update and the window is made visible again the layer isn't
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // marked as dirty and we show the wrong thing.
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_->is_hidden())
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect clip_rect;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (paint_canvas_) {
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkRect sk_clip_rect;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (paint_canvas_->sk_canvas()->getClipBounds(&sk_clip_rect))
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      clip_rect = gfx::ToEnclosingRect(gfx::SkRectToRectF(sk_clip_rect));
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!scroll_rect.IsEmpty())
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SchedulePaintIfNotInClip(scroll_rect, clip_rect);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
954a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < copy_rects.size(); ++i) {
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect rect = gfx::SubtractRects(copy_rects[i], scroll_rect);
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rect.IsEmpty())
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SchedulePaintIfNotInClip(rect, clip_rect);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
964a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (host) {
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Send the invalid rect in screen coordinates.
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect screen_rect = GetViewBounds();
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect invalid_screen_rect(rect);
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      invalid_screen_rect.Offset(screen_rect.x(), screen_rect.y());
969a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      HWND hwnd = host->GetAcceleratedWidget();
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PaintPluginWindowsHelper(hwnd, invalid_screen_rect);
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostViewAura::RenderProcessGone(base::TerminationStatus status,
9777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 int error_code) {
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursorIfOverSelf();
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Destroy();
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::Destroy() {
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Beware, this function is not called on all destruction paths. It will
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implicitly end up calling ~RenderWidgetHostViewAura though, so all
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destruction/cleanup code should happen there, not here.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_shutdown_ = true;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete window_;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
990a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostViewAura::SetTooltipText(
991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& tooltip_text) {
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tooltip_ = tooltip_text;
9931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
99490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  aura::client::TooltipClient* tooltip_client =
99590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      aura::client::GetTooltipClient(root_window);
99690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (tooltip_client) {
99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    tooltip_client->UpdateTooltip(window_);
99890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Content tooltips should be visible indefinitely.
99990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    tooltip_client->SetTooltipShownTimeout(window_, 0);
100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostViewAura::SelectionChanged(const base::string16& text,
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                size_t offset,
100558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                const gfx::Range& range) {
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewBase::SelectionChanged(text, offset, range);
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) && !defined(OS_CHROMEOS)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (text.empty() || range.is_empty())
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
101123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  size_t pos = range.GetMin() - offset;
101223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  size_t n = range.length();
101323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
101423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(pos + n <= text.length()) << "The text can not fully cover range.";
101523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (pos >= text.length()) {
101623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    NOTREACHED() << "The text can not cover range.";
101723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
101823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Set the CLIPBOARD_TYPE_SELECTION to the ui::Clipboard.
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ScopedClipboardWriter clipboard_writer(
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Clipboard::GetForCurrentThread(),
10234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ui::CLIPBOARD_TYPE_SELECTION);
102423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  clipboard_writer.WriteText(text.substr(pos, n));
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(USE_X11) && !defined(OS_CHROMEOS)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SelectionBoundsChanged(
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ViewHostMsg_SelectionBounds_Params& params) {
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (selection_anchor_rect_ == params.anchor_rect &&
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      selection_focus_rect_ == params.focus_rect)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_anchor_rect_ = params.anchor_rect;
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selection_focus_rect_ = params.focus_rect;
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetInputMethod())
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetInputMethod()->OnCaretBoundsChanged(this);
1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_) {
1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_editing_client_->OnSelectionOrCursorChanged(selection_anchor_rect_,
1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        selection_focus_rect_);
1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::ScrollOffsetChanged() {
10471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = window_->GetRootWindow();
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!root)
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::CursorClient* cursor_client =
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::GetCursorClient(root);
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cursor_client && !cursor_client->IsCursorVisible())
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cursor_client->DisableMouseEvents();
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderWidgetHostViewAura::CopyFromCompositingSurface(
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& src_subrect,
1058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const gfx::Size& dst_size,
10595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Callback<void(bool, const SkBitmap&)>& callback,
10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SkBitmap::Config config) {
10615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Only ARGB888 and RGB565 supported as of now.
10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool format_support = ((config == SkBitmap::kRGB_565_Config) ||
10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         (config == SkBitmap::kARGB_8888_Config));
10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!format_support) {
10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(format_support);
10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    callback.Run(false, SkBitmap());
10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1069a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!CanCopyToBitmap()) {
10707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    callback.Run(false, SkBitmap());
1071eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
10727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const gfx::Size& dst_size_in_pixel = ConvertViewSizeToPixel(this, dst_size);
10757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<cc::CopyOutputRequest> request =
10767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      cc::CopyOutputRequest::CreateRequest(base::Bind(
10777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          &RenderWidgetHostViewAura::CopyFromCompositingSurfaceHasResult,
10787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          dst_size_in_pixel,
10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          config,
10807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          callback));
1081558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  gfx::Rect src_subrect_in_pixel =
1082558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      ConvertRectToPixel(current_device_scale_factor_, src_subrect);
1083558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  request->set_area(src_subrect_in_pixel);
10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RequestCopyOfOutput(request.Pass());
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::CopyFromCompositingSurfaceToVideoFrame(
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Rect& src_subrect,
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const scoped_refptr<media::VideoFrame>& target,
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Callback<void(bool)>& callback) {
1091a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!CanCopyToVideoFrame()) {
10927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    callback.Run(false);
1093868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
1094868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1096a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Try get a texture to reuse.
1097a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_refptr<OwnedMailbox> subscriber_texture;
1098a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (frame_subscriber_) {
1099a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (!idle_frame_subscriber_textures_.empty()) {
1100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      subscriber_texture = idle_frame_subscriber_textures_.back();
1101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      idle_frame_subscriber_textures_.pop_back();
1102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    } else if (GLHelper* helper =
1103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   ImageTransportFactory::GetInstance()->GetGLHelper()) {
1104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      subscriber_texture = new OwnedMailbox(helper);
1105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (subscriber_texture.get())
11075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      active_frame_subscriber_textures_.insert(subscriber_texture.get());
1108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
1109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
11107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<cc::CopyOutputRequest> request =
11117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      cc::CopyOutputRequest::CreateRequest(base::Bind(
11127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          &RenderWidgetHostViewAura::
1113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               CopyFromCompositingSurfaceHasResultForVideo,
11147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          AsWeakPtr(),  // For caching the ReadbackYUVInterface on this class.
1115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          subscriber_texture,
11167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          target,
11177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          callback));
1118d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  gfx::Rect src_subrect_in_pixel =
1119d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      ConvertRectToPixel(current_device_scale_factor_, src_subrect);
1120d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  request->set_area(src_subrect_in_pixel);
11215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (subscriber_texture.get()) {
11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    request->SetTextureMailbox(
11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        cc::TextureMailbox(subscriber_texture->mailbox(),
11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           subscriber_texture->target(),
11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           subscriber_texture->sync_point()));
1126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RequestCopyOfOutput(request.Pass());
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool RenderWidgetHostViewAura::CanCopyToBitmap() const {
1131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return GetCompositor() && window_->layer()->has_external_content();
1132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostViewAura::CanCopyToVideoFrame() const {
1135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return GetCompositor() &&
1136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)         window_->layer()->has_external_content() &&
11377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         host_->is_accelerated_compositing_active();
1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool RenderWidgetHostViewAura::CanSubscribeFrame() const {
1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::BeginFrameSubscription(
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) {
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  frame_subscriber_ = subscriber.Pass();
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::EndFrameSubscription() {
1150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  idle_frame_subscriber_textures_.clear();
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  frame_subscriber_.reset();
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnAcceleratedCompositingStateChange() {
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceInitialized(int host_id,
1158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                             int route_id) {
1159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool RenderWidgetHostViewAura::ShouldSkipFrame(gfx::Size size_in_dip) const {
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME ||
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      can_lock_compositor_ == NO_PENDING_COMMIT ||
1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !resize_lock_.get())
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return size_in_dip != resize_lock_->expected_size();
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void RenderWidgetHostViewAura::InternalSetBounds(const gfx::Rect& rect) {
11711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (HasDisplayPropertyChanged(window_))
11721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    host_->InvalidateScreenInfo();
11731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Don't recursively call SetBounds if this bounds update is the result of
1175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // a Window::SetBoundsInternal call.
1176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!in_bounds_changed_)
1177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    window_->SetBounds(rect);
11781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  host_->WasResized();
11791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  MaybeCreateResizeLock();
11801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (touch_editing_client_) {
11811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    touch_editing_client_->OnSelectionOrCursorChanged(selection_anchor_rect_,
11821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      selection_focus_rect_);
11831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Create the legacy dummy window which corresponds to the bounds of the
11865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // webcontents. This will be passed as the container window for windowless
11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // plugins.
1188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Plugins like Flash assume the container window which is returned via the
1189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // NPNVnetscapeWindow property corresponds to the bounds of the webpage.
1190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This is not true in Aura where we have only HWND which is the main Aura
1191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // window. If we return this window to plugins like Flash then it causes the
1192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // coordinate translations done by these plugins to break.
11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Additonally the legacy dummy window is needed for accessibility and for
11945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // scrolling to work in legacy drivers for trackpoints/trackpads, etc.
11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (GetNativeViewId()) {
11965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!legacy_render_widget_host_HWND_) {
11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      legacy_render_widget_host_HWND_ = LegacyRenderWidgetHostHWND::Create(
11985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          reinterpret_cast<HWND>(GetNativeViewId()));
11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (legacy_render_widget_host_HWND_) {
12015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      legacy_render_widget_host_HWND_->SetBounds(
12025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          window_->GetBoundsInRootWindow());
12035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (mouse_locked_)
1207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    UpdateMouseLockRegion();
1208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
12091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
12101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::CheckResizeLock() {
1212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!resize_lock_ ||
1213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      resize_lock_->expected_size() != current_frame_size_in_dip_)
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Since we got the size we were looking for, unlock the compositor. But delay
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the release of the lock until we've kicked a frame with the new texture, to
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // avoid resizing the UI before we have a chance to draw a "good" frame.
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resize_lock_->UnlockCompositor();
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui::Compositor* compositor = GetCompositor();
1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (compositor) {
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!compositor->HasObserver(this))
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      compositor->AddObserver(this);
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void RenderWidgetHostViewAura::DidReceiveFrameFromRenderer() {
1228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (frame_subscriber() && CanCopyToVideoFrame()) {
12295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::TimeTicks present_time = base::TimeTicks::Now();
1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<media::VideoFrame> frame;
1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback;
1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (frame_subscriber()->ShouldCaptureFrame(present_time,
1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                               &frame, &callback)) {
1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CopyFromCompositingSurfaceToVideoFrame(
1235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          gfx::Rect(current_frame_size_in_dip_),
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          frame,
1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          base::Bind(callback, present_time));
1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::UpdateConstrainedWindowRects(
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<gfx::Rect>& rects) {
12455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check this before setting constrained_rects_, so that next time they're set
12465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and we have a root window we don't early return.
1247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!window_->GetHost())
12485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
12495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (rects == constrained_rects_)
1251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  constrained_rects_ = rects;
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HWND parent = window_->GetHost()->GetAcceleratedWidget();
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CutoutRectsParams params;
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.widget = this;
1258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  params.cutout_rects = constrained_rects_;
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.geometry = &plugin_window_moves_;
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LPARAM lparam = reinterpret_cast<LPARAM>(&params);
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EnumChildWindows(parent, SetCutoutRectsCallback, lparam);
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderWidgetHostViewAura::UpdateMouseLockRegion() {
1265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Clip the cursor if chrome is running on regular desktop.
1266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (gfx::Screen::GetScreenFor(window_) == gfx::Screen::GetNativeScreen()) {
1267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    RECT window_rect = window_->GetBoundsInScreen().ToRECT();
1268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ::ClipCursor(&window_rect);
1269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped(
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel,
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int gpu_host_id) {
1276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Oldschool composited mode is no longer supported.
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::SwapDelegatedFrame(
1280ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    uint32 output_surface_id,
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<cc::DelegatedFrameData> frame_data,
1282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    float frame_device_scale_factor,
12835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<ui::LatencyInfo>& latency_info) {
12844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK_NE(0u, frame_data->render_pass_list.size());
1285d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  cc::RenderPass* root_pass = frame_data->render_pass_list.back();
1287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size frame_size = root_pass->output_rect.size();
12894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size frame_size_in_dip =
12904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ConvertSizeToDIP(frame_device_scale_factor, frame_size);
1291d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect damage_rect = gfx::ToEnclosingRect(root_pass->damage_rect);
12934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  damage_rect.Intersect(gfx::Rect(frame_size));
12944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect damage_rect_in_dip =
12954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ConvertRectToDIP(frame_device_scale_factor, damage_rect);
1296d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldSkipFrame(frame_size_in_dip)) {
1298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cc::CompositorFrameAck ack;
12993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    cc::TransferableResource::ReturnResources(frame_data->resource_list,
13003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                              &ack.resources);
1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderWidgetHostImpl::SendSwapCompositorFrameAck(
1302ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        host_->GetRoutingID(), output_surface_id,
1303ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        host_->GetProcess()->GetID(), ack);
1304d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    skipped_frames_ = true;
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1308d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (skipped_frames_) {
1309d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    skipped_frames_ = false;
1310d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    damage_rect = gfx::Rect(frame_size);
1311d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    damage_rect_in_dip = gfx::Rect(frame_size_in_dip);
1312d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1313d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Give the same damage rect to the compositor.
1314d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    cc::RenderPass* root_pass = frame_data->render_pass_list.back();
1315d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    root_pass->damage_rect = damage_rect;
1316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
1317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
131858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (output_surface_id != last_output_surface_id_) {
131958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Resource ids are scoped by the output surface.
132058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // If the originating output surface doesn't match the last one, it
132158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // indicates the renderer's output surface may have been recreated, in which
132258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // case we should recreate the DelegatedRendererLayer, to avoid matching
132358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // resources from the old one with resources from the new one which would
13244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // have the same id. Changing the layer to showing painted content destroys
13254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // the DelegatedRendererLayer.
13261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EvictDelegatedFrame();
13274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Drop the cc::DelegatedFrameResourceCollection so that we will not return
13294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // any resources from the old output surface with the new output surface id.
13308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (resource_collection_.get()) {
13314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      resource_collection_->SetClient(NULL);
13328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      if (resource_collection_->LoseAllResources())
13348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        SendReturnedDelegatedResources(last_output_surface_id_);
13358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      resource_collection_ = NULL;
13374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
133858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    last_output_surface_id_ = output_surface_id;
133958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
13404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (frame_size.IsEmpty()) {
13414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DCHECK_EQ(0u, frame_data->resource_list.size());
13421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EvictDelegatedFrame();
13434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
13444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!resource_collection_) {
13454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      resource_collection_ = new cc::DelegatedFrameResourceCollection;
13464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      resource_collection_->SetClient(this);
13474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // If the physical frame size changes, we need a new |frame_provider_|. If
1349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // the physical frame size is the same, but the size in DIP changed, we
1350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // need to adjust the scale at which the frames will be drawn, and we do
1351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // this by making a new |frame_provider_| also to ensure the scale change
1352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // is presented in sync with the new frame content.
1353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (!frame_provider_.get() || frame_size != frame_provider_->frame_size() ||
1354c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        frame_size_in_dip != current_frame_size_in_dip_) {
13554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_ = new cc::DelegatedFrameProvider(
13564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          resource_collection_.get(), frame_data.Pass());
13574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      window_->layer()->SetShowDelegatedContent(frame_provider_.get(),
13584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                frame_size_in_dip);
13594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else {
13604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_->SetFrameData(frame_data.Pass());
13614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
13624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  released_front_lock_ = NULL;
1364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  current_frame_size_in_dip_ = frame_size_in_dip;
1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckResizeLock();
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  window_->SchedulePaintInRect(damage_rect_in_dip);
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  pending_delegated_ack_count_++;
13708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::Compositor* compositor = GetCompositor();
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!compositor) {
1373ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    SendDelegatedFrameAck(output_surface_id);
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (size_t i = 0; i < latency_info.size(); i++)
13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      compositor->SetLatencyInfo(latency_info[i]);
1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AddOnCommitCallbackAndDisableLocks(
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&RenderWidgetHostViewAura::SendDelegatedFrameAck,
1379ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                   AsWeakPtr(),
1380ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                   output_surface_id));
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DidReceiveFrameFromRenderer();
13831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (frame_provider_.get())
13841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegated_frame_evictor_->SwappedFrame(!host_->is_hidden());
13851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Note: the frame may have been evicted immediately.
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1388ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderWidgetHostViewAura::SendDelegatedFrameAck(uint32 output_surface_id) {
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::CompositorFrameAck ack;
13904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (resource_collection_)
13914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources);
13924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderWidgetHostImpl::SendSwapCompositorFrameAck(host_->GetRoutingID(),
13934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                   output_surface_id,
13944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                   host_->GetProcess()->GetID(),
13954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                   ack);
13968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DCHECK_GT(pending_delegated_ack_count_, 0);
13978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  pending_delegated_ack_count_--;
13984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
13994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderWidgetHostViewAura::UnusedResourcesAreAvailable() {
14018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (pending_delegated_ack_count_)
14028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
14038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
14048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  SendReturnedDelegatedResources(last_output_surface_id_);
14058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
14068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
14078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void RenderWidgetHostViewAura::SendReturnedDelegatedResources(
14088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    uint32 output_surface_id) {
14095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(resource_collection_);
14105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  cc::CompositorFrameAck ack;
14125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources);
14138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DCHECK(!ack.resources.empty());
14145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  RenderWidgetHostImpl::SendReclaimCompositorResources(
14168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      host_->GetRoutingID(),
14178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      output_surface_id,
14188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      host_->GetProcess()->GetID(),
14198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      ack);
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void RenderWidgetHostViewAura::EvictDelegatedFrame() {
14231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  window_->layer()->SetShowPaintedContent();
14241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  frame_provider_ = NULL;
14251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  delegated_frame_evictor_->DiscardedFrame();
14261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
14271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnSwapCompositorFrame(
1429ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    uint32 output_surface_id,
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<cc::CompositorFrame> frame) {
14313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TRACE_EVENT0("content", "RenderWidgetHostViewAura::OnSwapCompositorFrame");
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (frame->delegated_frame_data) {
1433ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    SwapDelegatedFrame(output_surface_id,
1434ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                       frame->delegated_frame_data.Pass(),
1435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       frame->metadata.device_scale_factor,
1436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       frame->metadata.latency_info);
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (frame->software_frame_data) {
1441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DLOG(ERROR) << "Unable to use software frame in aura";
1442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    RecordAction(
1443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::UserMetricsAction("BadMessageTerminate_SharedMemoryAura"));
1444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    host_->GetProcess()->ReceivedBadMessage();
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
144790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
144890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
144990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
145090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetHostViewAura::SetParentNativeViewAccessible(
145190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gfx::NativeViewAccessible accessible_parent) {
145290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (GetBrowserAccessibilityManager()) {
145390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin()
145490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ->set_parent_iaccessible(accessible_parent);
145590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::NativeViewId RenderWidgetHostViewAura::GetParentForWindowlessPlugin()
1459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const {
14605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_) {
14615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return reinterpret_cast<gfx::NativeViewId>(
14625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        legacy_render_widget_host_HWND_->hwnd());
14635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
14645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return NULL;
1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
146690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer(
14697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel,
14707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int gpu_host_id) {
1471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Oldschool composited mode is no longer supported.
14727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
14737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() {
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() {
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::HasAcceleratedSurface(
1481d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const gfx::Size& desired_size) {
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matter what is returned here as GetBackingStore is the only caller of this
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // method. TODO(jbates) implement this if other Aura code needs it.
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static
14897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostViewAura::CopyFromCompositingSurfaceHasResult(
14907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const gfx::Size& dst_size_in_pixel,
14915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SkBitmap::Config config,
14927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::Callback<void(bool, const SkBitmap&)>& callback,
14937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_ptr<cc::CopyOutputResult> result) {
14947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (result->IsEmpty() || result->size().IsEmpty()) {
14957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    callback.Run(false, SkBitmap());
14967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
14977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
14987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
14997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (result->HasTexture()) {
15005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrepareTextureCopyOutputResult(dst_size_in_pixel, config,
15015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   callback,
15025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   result.Pass());
15037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
15047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
15057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(result->HasBitmap());
15075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrepareBitmapCopyOutputResult(dst_size_in_pixel, config, callback,
15085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                result.Pass());
15097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
15107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic void CopyFromCompositingSurfaceFinished(
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Callback<void(bool, const SkBitmap&)>& callback,
1513d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    scoped_ptr<cc::SingleReleaseCallback> release_callback,
15147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_ptr<SkBitmap> bitmap,
15157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_ptr<SkAutoLockPixels> bitmap_pixels_lock,
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool result) {
15177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bitmap_pixels_lock.reset();
15185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint32 sync_point = 0;
15205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (result) {
15215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper();
15225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    sync_point = gl_helper->InsertSyncPoint();
15235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
15245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool lost_resource = sync_point == 0;
15255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  release_callback->Run(sync_point, lost_resource);
15265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  callback.Run(result, *bitmap);
15287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
15297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static
15317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostViewAura::PrepareTextureCopyOutputResult(
15327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const gfx::Size& dst_size_in_pixel,
15335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SkBitmap::Config config,
15347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::Callback<void(bool, const SkBitmap&)>& callback,
15357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_ptr<cc::CopyOutputResult> result) {
15365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(result->HasTexture());
15377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::ScopedClosureRunner scoped_callback_runner(
15387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(callback, false, SkBitmap()));
15397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SkBitmap> bitmap(new SkBitmap);
15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bitmap->setConfig(config,
15421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                    dst_size_in_pixel.width(), dst_size_in_pixel.height(),
15431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                    0, kOpaque_SkAlphaType);
15447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!bitmap->allocPixels())
15457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
15467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
15487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GLHelper* gl_helper = factory->GetGLHelper();
15497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!gl_helper)
15507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
15517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SkAutoLockPixels> bitmap_pixels_lock(
15537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new SkAutoLockPixels(*bitmap));
15547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  uint8* pixels = static_cast<uint8*>(bitmap->getPixels());
15557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1556d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  cc::TextureMailbox texture_mailbox;
1557d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<cc::SingleReleaseCallback> release_callback;
1558d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  result->TakeTexture(&texture_mailbox, &release_callback);
1559d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(texture_mailbox.IsTexture());
1560d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!texture_mailbox.IsTexture())
15617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
15627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1563424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ignore_result(scoped_callback_runner.Release());
15647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gl_helper->CropScaleReadbackAndCleanMailbox(
15665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      texture_mailbox.mailbox(),
1567d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      texture_mailbox.sync_point(),
15687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      result->size(),
15697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Rect(result->size()),
15707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      dst_size_in_pixel,
15717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      pixels,
15725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      config,
15737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&CopyFromCompositingSurfaceFinished,
15747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 callback,
1575d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 base::Passed(&release_callback),
15767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 base::Passed(&bitmap),
15777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 base::Passed(&bitmap_pixels_lock)));
15787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
15797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static
15817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostViewAura::PrepareBitmapCopyOutputResult(
15827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const gfx::Size& dst_size_in_pixel,
15835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SkBitmap::Config config,
15847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::Callback<void(bool, const SkBitmap&)>& callback,
15857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_ptr<cc::CopyOutputResult> result) {
15865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (config != SkBitmap::kARGB_8888_Config) {
15875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NOTIMPLEMENTED();
15885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    callback.Run(false, SkBitmap());
15895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
15905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
15917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(result->HasBitmap());
15927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::ScopedClosureRunner scoped_callback_runner(
15937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(callback, false, SkBitmap()));
15947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SkBitmap> source = result->TakeBitmap();
15967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(source);
15977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!source)
15987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
15997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1600424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ignore_result(scoped_callback_runner.Release());
16017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
16027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SkBitmap bitmap = skia::ImageOperations::Resize(
16037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      *source,
16047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      skia::ImageOperations::RESIZE_BEST,
16057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      dst_size_in_pixel.width(),
16067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      dst_size_in_pixel.height());
16077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  callback.Run(true, bitmap);
16087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
16097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
16105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
16115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::ReturnSubscriberTexture(
16125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::WeakPtr<RenderWidgetHostViewAura> rwhva,
16135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<OwnedMailbox> subscriber_texture,
16145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    uint32 sync_point) {
16155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!subscriber_texture.get())
16165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
16175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!rwhva)
16185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
16195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_NE(
16205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      rwhva->active_frame_subscriber_textures_.count(subscriber_texture.get()),
16215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      0u);
16225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  subscriber_texture->UpdateSyncPoint(sync_point);
16245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  rwhva->active_frame_subscriber_textures_.erase(subscriber_texture.get());
16265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (rwhva->frame_subscriber_ && subscriber_texture->texture_id())
16275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rwhva->idle_frame_subscriber_textures_.push_back(subscriber_texture);
16285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
16295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinishedForVideo(
1631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::WeakPtr<RenderWidgetHostViewAura> rwhva,
1632a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    const base::Callback<void(bool)>& callback,
1633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    scoped_refptr<OwnedMailbox> subscriber_texture,
1634d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    scoped_ptr<cc::SingleReleaseCallback> release_callback,
1635a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    bool result) {
1636a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  callback.Run(result);
1637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
16385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint32 sync_point = 0;
16395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (result) {
16405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper();
16415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    sync_point = gl_helper->InsertSyncPoint();
16425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (release_callback) {
16445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // A release callback means the texture came from the compositor, so there
16455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // should be no |subscriber_texture|.
1646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(!subscriber_texture);
16475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool lost_resource = sync_point == 0;
16485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    release_callback->Run(sync_point, lost_resource);
1649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
16505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ReturnSubscriberTexture(rwhva, subscriber_texture, sync_point);
1651a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
1652a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
16537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static
16547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostViewAura::CopyFromCompositingSurfaceHasResultForVideo(
16557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::WeakPtr<RenderWidgetHostViewAura> rwhva,
1656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    scoped_refptr<OwnedMailbox> subscriber_texture,
16577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_refptr<media::VideoFrame> video_frame,
16587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::Callback<void(bool)>& callback,
16597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_ptr<cc::CopyOutputResult> result) {
16607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false));
16615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ScopedClosureRunner scoped_return_subscriber_texture(
16625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&ReturnSubscriberTexture, rwhva, subscriber_texture, 0));
16637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
16647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!rwhva)
16657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
16667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (result->IsEmpty())
16677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
16687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (result->size().IsEmpty())
16697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
16707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
16717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Compute the dest size we want after the letterboxing resize. Make the
16727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // coordinates and sizes even because we letterbox in YUV space
16737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // (see CopyRGBToVideoFrame). They need to be even for the UV samples to
16747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // line up correctly.
16757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The video frame's coded_size() and the result's size() are both physical
16767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // pixels.
16777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect region_in_frame =
16787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      media::ComputeLetterboxRegion(gfx::Rect(video_frame->coded_size()),
16797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                    result->size());
16807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  region_in_frame = gfx::Rect(region_in_frame.x() & ~1,
16817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                              region_in_frame.y() & ~1,
16827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                              region_in_frame.width() & ~1,
16837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                              region_in_frame.height() & ~1);
16847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (region_in_frame.IsEmpty())
16857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
16867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
16872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  if (!result->HasTexture()) {
16882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    DCHECK(result->HasBitmap());
16892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    scoped_ptr<SkBitmap> bitmap = result->TakeBitmap();
16902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    // Scale the bitmap to the required size, if necessary.
16912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    SkBitmap scaled_bitmap;
16922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    if (result->size().width() != region_in_frame.width() ||
16932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        result->size().height() != region_in_frame.height()) {
16942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      skia::ImageOperations::ResizeMethod method =
16952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch          skia::ImageOperations::RESIZE_GOOD;
16962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      scaled_bitmap = skia::ImageOperations::Resize(*bitmap.get(), method,
16972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                                                    region_in_frame.width(),
16982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                                                    region_in_frame.height());
16992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    } else {
17002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      scaled_bitmap = *bitmap.get();
17012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    }
17022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
17032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    {
17042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      SkAutoLockPixels scaled_bitmap_locker(scaled_bitmap);
17052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
17062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      media::CopyRGBToVideoFrame(
17072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch          reinterpret_cast<uint8*>(scaled_bitmap.getPixels()),
17082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch          scaled_bitmap.rowBytes(),
17092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch          region_in_frame,
17102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch          video_frame.get());
17112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    }
1712424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ignore_result(scoped_callback_runner.Release());
17132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    callback.Run(true);
17147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
17152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
17167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
17177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
17187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GLHelper* gl_helper = factory->GetGLHelper();
17197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!gl_helper)
17207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
17215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (subscriber_texture.get() && !subscriber_texture->texture_id())
17225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
17237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1724d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  cc::TextureMailbox texture_mailbox;
1725d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<cc::SingleReleaseCallback> release_callback;
1726d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  result->TakeTexture(&texture_mailbox, &release_callback);
1727d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(texture_mailbox.IsTexture());
1728d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!texture_mailbox.IsTexture())
17297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
17307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
17317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect result_rect(result->size());
17327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
17337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content::ReadbackYUVInterface* yuv_readback_pipeline =
17347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      rwhva->yuv_readback_pipeline_.get();
17357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (yuv_readback_pipeline == NULL ||
17367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      yuv_readback_pipeline->scaler()->SrcSize() != result_rect.size() ||
17377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      yuv_readback_pipeline->scaler()->SrcSubrect() != result_rect ||
17387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      yuv_readback_pipeline->scaler()->DstSize() != region_in_frame.size()) {
17397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    GLHelper::ScalerQuality quality = GLHelper::SCALER_QUALITY_FAST;
17407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    std::string quality_switch = switches::kTabCaptureDownscaleQuality;
17417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // If we're scaling up, we can use the "best" quality.
17427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (result_rect.size().width() < region_in_frame.size().width() &&
17437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        result_rect.size().height() < region_in_frame.size().height())
17447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      quality_switch = switches::kTabCaptureUpscaleQuality;
17457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
17467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    std::string switch_value =
17477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        CommandLine::ForCurrentProcess()->GetSwitchValueASCII(quality_switch);
17487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (switch_value == "fast")
17497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      quality = GLHelper::SCALER_QUALITY_FAST;
17507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    else if (switch_value == "good")
17517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      quality = GLHelper::SCALER_QUALITY_GOOD;
17527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    else if (switch_value == "best")
17537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      quality = GLHelper::SCALER_QUALITY_BEST;
17547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
17557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    rwhva->yuv_readback_pipeline_.reset(
17567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        gl_helper->CreateReadbackPipelineYUV(quality,
17577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             result_rect.size(),
17587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             result_rect,
17597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             video_frame->coded_size(),
17607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             region_in_frame,
17617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             true,
17621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                             true));
17637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    yuv_readback_pipeline = rwhva->yuv_readback_pipeline_.get();
17647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
17657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1766424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ignore_result(scoped_callback_runner.Release());
17675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ignore_result(scoped_return_subscriber_texture.Release());
1768a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Callback<void(bool result)> finished_callback = base::Bind(
1769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      &RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinishedForVideo,
1770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      rwhva->AsWeakPtr(),
1771a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      callback,
1772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      subscriber_texture,
1773d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Passed(&release_callback));
17745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(),
17755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     texture_mailbox.sync_point(),
17765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     video_frame.get(),
17775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     finished_callback);
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::GetScreenInfo(WebScreenInfo* results) {
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetScreenInfoForWindow(results, window_->GetRootWindow() ? window_ : NULL);
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::GetBoundsInRootWindow() {
17850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gfx::Rect rect = window_->GetToplevelWindow()->GetBoundsInScreen();
1786d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
17870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_WIN)
17880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rect = gfx::win::ScreenToDIPRect(rect);
1789d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
17900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
17910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return rect;
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::GestureEventAck(
17955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const blink::WebGestureEvent& event,
17965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputEventAckState ack_result) {
1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_)
17985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    touch_editing_client_->GestureEventAck(event.type);
1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ProcessAckedTouchEvent(
18027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const TouchEventWithLatencyInfo& touch, InputEventAckState ack_result) {
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<ui::TouchEvent> events;
18047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!MakeUITouchEventsFromWebTouchEvents(touch, &events,
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           SCREEN_COORDINATES))
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
1809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // |host| is NULL during tests.
1810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::EventResult result = (ack_result ==
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      INPUT_EVENT_ACK_STATE_CONSUMED) ? ui::ER_HANDLED : ui::ER_UNHANDLED;
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ScopedVector<ui::TouchEvent>::iterator iter = events.begin(),
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end = events.end(); iter != end; ++iter) {
1817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    host->dispatcher()->ProcessedTouchEvent((*iter), window_, result);
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1821f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<SyntheticGestureTarget>
1822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderWidgetHostViewAura::CreateSyntheticGestureTarget() {
1823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return scoped_ptr<SyntheticGestureTarget>(
1824f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new SyntheticGestureTargetAura(host_));
1825a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
1826a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetHasHorizontalScrollbar(
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_horizontal_scrollbar) {
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not needed. Mac-only.
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetScrollOffsetPinning(
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_pinned_to_left, bool is_pinned_to_right) {
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not needed. Mac-only.
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::CreateBrowserAccessibilityManagerIfNeeded() {
18385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (GetBrowserAccessibilityManager())
18395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
18405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserAccessibilityManager* manager = NULL;
18425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
1843a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
1844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
18455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1846a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HWND hwnd = host->GetAcceleratedWidget();
18475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The accessible_parent may be NULL at this point. The WebContents will pass
18495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // it down to this instance (by way of the RenderViewHost and
18505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // RenderWidgetHost) when it is known. This instance will then set it on its
18515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // BrowserAccessibilityManager.
18525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::NativeViewAccessible accessible_parent =
18535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      host_->GetParentNativeViewAccessible();
18545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_) {
18565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    manager = new BrowserAccessibilityManagerWin(
18575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        legacy_render_widget_host_HWND_.get(), accessible_parent,
18585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        BrowserAccessibilityManagerWin::GetEmptyDocument(), this);
18595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
18605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
18615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager = BrowserAccessibilityManager::Create(
18625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BrowserAccessibilityManager::GetEmptyDocument(), this);
18635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
18645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetBrowserAccessibilityManager(manager);
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::GLSurfaceHandle RenderWidgetHostViewAura::GetCompositingSurface() {
18685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ImageTransportFactory::GetInstance()->GetSharedSurfaceHandle();
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::LockMouse() {
1872f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
1873f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!root_window)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_)
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_locked_ = true;
18804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_WIN)
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->SetCapture();
1882effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
1883effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  UpdateMouseLockRegion();
18844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::CursorClient* cursor_client =
1886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      aura::client::GetCursorClient(root_window);
1887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client) {
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cursor_client->HideCursor();
1889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->LockCursor();
1890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1892b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (ShouldMoveToCenter()) {
1893b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    synthetic_move_sent_ = true;
1894b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    window_->MoveCursorTo(gfx::Rect(window_->bounds().size()).CenterPoint());
1895b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
18965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tooltip_disabler_.reset(new aura::client::ScopedTooltipDisabler(root_window));
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::UnlockMouse() {
19015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tooltip_disabler_.reset();
19025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1903f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
1904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!mouse_locked_ || !root_window)
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_locked_ = false;
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_WIN)
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->ReleaseCapture();
1911effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
1912effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ::ClipCursor(NULL);
19134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->MoveCursorTo(unlocked_mouse_position_);
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::CursorClient* cursor_client =
1916f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      aura::client::GetCursorClient(root_window);
1917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client) {
1918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->UnlockCursor();
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cursor_client->ShowCursor();
1920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->LostMouseLock();
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, ui::TextInputClient implementation:
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SetCompositionText(
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::CompositionText& composition) {
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ui::CompositionUnderline should be identical to
1933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // blink::WebCompositionUnderline, so that we can do reinterpret_cast safely.
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(sizeof(ui::CompositionUnderline) ==
1935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 sizeof(blink::WebCompositionUnderline),
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 ui_CompositionUnderline__WebKit_WebCompositionUnderline_diff);
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): convert both renderer_host and renderer to use
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ui::CompositionText.
1940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::vector<blink::WebCompositionUnderline>& underlines =
1941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reinterpret_cast<const std::vector<blink::WebCompositionUnderline>&>(
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          composition.underlines);
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): due to a bug of webkit, we can't use selection range with
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // composition string. See: https://bugs.webkit.org/show_bug.cgi?id=37788
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->ImeSetComposition(composition.text, underlines,
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           composition.selection.end(),
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           composition.selection.end());
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = !composition.text.empty();
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ConfirmCompositionText() {
1954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (host_ && has_composition_text_) {
1955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    host_->ImeConfirmComposition(base::string16(), gfx::Range::InvalidRange(),
1956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 false);
1957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ClearCompositionText() {
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_ && has_composition_text_)
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->ImeCancelComposition();
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostViewAura::InsertText(const base::string16& text) {
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(text_input_type_ != ui::TEXT_INPUT_TYPE_NONE);
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_)
197058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    host_->ImeConfirmComposition(text, gfx::Range::InvalidRange(), false);
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_composition_text_ = false;
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::InsertChar(base::char16 ch, int flags) {
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (popup_child_host_view_ && popup_child_host_view_->NeedsInputGrab()) {
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    popup_child_host_view_->InsertChar(ch, flags);
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Ignore character messages for VKEY_RETURN sent on CTRL+M. crbug.com/315547
1981f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (host_ && (accept_return_character_ || ch != ui::VKEY_RETURN)) {
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double now = ui::EventTimeForNow().InSecondsF();
1983f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Send a blink::WebInputEvent::Char event to |host_|.
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeWebKeyboardEvent webkit_event(ui::ET_KEY_PRESSED,
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        true /* is_char */,
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        ch,
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        flags,
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        now);
1989e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ForwardKeyboardEvent(webkit_event);
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1993868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gfx::NativeWindow RenderWidgetHostViewAura::GetAttachedWindow() const {
1994868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return window_;
1995868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1996868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::TextInputType RenderWidgetHostViewAura::GetTextInputType() const {
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return text_input_type_;
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2001ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochui::TextInputMode RenderWidgetHostViewAura::GetTextInputMode() const {
200258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return text_input_mode_;
2003ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
2004ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::CanComposeInline() const {
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return can_compose_inline_;
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::ConvertRectToScreen(
20108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const gfx::Rect& rect) const {
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point origin = rect.origin();
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point end = gfx::Point(rect.right(), rect.bottom());
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
201558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!root_window)
201658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return rect;
201758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  aura::client::ScreenPositionClient* screen_position_client =
201858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      aura::client::GetScreenPositionClient(root_window);
201958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!screen_position_client)
202058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return rect;
202158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  screen_position_client->ConvertPointToScreen(window_, &origin);
202258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  screen_position_client->ConvertPointToScreen(window_, &end);
202358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return gfx::Rect(origin.x(),
202458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   origin.y(),
202558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   end.x() - origin.x(),
202658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   end.y() - origin.y());
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::ConvertRectFromScreen(
20308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const gfx::Rect& rect) const {
2031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point origin = rect.origin();
2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point end = gfx::Point(rect.right(), rect.bottom());
2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
2035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (root_window) {
2036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::client::ScreenPositionClient* screen_position_client =
2037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        aura::client::GetScreenPositionClient(root_window);
2038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen_position_client->ConvertPointFromScreen(window_, &origin);
2039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen_position_client->ConvertPointFromScreen(window_, &end);
2040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return gfx::Rect(origin.x(),
2041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     origin.y(),
2042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     end.x() - origin.x(),
2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     end.y() - origin.y());
2044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return rect;
2047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)gfx::Rect RenderWidgetHostViewAura::GetCaretBounds() const {
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect rect =
20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::UnionRects(selection_anchor_rect_, selection_focus_rect_);
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertRectToScreen(rect);
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetCompositionCharacterBounds(
20568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    uint32 index,
20578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Rect* rect) const {
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(rect);
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index >= composition_character_bounds_.size())
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *rect = ConvertRectToScreen(composition_character_bounds_[index]);
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::HasCompositionText() const {
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return has_composition_text_;
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetTextRange(gfx::Range* range) const {
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_start(selection_text_offset_);
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_end(selection_text_offset_ + selection_text_.length());
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetCompositionTextRange(
20768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Range* range) const {
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RenderWidgetHostViewAura::GetSelectionRange(gfx::Range* range) const {
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_start(selection_range_.start());
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range->set_end(selection_range_.end());
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool RenderWidgetHostViewAura::SetSelectionRange(const gfx::Range& range) {
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool RenderWidgetHostViewAura::DeleteRange(const gfx::Range& range) {
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::GetTextFromRange(
210158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const gfx::Range& range,
2102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16* text) const {
210358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Range selection_text_range(selection_text_offset_,
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selection_text_offset_ + selection_text_.length());
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!selection_text_range.Contains(range)) {
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text->clear();
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selection_text_range.EqualsIgnoringDirection(range)) {
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Avoid calling substr whose performance is low.
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *text = selection_text_;
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *text = selection_text_.substr(
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        range.GetMin() - selection_text_offset_,
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        range.length());
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnInputMethodChanged() {
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetInputMethod())
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->SetInputMethodActive(GetInputMethod()->IsActive());
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(suzhe): implement the newly added “locale” property of HTML DOM
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TextEvent.
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::ChangeTextDirectionAndLayoutAlignment(
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::i18n::TextDirection direction) {
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->UpdateTextDirection(
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      direction == base::i18n::RIGHT_TO_LEFT ?
2138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebTextDirectionRightToLeft :
2139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebTextDirectionLeftToRight);
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->NotifyTextDirection();
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ExtendSelectionAndDelete(
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t before, size_t after) {
2146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderFrameHostImpl* rfh = GetFocusedFrame();
2147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (rfh)
2148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    rfh->ExtendSelectionAndDelete(before, after);
2149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::EnsureCaretInRect(const gfx::Rect& rect) {
2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect intersected_rect(
2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::IntersectRects(rect, window_->GetBoundsInScreen()));
2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (intersected_rect.IsEmpty())
2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_->ScrollFocusedEditableNodeIntoRect(
2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ConvertRectFromScreen(intersected_rect));
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::OnCandidateWindowShown() {
2163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  host_->CandidateWindowShown();
2164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::OnCandidateWindowUpdated() {
2167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  host_->CandidateWindowUpdated();
2168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostViewAura::OnCandidateWindowHidden() {
2171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  host_->CandidateWindowHidden();
2172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostViewAura, gfx::DisplayObserver implementation:
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnDisplayBoundsChanged(
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Display& display) {
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Screen* screen = gfx::Screen::GetScreenFor(window_);
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (display.id() == screen->GetDisplayNearestWindow(window_).id()) {
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateScreenInfo(window_);
21822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    current_cursor_.SetDisplayInfo(display);
21832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    UpdateCursorIfOverSelf();
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnDisplayAdded(
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Display& new_display) {
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnDisplayRemoved(
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Display& old_display) {
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, aura::WindowDelegate implementation:
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size RenderWidgetHostViewAura::GetMinimumSize() const {
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size();
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size RenderWidgetHostViewAura::GetMaximumSize() const {
22032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size();
22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnBoundsChanged(const gfx::Rect& old_bounds,
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               const gfx::Rect& new_bounds) {
2208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::AutoReset<bool> in_bounds_changed(&in_bounds_changed_, true);
22095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We care about this whenever RenderWidgetHostViewAura is not owned by a
22105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // WebContentsViewAura since changes to the Window's bounds need to be
22115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // messaged to the renderer.  WebContentsViewAura invokes SetSize() or
22125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // SetBounds() itself.  No matter how we got here, any redundant calls are
22135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // harmless.
22145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetSize(new_bounds.size());
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor RenderWidgetHostViewAura::GetCursor(const gfx::Point& point) {
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_)
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui::kCursorNone;
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return current_cursor_.GetNativeCursor();
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderWidgetHostViewAura::GetNonClientComponent(
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& point) const {
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HTCLIENT;
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::ShouldDescendIntoChildForEventHandling(
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* child,
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& location) {
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::CanFocus() {
2235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return popup_type_ == blink::WebPopupTypeNone;
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnCaptureLost() {
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->LostCapture();
2240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_)
22415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    touch_editing_client_->EndTouchEditing(false);
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnPaint(gfx::Canvas* canvas) {
22450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // For non-opaque windows, we don't draw anything, since we depend on the
22460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // canvas coming from the compositor to already be initialized as
22470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // transparent.
22480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (window_->layer()->fills_bounds_opaquely())
22490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    canvas->DrawColor(SK_ColorWHITE);
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnDeviceScaleFactorChanged(
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float device_scale_factor) {
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_)
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateScreenInfo(window_);
22582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
22592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  const gfx::Display display = gfx::Screen::GetScreenFor(window_)->
22602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      GetDisplayNearestWindow(window_);
22612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DCHECK_EQ(device_scale_factor, display.device_scale_factor());
22622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  current_cursor_.SetDisplayInfo(display);
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostViewAura::OnWindowDestroying(aura::Window* window) {
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND parent = NULL;
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the tab was hidden and it's closed, host_->is_hidden would have been
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reset to false in RenderWidgetHostImpl::RendererExited.
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!window_->GetRootWindow() || host_->is_hidden()) {
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent = ui::GetHiddenWindow();
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent = window_->GetHost()->GetAcceleratedWidget();
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LPARAM lparam = reinterpret_cast<LPARAM>(this);
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnumChildWindows(parent, WindowDestroyingCallback, lparam);
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
227858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
227958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Make sure that the input method no longer references to this object before
228058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // this object is removed from the root window (i.e. this object loses access
228158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // to the input method).
228258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui::InputMethod* input_method = GetInputMethod();
228358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (input_method)
228458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    input_method->DetachTextInputClient(this);
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostViewAura::OnWindowDestroyed(aura::Window* window) {
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->ViewDestroyed();
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnWindowTargetVisibilityChanged(bool visible) {
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::HasHitTestMask() const {
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::GetHitTestMask(gfx::Path* mask) const {
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, ui::EventHandler implementation:
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnKeyEvent(ui::KeyEvent* event) {
2306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnKeyEvent");
2307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
2308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (popup_child_host_view_ && popup_child_host_view_->NeedsInputGrab()) {
23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_child_host_view_->OnKeyEvent(event);
23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event->handled())
23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to handle the Escape key for Pepper Flash.
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_fullscreen_ && event->key_code() == ui::VKEY_ESCAPE) {
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Focus the window we were created from.
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (host_tracker_.get() && !host_tracker_->windows().empty()) {
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::Window* host = *(host_tracker_->windows().begin());
23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::FocusClient* client = aura::client::GetFocusClient(host);
23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (client) {
23232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        // Calling host->Focus() may delete |this|. We create a local observer
23242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        // for that. In that case we exit without further access to any members.
23252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        aura::WindowTracker tracker;
23262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        aura::Window* window = window_;
23272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        tracker.Add(window);
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host->Focus();
23292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        if (!tracker.Contains(window)) {
23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          event->SetHandled();
23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          return;
23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!in_shutdown_) {
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in_shutdown_ = true;
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_->Shutdown();
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
23405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (event->key_code() == ui::VKEY_RETURN) {
23415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Do not forward return key release events if no press event was handled.
23425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (event->type() == ui::ET_KEY_RELEASED && !accept_return_character_)
23435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
23445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Accept return key character events between press and release events.
2345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      accept_return_character_ = event->type() == ui::ET_KEY_PRESSED;
23465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We don't have to communicate with an input method here.
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!event->HasNativeEvent()) {
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NativeWebKeyboardEvent webkit_event(
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event->type(),
23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          event->is_char(),
23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          event->is_char() ? event->GetCharacter() : event->key_code(),
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event->flags(),
23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ui::EventTimeForNow().InSecondsF());
2356e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ForwardKeyboardEvent(webkit_event);
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NativeWebKeyboardEvent webkit_event(event);
2359e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ForwardKeyboardEvent(webkit_event);
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnMouseEvent(ui::MouseEvent* event) {
2366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnMouseEvent");
23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
2369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_) {
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::client::CursorClient* cursor_client =
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        aura::client::GetCursorClient(window_->GetRootWindow());
2374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(!cursor_client || !cursor_client->IsCursorVisible());
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (event->type() == ui::ET_MOUSEWHEEL) {
2377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebMouseWheelEvent mouse_wheel_event =
2378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent*>(event));
2379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (mouse_wheel_event.deltaX != 0 || mouse_wheel_event.deltaY != 0)
2380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        host_->ForwardWheelEvent(mouse_wheel_event);
2381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return;
2382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
2383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point center(gfx::Rect(window_->bounds().size()).CenterPoint());
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // If we receive non client mouse messages while we are in the locked state
23870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // it probably means that the mouse left the borders of our window and
23880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // needs to be moved back to the center.
23890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (event->flags() & ui::EF_IS_NON_CLIENT) {
23900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      synthetic_move_sent_ = true;
23910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      window_->MoveCursorTo(center);
23920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return;
23930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
23940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseEvent mouse_event = MakeWebMouseEvent(event);
23960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_move_to_center_event = (event->type() == ui::ET_MOUSE_MOVED ||
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event->type() == ui::ET_MOUSE_DRAGGED) &&
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mouse_event.x == center.x() && mouse_event.y == center.y();
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ModifyEventMovementAndCoords(&mouse_event);
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool should_not_forward = is_move_to_center_event && synthetic_move_sent_;
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (should_not_forward) {
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      synthetic_move_sent_ = false;
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Check if the mouse has reached the border and needs to be centered.
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ShouldMoveToCenter()) {
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        synthetic_move_sent_ = true;
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_->MoveCursorTo(center);
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Forward event to renderer.
24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (CanRendererHandleEvent(event) &&
2414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          !(event->flags() & ui::EF_FROM_TOUCH)) {
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host_->ForwardMouseEvent(mouse_event);
2416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // Ensure that we get keyboard focus on mouse down as a plugin window
2417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // may have grabbed keyboard focus.
2418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if (event->type() == ui::ET_MOUSE_PRESSED)
2419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          SetKeyboardFocus();
2420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // As the overscroll is handled during scroll events from the trackpad, the
24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RWHVA window is transformed by the overscroll controller. This transform
24272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // triggers a synthetic mouse-move event to be generated (by the aura
24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RootWindow). But this event interferes with the overscroll gesture. So,
24292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ignore such synthetic mouse-move events if an overscroll gesture is in
24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // progress.
24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host_->overscroll_controller() &&
24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->overscroll_controller()->overscroll_mode() != OVERSCROLL_NONE &&
24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event->flags() & ui::EF_IS_SYNTHESIZED &&
24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (event->type() == ui::ET_MOUSE_ENTERED ||
24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       event->type() == ui::ET_MOUSE_EXITED ||
24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       event->type() == ui::ET_MOUSE_MOVED)) {
24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->StopPropagation();
24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() == ui::ET_MOUSEWHEEL) {
24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We get mouse wheel/scroll messages even if we are not in the foreground.
24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // So here we check if we have any owned popup windows in the foreground and
24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // dismiss them.
2446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    aura::WindowTreeHost* host = window_->GetHost();
2447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (host) {
2448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      HWND parent = host->GetAcceleratedWidget();
24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HWND toplevel_hwnd = ::GetAncestor(parent, GA_ROOT);
24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EnumThreadWindows(GetCurrentThreadId(),
24512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        DismissOwnedPopups,
24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        reinterpret_cast<LPARAM>(toplevel_hwnd));
24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseWheelEvent mouse_wheel_event =
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent*>(event));
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mouse_wheel_event.deltaX != 0 || mouse_wheel_event.deltaY != 0)
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_->ForwardWheelEvent(mouse_wheel_event);
24592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (CanRendererHandleEvent(event) &&
24602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             !(event->flags() & ui::EF_FROM_TOUCH)) {
2461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseEvent mouse_event = MakeWebMouseEvent(event);
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ModifyEventMovementAndCoords(&mouse_event);
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->ForwardMouseEvent(mouse_event);
2464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Ensure that we get keyboard focus on mouse down as a plugin window may
2465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // have grabbed keyboard focus.
2466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (event->type() == ui::ET_MOUSE_PRESSED)
2467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SetKeyboardFocus();
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->type()) {
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->SetCapture();
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Confirm existing composition text on mouse click events, to make sure
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the input caret won't be moved with an ongoing composition text.
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FinishImeCompositionSession();
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_RELEASED:
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->ReleaseCapture();
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Needed to propagate mouse event to |window_->parent()->delegate()|, but
24855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // note that it might be something other than a WebContentsViewAura instance.
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pkotwicz): Find a better way of doing this.
2487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // In fullscreen mode which is typically used by flash, don't forward
2488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the mouse events to the parent. The renderer and the plugin process
2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // handle these events.
2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!is_fullscreen_ && window_->parent()->delegate() &&
24915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !(event->flags() & ui::EF_FROM_TOUCH)) {
24925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    event->ConvertLocationToTarget(window_, window_->parent());
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->parent()->delegate()->OnMouseEvent(event);
24945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsXButtonUpEvent(event))
24972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->SetHandled();
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnScrollEvent(ui::ScrollEvent* event) {
2501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnScrollEvent");
2502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
2503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event->type() == ui::ET_SCROLL) {
25065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_WIN)
25075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(ananta)
25085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Investigate if this is true for Windows 8 Metro ASH as well.
25092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event->finger_count() != 2)
25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
25115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
2512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebGestureEvent gesture_event =
25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        MakeWebGestureEventFlingCancel();
25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->ForwardGestureEvent(gesture_event);
2515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseWheelEvent mouse_wheel_event =
25167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        MakeWebMouseWheelEvent(event);
25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->ForwardWheelEvent(mouse_wheel_event);
25185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RecordAction(base::UserMetricsAction("TrackpadScroll"));
25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (event->type() == ui::ET_SCROLL_FLING_START ||
25207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)             event->type() == ui::ET_SCROLL_FLING_CANCEL) {
2521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebGestureEvent gesture_event =
25227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        MakeWebGestureEvent(event);
25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->ForwardGestureEvent(gesture_event);
25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event->type() == ui::ET_SCROLL_FLING_START)
25255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordAction(base::UserMetricsAction("TrackpadScrollFling"));
25262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
25292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnTouchEvent(ui::TouchEvent* event) {
2532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnTouchEvent");
2533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
2534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the touch event first.
2537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebTouchPoint* point = UpdateWebTouchEventFromUIEvent(*event,
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                &touch_event_);
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forward the touch event only if a touch point was updated, and there's a
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // touch-event handler in the page, and no other touch-event is in the queue.
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is important to always consume the event if there is a touch-event
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handler in the page, or some touch-event is already in the queue, even if
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no point has been updated, to make sure that this event does not get
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // processed by the gesture recognizer before the events in the queue.
25462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host_->ShouldForwardTouchEvent())
25472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->StopPropagation();
25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (point) {
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (host_->ShouldForwardTouchEvent())
25517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      host_->ForwardTouchEventWithLatencyInfo(touch_event_, *event->latency());
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateWebTouchEventAfterDispatch(&touch_event_, point);
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnGestureEvent(ui::GestureEvent* event) {
2557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnGestureEvent");
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((event->type() == ui::ET_GESTURE_PINCH_BEGIN ||
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->type() == ui::ET_GESTURE_PINCH_UPDATE ||
25605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event->type() == ui::ET_GESTURE_PINCH_END) && !pinch_zoom_enabled_) {
25612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->SetHandled();
25622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
2566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostDelegate* delegate = NULL;
2569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host_->IsRenderView())
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate = RenderViewHost::From(host_)->GetDelegate();
25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate && event->type() == ui::ET_GESTURE_BEGIN &&
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->details().touch_points() == 1) {
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->HandleGestureBegin();
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGestureEvent gesture = MakeWebGestureEvent(event);
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() == ui::ET_GESTURE_TAP_DOWN) {
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Webkit does not stop a fling-scroll on tap-down. So explicitly send an
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // event to stop any in-progress flings.
2581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebGestureEvent fling_cancel = gesture;
2582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fling_cancel.type = blink::WebInputEvent::GestureFlingCancel;
2583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fling_cancel.sourceDevice = blink::WebGestureEvent::Touchscreen;
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->ForwardGestureEvent(fling_cancel);
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (gesture.type != blink::WebInputEvent::Undefined) {
2588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    host_->ForwardGestureEventWithLatencyInfo(gesture, *event->latency());
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN ||
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event->type() == ui::ET_GESTURE_SCROLL_UPDATE ||
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event->type() == ui::ET_GESTURE_SCROLL_END) {
25935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordAction(base::UserMetricsAction("TouchscreenScroll"));
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (event->type() == ui::ET_SCROLL_FLING_START) {
25955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordAction(base::UserMetricsAction("TouchscreenScrollFling"));
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate && event->type() == ui::ET_GESTURE_END &&
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->details().touch_points() == 1) {
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->HandleGestureEnd();
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If a gesture is not processed by the webpage, then WebKit processes it
26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (e.g. generates synthetic mouse events).
26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, aura::client::ActivationDelegate implementation:
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostViewAura::ShouldActivate() const {
2613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
2614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!host)
26152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
2616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const ui::Event* event = host->dispatcher()->current_event();
26172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!event)
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_fullscreen_;
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
26232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostViewAura,
26242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//     aura::client::ActivationChangeObserver implementation:
26252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnWindowActivated(aura::Window* gained_active,
26272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 aura::Window* lost_active) {
26282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(window_ == gained_active || window_ == lost_active);
26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (window_ == gained_active) {
2630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const ui::Event* event = window_->GetHost()->dispatcher()->current_event();
26312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event && PointerEventActivates(*event))
26322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->OnPointerEventActivate();
26332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// RenderWidgetHostViewAura, aura::client::CursorClientObserver implementation:
2638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::OnCursorVisibilityChanged(bool is_visible) {
2640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifyRendererOfCursorVisibilityState(is_visible);
2641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
26442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostViewAura, aura::client::FocusChangeObserver implementation:
26452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnWindowFocused(aura::Window* gained_focus,
26472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               aura::Window* lost_focus) {
26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(window_ == gained_focus || window_ == lost_focus);
26492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (window_ == gained_focus) {
26502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We need to honor input bypass if the associated tab is does not want
26512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // input. This gives the current focused window a chance to be the text
26522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // input client and handle events.
26532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_->ignore_input_events())
26542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
26552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->GotFocus();
26572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->SetActive(true);
26582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::InputMethod* input_method = GetInputMethod();
26602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (input_method) {
26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Ask the system-wide IME to send all TextInputClient messages to |this|
26622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // object.
26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      input_method->SetFocusedTextInputClient(this);
26642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->SetInputMethodActive(input_method->IsActive());
26652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Often the application can set focus to the view in response to a key
26672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // down. However the following char event shouldn't be sent to the web
26682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // page.
26692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->SuppressNextCharEvents();
26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
26712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->SetInputMethodActive(false);
26722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2673c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2674c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager();
2675c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (manager)
2676c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      manager->OnWindowFocused();
26772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (window_ == lost_focus) {
26782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->SetActive(false);
26792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->Blur();
26802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DetachFromInputMethod();
26822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->SetInputMethodActive(false);
26832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (touch_editing_client_)
26855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      touch_editing_client_->EndTouchEditing(false);
2686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2687c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager();
2688c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (manager)
2689c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      manager->OnWindowBlurred();
2690c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
26912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If we lose the focus while fullscreen, close the window; Pepper Flash
2692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // won't do it for us (unlike NPAPI Flash). However, we do not close the
2693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // window if we lose the focus to a window on another display.
2694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Screen* screen = gfx::Screen::GetScreenFor(window_);
2695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool focusing_other_display =
2696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gained_focus && screen->GetNumDisplays() > 1 &&
2697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        (screen->GetDisplayNearestWindow(window_).id() !=
2698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         screen->GetDisplayNearestWindow(gained_focus).id());
2699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (is_fullscreen_ && !in_shutdown_ && !focusing_other_display) {
2700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
2701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // On Windows, if we are switching to a non Aura Window on a different
2702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // screen we should not close the fullscreen window.
2703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (!gained_focus) {
2704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        POINT point = {0};
2705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ::GetCursorPos(&point);
2706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (screen->GetDisplayNearestWindow(window_).id() !=
2707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            screen->GetDisplayNearestPoint(gfx::Point(point)).id())
2708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          return;
2709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      }
2710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
27112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      in_shutdown_ = true;
27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->Shutdown();
27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
27152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// RenderWidgetHostViewAura, aura::WindowTreeHostObserver implementation:
27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostViewAura::OnHostMoved(const aura::WindowTreeHost* host,
2721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           const gfx::Point& new_origin) {
2722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TRACE_EVENT1("ui", "RenderWidgetHostViewAura::OnHostMoved",
2723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)               "new_origin", new_origin.ToString());
2724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateScreenInfo(window_);
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, ui::CompositorObserver implementation:
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnCompositingDidCommit(
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::Compositor* compositor) {
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (can_lock_compositor_ == NO_PENDING_COMMIT) {
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    can_lock_compositor_ = YES;
2735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (resize_lock_.get() && resize_lock_->GrabDeferredLock())
2736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      can_lock_compositor_ = YES_DID_LOCK;
2737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunOnCommitCallbacks();
2739c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (resize_lock_ &&
2740c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      resize_lock_->expected_size() == current_frame_size_in_dip_) {
2741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    resize_lock_.reset();
2742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    host_->WasResized();
2743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // We may have had a resize while we had the lock (e.g. if the lock expired,
2744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // or if the UI still gave us some resizes), so make sure we grab a new lock
2745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // if necessary.
2746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MaybeCreateResizeLock();
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnCompositingStarted(
27512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::Compositor* compositor, base::TimeTicks start_time) {
27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_draw_ended_ = start_time;
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnCompositingEnded(
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::Compositor* compositor) {
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnCompositingAborted(
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::Compositor* compositor) {
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnCompositingLockStateChanged(
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::Compositor* compositor) {
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A compositor lock that is part of a resize lock timed out. We
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should display a renderer frame.
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) {
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    can_lock_compositor_ = NO_PENDING_RENDERER_FRAME;
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::OnUpdateVSyncParameters(
27732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeTicks timebase,
27742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta interval) {
2775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (IsShowing())
2776a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    host_->UpdateVSyncParameters(timebase, interval);
27772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostViewAura, BrowserAccessibilityDelegate implementation:
27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::SetAccessibilityFocus(int acc_obj_id) {
27832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!host_)
27842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->AccessibilitySetFocus(acc_obj_id);
27872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::AccessibilityDoDefaultAction(int acc_obj_id) {
27902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!host_)
27912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
27922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->AccessibilityDoDefaultAction(acc_obj_id);
27942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::AccessibilityScrollToMakeVisible(
27972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int acc_obj_id, gfx::Rect subfocus) {
27982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!host_)
27992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
28002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->AccessibilityScrollToMakeVisible(acc_obj_id, subfocus);
28022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::AccessibilityScrollToPoint(
28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int acc_obj_id, gfx::Point point) {
28062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!host_)
28072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
28082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->AccessibilityScrollToPoint(acc_obj_id, point);
28102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::AccessibilitySetTextSelection(
28132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int acc_obj_id, int start_offset, int end_offset) {
28142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!host_)
28152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
28162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->AccessibilitySetTextSelection(
28182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      acc_obj_id, start_offset, end_offset);
28192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Point RenderWidgetHostViewAura::GetLastTouchEventLocation() const {
28222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only needed for Win 8 non-aura.
28232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Point();
28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::FatalAccessibilityTreeError() {
28272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->FatalAccessibilityTreeError();
28282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetBrowserAccessibilityManager(NULL);
28292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation:
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::OnLostResources() {
2835c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (frame_provider_.get())
2836c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EvictDelegatedFrame();
2837a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  idle_frame_subscriber_textures_.clear();
28385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  yuv_readback_pipeline_.reset();
2839a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->ScheduleComposite();
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostViewAura, private:
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostViewAura::~RenderWidgetHostViewAura() {
2847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editing_client_)
2848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_editing_client_->OnViewDestroyed();
28495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ImageTransportFactory::GetInstance()->RemoveObserver(this);
28515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_observer_.reset();
2853a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (window_->GetHost())
2854a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    window_->GetHost()->RemoveObserver(this);
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnlockMouse();
28561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (popup_parent_host_view_) {
28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(popup_parent_host_view_->popup_child_host_view_ == NULL ||
28582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           popup_parent_host_view_->popup_child_host_view_ == this);
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    popup_parent_host_view_->popup_child_host_view_ = NULL;
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (popup_child_host_view_) {
28622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(popup_child_host_view_->popup_parent_host_view_ == NULL ||
28632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           popup_child_host_view_->popup_parent_host_view_ == this);
28642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_child_host_view_->popup_parent_host_view_ = NULL;
28652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
28665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  event_filter_for_popup_exit_.reset();
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetTooltipText(window_, NULL);
28682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Screen::GetScreenFor(window_)->RemoveObserver(this);
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This call is usually no-op since |this| object is already removed from the
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Aura root window and we don't have a way to get an input method object
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // associated with the window, but just in case.
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DetachFromInputMethod();
28744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
28754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (resource_collection_.get())
28764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->SetClient(NULL);
2877f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
28785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // An OwnedMailbox should not refer to the GLHelper anymore once the RWHVA is
28795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // destroyed, as it may then outlive the GLHelper.
28805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (std::set<OwnedMailbox*>::iterator it =
28815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           active_frame_subscriber_textures_.begin();
28825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != active_frame_subscriber_textures_.end();
28835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it) {
28845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    (*it)->Destroy();
28855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
28865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  active_frame_subscriber_textures_.clear();
28875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2888f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
28895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  legacy_render_widget_host_HWND_.reset(NULL);
2890f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
28915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!vsync_manager_);
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() {
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point screen_point =
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
28981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!root_window)
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Point root_window_point = screen_point;
29035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::client::ScreenPositionClient* screen_position_client =
29045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::client::GetScreenPositionClient(root_window);
29055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (screen_position_client) {
29065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    screen_position_client->ConvertPointFromScreen(
29075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        root_window, &root_window_point);
29085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (root_window->GetEventHandlerForPoint(root_window_point) != window_)
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeCursor cursor = current_cursor_.GetNativeCursor();
29142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do not show loading cursor when the cursor is currently hidden.
29152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_loading_ && cursor != ui::kCursorNone)
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor = ui::kCursorPointer;
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::CursorClient* cursor_client =
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::client::GetCursorClient(root_window);
29202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cursor_client) {
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor_client->SetCursor(cursor);
29222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::InputMethod* RenderWidgetHostViewAura::GetInputMethod() const {
29261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = window_->GetRootWindow();
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!root_window)
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_window->GetProperty(aura::client::kRootWindowInputMethodKey);
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::NeedsInputGrab() {
2933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return popup_type_ == blink::WebPopupTypeSelect;
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::FinishImeCompositionSession() {
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!has_composition_text_)
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (host_) {
2940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    host_->ImeConfirmComposition(base::string16(), gfx::Range::InvalidRange(),
2941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 false);
2942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImeCancelComposition();
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::ModifyEventMovementAndCoords(
2947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebMouseEvent* event) {
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the mouse has just entered, we must report zero movementX/Y. Hence we
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reset any global_mouse_position set previously.
2950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (event->type == blink::WebInputEvent::MouseEnter ||
2951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      event->type == blink::WebInputEvent::MouseLeave)
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global_mouse_position_.SetPoint(event->globalX, event->globalY);
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Movement is computed by taking the difference of the new cursor position
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the previous. Under mouse lock the cursor will be warped back to the
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // center so that we are not limited by clipping boundaries.
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do not measure movement as the delta from cursor to center because
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we may receive more mouse movement events before our warp has taken
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // effect.
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->movementX = event->globalX - global_mouse_position_.x();
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event->movementY = event->globalY - global_mouse_position_.y();
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global_mouse_position_.SetPoint(event->globalX, event->globalY);
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Under mouse lock, coordinates of mouse are locked to what they were when
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mouse lock was entered.
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_locked_) {
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->x = unlocked_mouse_position_.x();
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->y = unlocked_mouse_position_.y();
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->windowX = unlocked_mouse_position_.x();
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->windowY = unlocked_mouse_position_.y();
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->globalX = unlocked_global_mouse_position_.x();
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->globalY = unlocked_global_mouse_position_.y();
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unlocked_mouse_position_.SetPoint(event->windowX, event->windowY);
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unlocked_global_mouse_position_.SetPoint(event->globalX, event->globalY);
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::NotifyRendererOfCursorVisibilityState(
2981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool is_visible) {
2982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (host_->is_hidden() ||
2983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (cursor_visibility_state_in_renderer_ == VISIBLE && is_visible) ||
2984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (cursor_visibility_state_in_renderer_ == NOT_VISIBLE && !is_visible))
2985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  cursor_visibility_state_in_renderer_ = is_visible ? VISIBLE : NOT_VISIBLE;
2988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_->SendCursorVisibilityState(is_visible);
2989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::SchedulePaintIfNotInClip(
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& clip) {
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!clip.IsEmpty()) {
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect to_paint = gfx::SubtractRects(rect, clip);
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!to_paint.IsEmpty())
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->SchedulePaintInRect(to_paint);
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SchedulePaintInRect(rect);
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostViewAura::ShouldMoveToCenter() {
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect = window_->bounds();
3005b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  rect = ConvertRectToScreen(rect);
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int border_x = rect.width() * kMouseLockBorderPercentage / 100;
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int border_y = rect.height() * kMouseLockBorderPercentage / 100;
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return global_mouse_position_.x() < rect.x() + border_x ||
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      global_mouse_position_.x() > rect.right() - border_x ||
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      global_mouse_position_.y() < rect.y() + border_y ||
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      global_mouse_position_.y() > rect.bottom() - border_y;
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::RunOnCommitCallbacks() {
30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::vector<base::Closure>::const_iterator
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      it = on_compositing_did_commit_callbacks_.begin();
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      it != on_compositing_did_commit_callbacks_.end(); ++it) {
30192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    it->Run();
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  on_compositing_did_commit_callbacks_.clear();
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostViewAura::AddOnCommitCallbackAndDisableLocks(
3025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::Closure& callback) {
3026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui::Compositor* compositor = GetCompositor();
3027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(compositor);
3028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!compositor->HasObserver(this))
3030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    compositor->AddObserver(this);
3031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  can_lock_compositor_ = NO_PENDING_COMMIT;
3033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  on_compositing_did_commit_callbacks_.push_back(callback);
3034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostViewAura::AddedToRootWindow() {
3037a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_->GetHost()->AddObserver(this);
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateScreenInfo(window_);
3039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::client::CursorClient* cursor_client =
3041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      aura::client::GetCursorClient(window_->GetRootWindow());
3042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client) {
3043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->AddObserver(this);
3044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible());
3045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (HasFocus()) {
3047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::InputMethod* input_method = GetInputMethod();
3048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (input_method)
3049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      input_method->SetFocusedTextInputClient(this);
3050a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
30515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
30525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
30535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The parent may have changed here. Ensure that the legacy window is
30545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // reparented accordingly.
30555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
30565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->UpdateParent(
30575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        reinterpret_cast<HWND>(GetNativeViewId()));
30585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
30595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
30605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::Compositor* compositor = GetCompositor();
30615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (compositor) {
30625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(!vsync_manager_);
30635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    vsync_manager_ = compositor->vsync_manager();
30645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    vsync_manager_->AddObserver(this);
30655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::RemovingFromRootWindow() {
3069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::client::CursorClient* cursor_client =
3070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      aura::client::GetCursorClient(window_->GetRootWindow());
3071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_client)
3072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_client->RemoveObserver(this);
3073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3074f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DetachFromInputMethod();
3075f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_->GetHost()->RemoveObserver(this);
3077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunOnCommitCallbacks();
3078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resize_lock_.reset();
3079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_->WasResized();
3080c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ui::Compositor* compositor = GetCompositor();
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (compositor && compositor->HasObserver(this))
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    compositor->RemoveObserver(this);
30835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
30845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
30855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Update the legacy window's parent temporarily to the desktop window. It
30865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // will eventually get reparented to the right root.
30875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (legacy_render_widget_host_HWND_)
30885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    legacy_render_widget_host_HWND_->UpdateParent(::GetDesktopWindow());
30895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
30905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
30915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (vsync_manager_) {
30925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    vsync_manager_->RemoveObserver(this);
30935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    vsync_manager_ = NULL;
30945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3097a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ui::Compositor* RenderWidgetHostViewAura::GetCompositor() const {
3098a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window_->GetHost();
3099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return host ? host->compositor() : NULL;
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewAura::DetachFromInputMethod() {
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::InputMethod* input_method = GetInputMethod();
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (input_method && input_method->GetTextInputClient() == this)
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_method->SetFocusedTextInputClient(NULL);
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid RenderWidgetHostViewAura::ForwardKeyboardEvent(
3109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const NativeWebKeyboardEvent& event) {
3110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
3111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ui::TextEditKeyBindingsDelegateAuraLinux* keybinding_delegate =
3112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ui::GetTextEditKeyBindingsDelegate();
3113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::vector<ui::TextEditCommandAuraLinux> commands;
3114e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!event.skip_in_browser &&
3115e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      keybinding_delegate &&
3116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      event.os_event &&
3117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      keybinding_delegate->MatchEvent(*event.os_event, &commands)) {
3118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // Transform from ui/ types to content/ types.
3119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    EditCommands edit_commands;
3120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (std::vector<ui::TextEditCommandAuraLinux>::const_iterator it =
3121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch             commands.begin(); it != commands.end(); ++it) {
3122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      edit_commands.push_back(EditCommand(it->GetCommandString(),
3123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                          it->argument()));
3124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
3125e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    host_->Send(new InputMsg_SetEditCommandsForNextKeyEvent(
3126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        host_->GetRoutingID(), edit_commands));
3127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    NativeWebKeyboardEvent copy_event(event);
3128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    copy_event.match_edit_command = true;
3129e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    host_->ForwardKeyboardEvent(copy_event);
3130e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
3131e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
3132e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif
3133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
3134e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  host_->ForwardKeyboardEvent(event);
3135e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
3136e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
31375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::LockResources() {
31385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(frame_provider_);
31395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delegated_frame_evictor_->LockFrame();
31405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
31415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostViewAura::UnlockResources() {
31435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(frame_provider_);
31445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delegated_frame_evictor_->UnlockFrame();
31455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
31465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SkBitmap::Config RenderWidgetHostViewAura::PreferredReadbackFormat() {
3148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return SkBitmap::kARGB_8888_Config;
3149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
3150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// RenderWidgetHostViewAura, ui::LayerOwnerDelegate implementation:
3153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderWidgetHostViewAura::OnLayerRecreated(ui::Layer* old_layer,
3155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                ui::Layer* new_layer) {
3156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The new_layer is the one that will be used by our Window, so that's the one
3157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // that should keep our frame. old_layer will be returned to the
3158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // RecreateLayer caller, and should have a copy.
3159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (frame_provider_.get()) {
3160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    new_layer->SetShowDelegatedContent(frame_provider_.get(),
3161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                       current_frame_size_in_dip_);
3162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
3163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
3164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch////////////////////////////////////////////////////////////////////////////////
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostView, public:
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget(
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHost* widget) {
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new RenderWidgetHostViewAura(widget);
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) {
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetScreenInfoForWindow(results, NULL);
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
3180