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