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