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>(¶ms); 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