render_widget_host_impl.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <math.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/auto_reset.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/containers/hash_tables.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/lazy_instance.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame_ack.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_state_impl.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_process_host.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_process_host_ui_shim.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_surface_tracker.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/backing_store.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/backing_store_manager.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/dip_util.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/gesture_event_filter.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/overscroll_controller.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_helper.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_delegate.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/touch_event_queue.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/touchpad_tap_suppression_controller.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/accessibility_messages.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/content_constants_internal.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_messages.h" 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_widget_host_view_port.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/compositor_util.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/result_codes.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/image_operations.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h" 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCompositionUnderline.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size_conversions.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skbitmap_operations.h" 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h" 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/cursors/webcursor.h" 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/npapi/webplugin.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/npapi/webplugin_delegate_impl.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/backing_store_gtk.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/backing_store_mac.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeTicks; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using webkit::npapi::WebPluginDelegateImpl; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebGestureEvent; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebInputEvent; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebKeyboardEvent; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMouseEvent; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMouseWheelEvent; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTextDirection; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool g_check_for_pending_resize_ack = true; 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How long to (synchronously) wait for the renderer to respond with a 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PaintRect message, when our backing-store is invalid, before giving up and 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returning a null or incorrectly sized backing-store from GetBackingStore. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This timeout impacts the "choppiness" of our window resize perf. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPaintMsgTimeoutMS = 50; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns |true| if the two wheel events should be coalesced. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ShouldCoalesceMouseWheelEvents(const WebMouseWheelEvent& last_event, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebMouseWheelEvent& new_event) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_event.modifiers == new_event.modifiers && 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_event.scrollByPage == new_event.scrollByPage && 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_event.hasPreciseScrollingDeltas 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == new_event.hasPreciseScrollingDeltas && 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_event.phase == new_event.phase && 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_event.momentumPhase == new_event.momentumPhase; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float GetUnacceleratedDelta(float accelerated_delta, float acceleration_ratio) { 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return accelerated_delta * acceleration_ratio; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float GetAccelerationRatio(float accelerated_delta, float unaccelerated_delta) { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (unaccelerated_delta == 0.f || accelerated_delta == 0.f) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1.f; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return unaccelerated_delta / accelerated_delta; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)base::LazyInstance<std::vector<RenderWidgetHost::CreatedCallback> > 116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)g_created_callbacks = LAZY_INSTANCE_INITIALIZER; 117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef std::pair<int32, int32> RenderWidgetHostID; 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef base::hash_map<RenderWidgetHostID, RenderWidgetHostImpl*> 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RoutingIDWidgetMap; 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic base::LazyInstance<RoutingIDWidgetMap> g_routing_id_widget_map = 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LAZY_INSTANCE_INITIALIZER; 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHost::RemoveAllBackingStores() { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStoreManager::RemoveAllBackingStores(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t RenderWidgetHost::BackingStoreMemorySize() { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BackingStoreManager::MemorySize(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostImpl 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* process, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : view_(NULL), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_initialized_(false), 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_renderer_delay_ms_(kHungRendererDelayMs), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate), 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_(process), 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_(routing_id), 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id_(0), 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_(false), 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_hidden_(false), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_fullscreen_(false), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_accelerated_compositing_active_(false), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_ack_pending_(false), 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resize_ack_pending_(false), 15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) screen_info_out_of_date_(false), 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overdraw_bottom_height_(0.f), 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_auto_resize_(false), 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_screen_rects_ack_(false), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_move_pending_(false), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_pending_(false), 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) accessibility_mode_(AccessibilityModeOff), 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_range_pending_(false), 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) move_caret_pending_(false), 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needs_repainting_on_restore_(false), 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_unresponsive_(false), 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_flight_event_count_(0), 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_get_backing_store_(false), 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort_get_backing_store_(false), 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_being_painted_(false), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_input_events_(false), 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) input_method_active_(false), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_direction_updated_(false), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_direction_(WebKit::WebTextDirectionLeftToRight), 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_direction_canceled_(false), 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suppress_next_char_events_(false), 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_mouse_lock_request_(false), 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allow_privileged_mouse_lock_(false), 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_touch_handler_(false), 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_(this), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_event_queue_(new TouchEventQueue(this)), 182b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gesture_event_filter_(new GestureEventFilter(this)), 183b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_input_number_(0) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(delegate_); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (routing_id_ == MSG_ROUTING_NONE) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_ = process_->GetNextRoutingID(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForRenderer( 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_->GetID(), 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(piman): This is a O(N) lookup, where we could forward the 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // information from the RenderWidgetHelper. The problem is that doing so 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // currently leaks outside of content all the way to chrome classes, and 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // would be a layering violation. Since we don't expect more than a few 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hundreds of RWH, this seems acceptable. Revisit if performance become a 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // problem, for example by tracking in the RenderWidgetHelper the routing id 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (and surface id) that have been created, but whose RWH haven't yet. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id_ = GpuSurfaceTracker::Get()->LookupSurfaceForRenderer( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_->GetID(), 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(surface_id_); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_threaded_compositing_enabled_ = IsThreadedCompositingEnabled(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch g_routing_id_widget_map.Get().insert(std::make_pair( 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderWidgetHostID(process->GetID(), routing_id_), this)); 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch process_->AddRoute(routing_id_, this); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because the widget initializes as is_hidden_ == false, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tell the process host that we're alive. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_->WidgetRestored(); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) accessibility_mode_ = 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode(); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) 217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) g_created_callbacks.Get().at(i).Run(this); 218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool overscroll_enabled = CommandLine::ForCurrentProcess()-> 2215e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0"; 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetOverscrollControllerEnabled(overscroll_enabled); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostImpl::~RenderWidgetHostImpl() { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetView(NULL); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear our current or cached backing store if either remains. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStoreManager::RemoveBackingStore(this); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuSurfaceTracker::Get()->RemoveSurface(surface_id_); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id_ = 0; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch process_->RemoveRoute(routing_id_); 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch g_routing_id_widget_map.Get().erase( 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderWidgetHostID(process_->GetID(), routing_id_)); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RenderWidgetDeleted(this); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRenderWidgetHost* RenderWidgetHost::FromID( 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int32 process_id, 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int32 routing_id) { 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return RenderWidgetHostImpl::FromID(process_id, routing_id); 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRenderWidgetHostImpl* RenderWidgetHostImpl::FromID( 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int32 process_id, 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int32 routing_id) { 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RoutingIDWidgetMap* widgets = g_routing_id_widget_map.Pointer(); 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RoutingIDWidgetMap::iterator it = widgets->find( 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderWidgetHostID(process_id, routing_id)); 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return it == widgets->end() ? NULL : it->second; 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::vector<RenderWidgetHost*> RenderWidgetHost::GetRenderWidgetHosts() { 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<RenderWidgetHost*> hosts; 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RoutingIDWidgetMap* widgets = g_routing_id_widget_map.Pointer(); 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (RoutingIDWidgetMap::const_iterator it = widgets->begin(); 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != widgets->end(); 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++it) { 2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RenderWidgetHost* widget = it->second; 2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!widget->IsRenderView()) { 2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hosts.push_back(widget); 2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch continue; 2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Add only active RenderViewHosts. 2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RenderViewHost* rvh = RenderViewHost::From(widget); 2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out()) 2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hosts.push_back(widget); 2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return hosts; 2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static 2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstd::vector<RenderWidgetHost*> RenderWidgetHostImpl::GetAllRenderWidgetHosts() { 2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<RenderWidgetHost*> hosts; 2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RoutingIDWidgetMap* widgets = g_routing_id_widget_map.Pointer(); 2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (RoutingIDWidgetMap::const_iterator it = widgets->begin(); 2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch it != widgets->end(); 2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++it) { 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hosts.push_back(it->second); 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return hosts; 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostImpl* RenderWidgetHostImpl::From(RenderWidgetHost* rwh) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rwh->AsRenderWidgetHostImpl(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 299b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// static 300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void RenderWidgetHost::AddCreatedCallback(const CreatedCallback& callback) { 301b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) g_created_callbacks.Get().push_back(callback); 302b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 303b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 304b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// static 305b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void RenderWidgetHost::RemoveCreatedCallback(const CreatedCallback& callback) { 306b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); ++i) { 307b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (g_created_callbacks.Get().at(i).Equals(callback)) { 308b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) g_created_callbacks.Get().erase(g_created_callbacks.Get().begin() + i); 309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 310b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 311b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetView(RenderWidgetHostView* view) { 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_ = RenderWidgetHostViewPort::FromRWHV(view); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuSurfaceTracker::Get()->SetSurfaceHandle( 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id_, gfx::GLSurfaceHandle()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* RenderWidgetHostImpl::GetProcess() const { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return process_; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderWidgetHostImpl::GetRoutingID() const { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return routing_id_; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* RenderWidgetHostImpl::GetView() const { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostImpl* RenderWidgetHostImpl::AsRenderWidgetHostImpl() { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeViewId RenderWidgetHostImpl::GetNativeViewId() const { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_->GetNativeViewId(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::GLSurfaceHandle RenderWidgetHostImpl::GetCompositingSurface() { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_->GetCompositingSurface(); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::GLSurfaceHandle(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::CompositingSurfaceUpdated() { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuSurfaceTracker::Get()->SetSurfaceHandle( 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id_, GetCompositingSurface()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_->SurfaceUpdated(surface_id_); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ResetSizeAndRepaintPendingFlags() { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resize_ack_pending_ = false; 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (repaint_ack_pending_) { 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_ASYNC_END0( 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_ack_pending_ = false; 3647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch last_requested_size_.SetSize(0, 0); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SendScreenRects() { 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!renderer_initialized_ || waiting_for_screen_rects_ack_) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_hidden_) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On GTK, this comes in for backgrounded tabs. Ignore, to match what 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happens on Win & Mac, and when the view is shown it'll call this again. 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_view_screen_rect_ = view_->GetViewBounds(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_window_screen_rect_ = view_->GetBoundsInRootWindow(); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_UpdateScreenRects( 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRoutingID(), last_view_screen_rect_, last_window_screen_rect_)); 38490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (delegate_) 38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->DidSendScreenRects(this); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_screen_rects_ack_ = true; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::TimeDelta 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostImpl::GetSyntheticScrollMessageInterval() const { 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return smooth_scroll_gesture_controller_.GetSyntheticScrollMessageInterval(); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::SetOverscrollControllerEnabled(bool enabled) { 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!enabled) 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_controller_.reset(); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (!overscroll_controller_) 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_controller_.reset(new OverscrollController(this)); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::SuppressNextCharEvents() { 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suppress_next_char_events_ = true; 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Init() { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(process_->HasConnection()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_initialized_ = true; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuSurfaceTracker::Get()->SetSurfaceHandle( 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id_, GetCompositingSurface()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the ack along with the information on placement. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_CreatingNew_ACK(routing_id_)); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcess()->ResumeRequestsForView(routing_id_); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WasResized(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Shutdown() { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RejectMouseLockOrUnlockIfNecessary(); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_->HasConnection()) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the renderer object to close. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool rv = Send(new ViewMsg_Close(routing_id_)); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(rv); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Destroy(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::IsLoading() const { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_loading_; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::IsRenderView() const { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::OnMessageReceived(const IPC::Message &msg) { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_is_ok = true; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP_EX(RenderWidgetHostImpl, msg, msg_is_ok) 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RenderViewReady, OnRenderViewReady) 4457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_RenderProcessGone, OnRenderProcessGone) 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Close, OnClose) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateScreenRects_ACK, 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnUpdateScreenRectsAck) 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RequestMove, OnRequestMove) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnSetTooltipText) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_PaintAtSize_ACK, OnPaintAtSizeAck) 4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_MACOSX) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_CompositorSurfaceBuffersSwapped, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnCompositorSurfaceBuffersSwapped) 4557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(ViewHostMsg_SwapCompositorFrame, 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg_is_ok = OnSwapCompositorFrame(msg)) 45890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidOverscroll, OnOverscrolled) 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateRect, OnUpdateRect) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateIsDelayed, OnUpdateIsDelayed) 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputHostMsg_HandleInputEvent_ACK, OnInputEventAck) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_BeginSmoothScroll, OnBeginSmoothScroll) 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_SelectRange_ACK, OnSelectRangeAck) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_MoveCaret_ACK, OnMsgMoveCaretAck) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Focus, OnFocus) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Blur, OnBlur) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_HasTouchEventHandlers, 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnHasTouchEventHandlers) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_SetCursor, OnSetCursor) 4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_TextInputTypeChanged, 4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnTextInputTypeChanged) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_ImeCancelComposition, 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnImeCancelComposition) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidActivateAcceleratedCompositing, 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnDidActivateAcceleratedCompositing) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_LockMouse, OnLockMouse) 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UnlockMouse, OnUnlockMouse) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_ShowDisambiguationPopup, 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnShowDisambiguationPopup) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_WindowlessPluginDummyWindowCreated, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnWindowlessPluginDummyWindowCreated) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_WindowlessPluginDummyWindowDestroyed, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnWindowlessPluginDummyWindowDestroyed) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Snapshot, OnSnapshot) 4877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) 4887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_ImeCompositionRangeChanged, 4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnImeCompositionRangeChanged) 4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP_EX() 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!handled && view_ && view_->OnMessageReceived(msg)) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!msg_is_ok) { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The message de-serialization failed. Kill the renderer process. 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("BadMessageTerminate_RWH")); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcess()->ReceivedBadMessage(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::Send(IPC::Message* msg) { 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return process_->Send(msg); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::WasHidden() { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_hidden_ = true; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't bother reporting hung state when we aren't active. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopHangMonitorTimeout(); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a renderer, then inform it that we are being hidden so it can 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reduce its resource utilization. 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_WasHidden(routing_id_)); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the RenderProcessHost we were hidden. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_->WidgetHidden(); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = false; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<RenderWidgetHost>(this), 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<bool>(&is_visible)); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::WasShown() { 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we create the widget, it is created as *not* hidden. 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_hidden_) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_hidden_ = false; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendScreenRects(); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStore* backing_store = BackingStoreManager::Lookup(this); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we already have a backing store for this widget, then we don't need to 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // repaint on restore _unless_ we know that our backing store is invalid. 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When accelerated compositing is on, we must always repaint, even when 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the backing store exists. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_repainting; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (needs_repainting_on_restore_ || !backing_store || 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_accelerated_compositing_active()) { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needs_repainting = true; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needs_repainting_on_restore_ = false; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needs_repainting = false; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_WasShown(routing_id_, needs_repainting)); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_->WidgetRestored(); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = true; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<RenderWidgetHost>(this), 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<bool>(&is_visible)); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's possible for our size to be out of sync with the renderer. The 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // following is one case that leads to this: 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1. WasResized -> Send ViewMsg_Resize to render 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2. WasResized -> do nothing as resize_ack_pending_ is true 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3. WasHidden 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 4. OnUpdateRect from (1) processed. Does NOT invoke WasResized as view 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is hidden. Now renderer/browser out of sync with what they think size 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is. 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // By invoking WasResized the renderer is updated as necessary. WasResized 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // does nothing if the sizes are already in sync. 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: ideally ViewMsg_WasShown would take a size. This way, the renderer 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could handle both the restore and resize at once. This isn't that big a 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deal as RenderWidget::WasShown delays updating, so that the resize from 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WasResized is usually processed before the renderer is painted. 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WasResized(); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::WasResized() { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (resize_ack_pending_ || !process_->HasConnection() || !view_ || 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !renderer_initialized_ || should_auto_resize_) { 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect view_bounds = view_->GetViewBounds(); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size new_size(view_bounds.size()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size old_physical_backing_size = physical_backing_size_; 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) physical_backing_size_ = view_->GetPhysicalBackingSize(); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_fullscreen = is_fullscreen_; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_fullscreen_ = IsFullscreen(); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float old_overdraw_bottom_height = overdraw_bottom_height_; 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overdraw_bottom_height_ = view_->GetOverdrawBottomHeight(); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool size_changed = new_size != last_requested_size_; 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool side_payload_changed = 59690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) screen_info_out_of_date_ || 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) old_physical_backing_size != physical_backing_size_ || 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) was_fullscreen != is_fullscreen_ || 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) old_overdraw_bottom_height != overdraw_bottom_height_; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!size_changed && !side_payload_changed) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!screen_info_) { 60590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) screen_info_.reset(new WebKit::WebScreenInfo); 60690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetWebScreenInfo(screen_info_.get()); 60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 60990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We don't expect to receive an ACK when the requested size or the physical 61090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // backing size is empty, or when the main viewport size didn't change. 61190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!new_size.IsEmpty() && !physical_backing_size_.IsEmpty() && size_changed) 612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) resize_ack_pending_ = g_check_for_pending_resize_ack; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ViewMsg_Resize_Params params; 61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.screen_info = *screen_info_; 61690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.new_size = new_size; 61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.physical_backing_size = physical_backing_size_; 61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.overdraw_bottom_height = overdraw_bottom_height_; 61990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.resizer_rect = GetRootWindowResizerRect(); 62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.is_fullscreen = is_fullscreen_; 62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!Send(new ViewMsg_Resize(routing_id_, params))) { 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resize_ack_pending_ = false; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch last_requested_size_ = new_size; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ResizeRectChanged(const gfx::Rect& new_rect) { 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ChangeResizeRect(routing_id_, new_rect)); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::GotFocus() { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Focus(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Focus() { 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_SetFocus(routing_id_, true)); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Blur() { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a pending mouse lock request, we don't want to reject it at 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this point. The user can switch focus back to this view and approve the 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request later. 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsMouseLocked()) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->UnlockMouse(); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // If there is a pending overscroll, then that should be cancelled. 6487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (overscroll_controller_) 6497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) overscroll_controller_->Cancel(); 6507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_SetFocus(routing_id_, false)); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::LostCapture() { 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_MouseCaptureLost(routing_id_)); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetActive(bool active) { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetActive(routing_id_, active)); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::LostMouseLock() { 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_MouseLockLost(routing_id_)); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ViewDestroyed() { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RejectMouseLockOrUnlockIfNecessary(); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(evanm): tracking this may no longer be necessary; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // eliminate this function if so. 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetView(NULL); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetIsLoading(bool is_loading) { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = is_loading; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SetIsLoading(is_loading); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::CopyFromBackingStore( 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& src_subrect, 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& accelerated_dst_size, 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(bool, const SkBitmap&)>& callback) { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_ && is_accelerated_compositing_active_) { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("browser", 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RenderWidgetHostImpl::CopyFromBackingStore::FromCompositingSurface"); 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect accelerated_copy_rect = src_subrect.IsEmpty() ? 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect(view_->GetViewBounds().size()) : src_subrect; 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CopyFromCompositingSurface(accelerated_copy_rect, 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerated_dst_size, 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStore* backing_store = GetBackingStore(false); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!backing_store) { 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(false, SkBitmap()); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("browser", 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RenderWidgetHostImpl::CopyFromBackingStore::FromBackingStore"); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect copy_rect = src_subrect.IsEmpty() ? 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect(backing_store->size()) : src_subrect; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the result size is equal to the backing store size, copy from the 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // backing store directly to the output canvas. 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skia::PlatformBitmap output; 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = backing_store->CopyFromBackingStore(copy_rect, &output); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(result, output.GetBitmap()); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::CopyFromBackingStoreToGtkWindow( 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& dest_rect, GdkWindow* target) { 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStore* backing_store = GetBackingStore(false); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!backing_store) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (static_cast<BackingStoreGtk*>(backing_store))->PaintToRect( 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_rect, target); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size RenderWidgetHostImpl::GetBackingStoreSize() { 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStore* backing_store = GetBackingStore(false); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backing_store ? backing_store->size() : gfx::Size(); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::CopyFromBackingStoreToCGContext( 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CGRect& dest_rect, CGContextRef target) { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStore* backing_store = GetBackingStore(false); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!backing_store) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (static_cast<BackingStoreMac*>(backing_store))-> 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyFromBackingStoreToCGContext(dest_rect, target); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::PaintAtSize(TransportDIB::Handle dib_handle, 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tag, 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& page_size, 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& desired_size) { 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ask the renderer to create a bitmap regardless of whether it's 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hidden, being resized, redrawn, etc. It resizes the web widget 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the page_size and then scales it to the desired_size. 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_PaintAtSize(routing_id_, dib_handle, tag, 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_size, desired_size)); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::TryGetBackingStore(const gfx::Size& desired_size, 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStore** backing_store) { 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the view has an accelerated surface of the desired size. 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_->HasAcceleratedSurface(desired_size)) { 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *backing_store = NULL; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check for a software backing store of the desired size. 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *backing_store = BackingStoreManager::GetBackingStore(this, desired_size); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!*backing_store; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BackingStore* RenderWidgetHostImpl::GetBackingStore(bool force_create) { 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view_size will be current_size_ for auto-sized views and otherwise the 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size of the view_. (For auto-sized views, current_size_ is updated during 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateRect messages.) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size view_size = current_size_; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!should_auto_resize_) { 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the desired size from the current view bounds. 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect view_rect = view_->GetViewBounds(); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_rect.IsEmpty()) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_size = view_rect.size(); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT2("renderer_host", "RenderWidgetHostImpl::GetBackingStore", 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "width", base::IntToString(view_size.width()), 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "height", base::IntToString(view_size.height())); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not be asked to paint while we are hidden. If we are hidden, 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then it means that our consumer failed to call WasShown. If we're not 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // force creating the backing store, it's OK since we can feel free to give 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // out our cached one if we have it. 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_hidden_ || !force_create) << 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GetBackingStore called while hidden!"; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should never be called recursively; this can theoretically lead to 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // infinite recursion and almost certainly leads to lower performance. 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_get_backing_store_) << "GetBackingStore called recursively!"; 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<bool> auto_reset_in_get_backing_store( 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &in_get_backing_store_, true); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We might have a cached backing store that we can reuse! 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStore* backing_store = NULL; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TryGetBackingStore(view_size, &backing_store) || !force_create) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backing_store; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We do not have a suitable backing store in the cache, so send out a 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request to the renderer to paint the view if required. 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!repaint_ack_pending_ && !resize_ack_pending_ && !view_being_painted_) { 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_start_time_ = TimeTicks::Now(); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_ack_pending_ = true; 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0( 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_Repaint(routing_id_, view_size)); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta max_delay = TimeDelta::FromMilliseconds(kPaintMsgTimeoutMS); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks end_time = TimeTicks::Now() + max_delay; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("renderer_host", "GetBackingStore::WaitForUpdate"); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->AboutToWaitForBackingStoreMsg(); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we have asked the RenderWidget to resize, and we are still waiting 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on a response, block for a little while to see if we can't get a response 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before returning the old (incorrectly sized) backing store. 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message msg; 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_->WaitForBackingStoreMsg(routing_id_, max_delay, &msg)) { 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMessageReceived(msg); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For auto-resized views, current_size_ determines the view_size and it 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may have changed during the handling of an UpdateRect message. 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (should_auto_resize_) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_size = current_size_; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Break now if we got a backing store or accelerated surface of the 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // correct size. 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TryGetBackingStore(view_size, &backing_store) || 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort_get_backing_store_) { 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort_get_backing_store_ = false; 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backing_store; 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("renderer_host", "GetBackingStore::Timeout"); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loop if we still have time left and haven't gotten a properly sized 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BackingStore yet. This is necessary to support the GPU path which 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // typically has multiple frames pipelined -- we may need to skip one or two 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BackingStore messages to get to the latest. 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_delay = end_time - TimeTicks::Now(); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (max_delay > TimeDelta::FromSeconds(0)); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have failed to get a backing store of view_size. Fall back on 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current_size_ to avoid a white flash while resizing slow pages. 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_size != current_size_) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TryGetBackingStore(current_size_, &backing_store); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backing_store; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BackingStore* RenderWidgetHostImpl::AllocBackingStore(const gfx::Size& size) { 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_->AllocBackingStore(size); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::DonePaintingToBackingStore() { 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_UpdateRect_ACK(GetRoutingID())); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ScheduleComposite() { 870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_hidden_ || !is_accelerated_compositing_active_ || 871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_size_.IsEmpty()) { 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send out a request to the renderer to paint the view if required. 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!repaint_ack_pending_ && !resize_ack_pending_ && !view_being_painted_) { 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_start_time_ = TimeTicks::Now(); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_ack_pending_ = true; 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0( 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_Repaint(routing_id_, current_size_)); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::StartHangMonitorTimeout(TimeDelta delay) { 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GetProcess()->IsGuest() && CommandLine::ForCurrentProcess()->HasSwitch( 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableHangMonitor)) { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set time_when_considered_hung_ if it's null. Also, update 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time_when_considered_hung_ if the caller's request is sooner than the 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // existing one. This will have the side effect that the existing timeout will 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be forgotten. 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time requested_end_time = Time::Now() + delay; 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (time_when_considered_hung_.is_null() || 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_when_considered_hung_ > requested_end_time) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_when_considered_hung_ = requested_end_time; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we already have a timer with the same or shorter duration, then we can 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // wait for it to finish. 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hung_renderer_timer_.IsRunning() && 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_renderer_timer_.GetCurrentDelay() <= delay) { 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If time_when_considered_hung_ was null, this timer may fire early. 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CheckRendererIsUnresponsive handles that by calling 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // StartHangMonitorTimeout with the remaining time. 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If time_when_considered_hung_ was non-null, it means we still haven't 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // heard from the renderer so we leave time_when_considered_hung_ as is. 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Either the timer is not yet running, or we need to adjust the timer to 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fire sooner. 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_when_considered_hung_ = requested_end_time; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_renderer_timer_.Stop(); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_renderer_timer_.Start(FROM_HERE, delay, this, 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &RenderWidgetHostImpl::CheckRendererIsUnresponsive); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RestartHangMonitorTimeout() { 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting to null will cause StartHangMonitorTimeout to restart the timer. 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_when_considered_hung_ = Time(); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartHangMonitorTimeout( 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::StopHangMonitorTimeout() { 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_when_considered_hung_ = Time(); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererIsResponsive(); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We do not bother to stop the hung_renderer_timer_ here in case it will be 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // started again shortly, which happens to be the common use case. 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::EnableFullAccessibilityMode() { 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAccessibilityMode(AccessibilityModeComplete); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WebGestureEvent MakeGestureEvent(WebInputEvent::Type type, 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double timestamp_seconds, 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x, 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y, 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int modifiers) { 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebGestureEvent result; 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.type = type; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.x = x; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.y = y; 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.sourceDevice = WebGestureEvent::Touchscreen; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.timeStampSeconds = timestamp_seconds; 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.modifiers = modifiers; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SimulateTouchGestureWithMouse( 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebMouseEvent& mouse_event) { 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x = mouse_event.x, y = mouse_event.y; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float dx = mouse_event.movementX, dy = mouse_event.movementY; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int startX = 0, startY = 0; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (mouse_event.button) { 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebMouseEvent::ButtonLeft: 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event.type == WebInputEvent::MouseDown) { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startX = x; 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startY = y; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForwardGestureEvent(MakeGestureEvent( 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputEvent::GestureScrollBegin, mouse_event.timeStampSeconds, 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x, y, 0)); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dx != 0 || dy != 0) { 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebGestureEvent event = MakeGestureEvent( 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputEvent::GestureScrollUpdate, mouse_event.timeStampSeconds, 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x, y, 0); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.data.scrollUpdate.deltaX = dx; 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.data.scrollUpdate.deltaY = dy; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForwardGestureEvent(event); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event.type == WebInputEvent::MouseUp) { 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForwardGestureEvent(MakeGestureEvent( 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputEvent::GestureScrollEnd, mouse_event.timeStampSeconds, 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x, y, 0)); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebMouseEvent::ButtonMiddle: 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event.type == WebInputEvent::MouseDown) { 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startX = x; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startY = y; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForwardGestureEvent(MakeGestureEvent( 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputEvent::GestureTapDown, mouse_event.timeStampSeconds, 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x, y, 0)); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event.type == WebInputEvent::MouseUp) { 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForwardGestureEvent(MakeGestureEvent( 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputEvent::GestureTap, mouse_event.timeStampSeconds, 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x, y, 0)); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebMouseEvent::ButtonRight: 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event.type == WebInputEvent::MouseDown) { 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startX = x; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startY = y; 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForwardGestureEvent(MakeGestureEvent( 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputEvent::GesturePinchBegin, mouse_event.timeStampSeconds, 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x, y, 0)); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dx != 0 || dy != 0) { 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dx = pow(dy < 0 ? 0.998f : 1.002f, fabs(dy)); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebGestureEvent event = MakeGestureEvent( 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputEvent::GesturePinchUpdate, mouse_event.timeStampSeconds, 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startX, startY, 0); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.data.pinchUpdate.scale = dx; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForwardGestureEvent(event); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event.type == WebInputEvent::MouseUp) { 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForwardGestureEvent(MakeGestureEvent( 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputEvent::GesturePinchEnd, mouse_event.timeStampSeconds, 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x, y, 0)); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebMouseEvent::ButtonNone: 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ForwardMouseEvent(const WebMouseEvent& mouse_event) { 1026b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ForwardMouseEventWithLatencyInfo( 10277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MouseEventWithLatencyInfo(mouse_event, 10287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateRWHLatencyInfoIfNotExist(NULL))); 1029b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 1030b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1031b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void RenderWidgetHostImpl::ForwardMouseEventWithLatencyInfo( 1032b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const MouseEventWithLatencyInfo& mouse_event) { 1033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT2("input", 1034b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "RenderWidgetHostImpl::ForwardMouseEventWithLatencyInfo", 1035b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "x", mouse_event.event.x, "y", mouse_event.event.y); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ignore_input_events_ || process_->IgnoreInputEvents()) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kSimulateTouchScreenWithMouse)) { 1041b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SimulateTouchGestureWithMouse(mouse_event.event); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (mouse_event.event.type == WebInputEvent::MouseDown && 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gesture_event_filter_->GetTouchpadTapSuppressionController()-> 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldDeferMouseDown(mouse_event)) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1049b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (mouse_event.event.type == WebInputEvent::MouseUp && 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gesture_event_filter_->GetTouchpadTapSuppressionController()-> 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldSuppressMouseUp()) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ForwardMouseEventImmediately(mouse_event); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::OnPointerEventActivate() { 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ForwardWheelEvent( 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebMouseWheelEvent& wheel_event) { 10627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ForwardWheelEventWithLatencyInfo(wheel_event, 10637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateRWHLatencyInfoIfNotExist(NULL)); 1064b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 1065b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1066b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void RenderWidgetHostImpl::ForwardWheelEventWithLatencyInfo( 1067b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const WebMouseWheelEvent& wheel_event, 106890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ui::LatencyInfo& latency_info) { 1069868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("input", 1070b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "RenderWidgetHostImpl::ForwardWheelEventWithLatencyInfo"); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ignore_input_events_ || process_->IgnoreInputEvents()) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_->PreHandleWheelEvent(wheel_event)) 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there's already a mouse wheel event waiting to be sent to the renderer, 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // add the new deltas to that event. Not doing so (e.g., by dropping the old 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event, as for mouse moves) results in very slow scrolling on the Mac (on 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which many, very small wheel events are sent). 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_wheel_pending_) { 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (coalesced_mouse_wheel_events_.empty() || 1083b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !ShouldCoalesceMouseWheelEvents( 1084b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) coalesced_mouse_wheel_events_.back().event, wheel_event)) { 1085b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) coalesced_mouse_wheel_events_.push_back( 1086b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MouseWheelEventWithLatencyInfo(wheel_event, latency_info)); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1088b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MouseWheelEventWithLatencyInfo* last_wheel_event = 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &coalesced_mouse_wheel_events_.back(); 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float unaccelerated_x = 1091b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GetUnacceleratedDelta(last_wheel_event->event.deltaX, 1092b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->event.accelerationRatioX) + 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUnacceleratedDelta(wheel_event.deltaX, 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wheel_event.accelerationRatioX); 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float unaccelerated_y = 1096b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GetUnacceleratedDelta(last_wheel_event->event.deltaY, 1097b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->event.accelerationRatioY) + 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUnacceleratedDelta(wheel_event.deltaY, 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wheel_event.accelerationRatioY); 1100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->event.deltaX += wheel_event.deltaX; 1101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->event.deltaY += wheel_event.deltaY; 1102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->event.wheelTicksX += wheel_event.wheelTicksX; 1103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->event.wheelTicksY += wheel_event.wheelTicksY; 1104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->event.accelerationRatioX = 1105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GetAccelerationRatio(last_wheel_event->event.deltaX, unaccelerated_x); 1106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->event.accelerationRatioY = 1107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GetAccelerationRatio(last_wheel_event->event.deltaY, unaccelerated_y); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(wheel_event.timeStampSeconds, 1109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->event.timeStampSeconds); 1110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->event.timeStampSeconds = wheel_event.timeStampSeconds; 1111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_wheel_event->latency.MergeWith(latency_info); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_pending_ = true; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_wheel_event_ = wheel_event; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HISTOGRAM_COUNTS_100("MPArch.RWH_WheelQueueSize", 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) coalesced_mouse_wheel_events_.size()); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ForwardInputEvent(wheel_event, sizeof(WebMouseWheelEvent), latency_info, 1122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) false); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ForwardGestureEvent( 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebGestureEvent& gesture_event) { 1127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ForwardGestureEventWithLatencyInfo(gesture_event, ui::LatencyInfo()); 1128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderWidgetHostImpl::ForwardGestureEventWithLatencyInfo( 1131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const WebKit::WebGestureEvent& gesture_event, 1132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ui::LatencyInfo& ui_latency) { 1133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardGestureEvent"); 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ignore_input_events_ || process_->IgnoreInputEvents()) 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::LatencyInfo latency_info = CreateRWHLatencyInfoIfNotExist(&ui_latency); 11387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (gesture_event.type == WebKit::WebInputEvent::GestureScrollUpdate) { 11407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch latency_info.AddLatencyNumber( 11417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_RWH_COMPONENT, 11427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetLatencyComponentId(), 11437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++last_input_number_); 11447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Make a copy of the INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT with a 11467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // different name INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT. 11477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // So we can track the latency specifically for scroll update events. 11487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::LatencyInfo::LatencyComponent original_component; 11497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 11507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 0, 11517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &original_component)) { 11527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch latency_info.AddLatencyNumberWithTimestamp( 11537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT, 11547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetLatencyComponentId(), 11557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch original_component.sequence_number, 11567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch original_component.event_time, 11577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch original_component.event_count); 11587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 11597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsInOverscrollGesture() && 1162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !gesture_event_filter_->ShouldForward( 11637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GestureEventWithLatencyInfo(gesture_event, latency_info))) { 11647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (overscroll_controller_.get()) 11657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) overscroll_controller_->DiscardingGestureEvent(gesture_event); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ForwardInputEvent(gesture_event, sizeof(WebGestureEvent), 1170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) latency_info, false); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Forwards MouseEvent without passing it through 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TouchpadTapSuppressionController. 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::ForwardMouseEventImmediately( 1176b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const MouseEventWithLatencyInfo& mouse_event) { 1177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT2("input", 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "RenderWidgetHostImpl::ForwardMouseEventImmediately", 1179b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "x", mouse_event.event.x, "y", mouse_event.event.y); 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ignore_input_events_ || process_->IgnoreInputEvents()) 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kSimulateTouchScreenWithMouse)) { 1185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SimulateTouchGestureWithMouse(mouse_event.event); 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Avoid spamming the renderer with mouse move events. It is important 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to note that WM_MOUSEMOVE events are anyways synthetic, but since our 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread is able to rapidly consume WM_MOUSEMOVE events, we may get way 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // more WM_MOUSEMOVE events than we wish to send to the renderer. 1193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (mouse_event.event.type == WebInputEvent::MouseMove) { 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mouse_move_pending_) { 1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!next_mouse_move_) { 1196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) next_mouse_move_.reset(new MouseEventWithLatencyInfo(mouse_event)); 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Accumulate movement deltas. 1199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int x = next_mouse_move_->event.movementX; 1200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int y = next_mouse_move_->event.movementY; 1201b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) next_mouse_move_->event = mouse_event.event; 1202b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) next_mouse_move_->event.movementX += x; 1203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) next_mouse_move_->event.movementY += y; 1204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) next_mouse_move_->latency.MergeWith(mouse_event.latency); 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_move_pending_ = true; 1209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (mouse_event.event.type == WebInputEvent::MouseDown) { 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnUserGesture(); 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1213b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ForwardInputEvent(mouse_event.event, sizeof(WebMouseEvent), 1214b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mouse_event.latency, false); 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ForwardTouchEventImmediately( 12187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const TouchEventWithLatencyInfo& touch_event) { 1219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardTouchEvent"); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ignore_input_events_ || process_->IgnoreInputEvents()) 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ForwardInputEvent(touch_event.event, sizeof(WebKit::WebTouchEvent), 12247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_event.latency, false); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ForwardGestureEventImmediately( 1228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const GestureEventWithLatencyInfo& gesture_event) { 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ignore_input_events_ || process_->IgnoreInputEvents()) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ForwardInputEvent(gesture_event.event, sizeof(WebGestureEvent), 1232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gesture_event.latency, false); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ForwardKeyboardEvent( 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& key_event) { 1237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardKeyboardEvent"); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ignore_input_events_ || process_->IgnoreInputEvents()) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First, let keypress listeners take a shot at handling the event. If a 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // listener handles the event, it should not be propagated to the renderer. 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (KeyPressListenersHandleEvent(key_event)) { 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Some keypresses that are accepted by the listener might have follow up 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // char events, which should be ignored. 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_event.type == WebKeyboardEvent::RawKeyDown) 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suppress_next_char_events_ = true; 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_event.type == WebKeyboardEvent::Char && 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (key_event.windowsKeyCode == ui::VKEY_RETURN || 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event.windowsKeyCode == ui::VKEY_SPACE)) { 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUserGesture(); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Double check the type to make sure caller hasn't sent us nonsense that 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will mess up our key queue. 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (WebInputEvent::isKeyboardEventType(key_event.type)) { 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suppress_next_char_events_) { 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If preceding RawKeyDown event was handled by the browser, then we need 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // suppress all Char events generated by it. Please note that, one 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RawKeyDown event may generate multiple Char events, so we can't reset 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |suppress_next_char_events_| until we get a KeyUp or a RawKeyDown. 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_event.type == WebKeyboardEvent::Char) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We get a KeyUp or a RawKeyDown event. 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suppress_next_char_events_ = false; 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_keyboard_shortcut = false; 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only pre-handle the key event if it's not handled by the input method. 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && !key_event.skip_in_browser) { 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to set |suppress_next_char_events_| to true if 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PreHandleKeyboardEvent() returns true, but |this| may already be 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroyed at that time. So set |suppress_next_char_events_| true here, 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then revert it afterwards when necessary. 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_event.type == WebKeyboardEvent::RawKeyDown) 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suppress_next_char_events_ = true; 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tab switching/closing accelerators aren't sent to the renderer to avoid 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a hung/malicious renderer from interfering. 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_->PreHandleKeyboardEvent(key_event, &is_keyboard_shortcut)) 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_event.type == WebKeyboardEvent::RawKeyDown) 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suppress_next_char_events_ = false; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't add this key to the queue if we have no way to send the message... 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!process_->HasConnection()) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put all WebKeyboardEvent objects in a queue since we can't trust the 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer and we need to give something to the HandleKeyboardEvent 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handler. 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_queue_.push_back(key_event); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HISTOGRAM_COUNTS_100("Renderer.KeyboardQueueSize", key_queue_.size()); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event_filter_->FlingHasBeenHalted(); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only forward the non-native portions of our event. 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForwardInputEvent(key_event, sizeof(WebKeyboardEvent), 13047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateRWHLatencyInfoIfNotExist(NULL), 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_keyboard_shortcut); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostImpl::SendCursorVisibilityState(bool is_visible) { 1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_CursorVisibilityChange(GetRoutingID(), is_visible)); 1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int64 RenderWidgetHostImpl::GetLatencyComponentId() { 1314b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return GetRoutingID() | (static_cast<int64>(GetProcess()->GetID()) << 32); 1315b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 1316b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// static 1318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RenderWidgetHostImpl::DisableResizeAckCheckForTesting() { 1319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_check_for_pending_resize_ack = false; 1320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 13227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochui::LatencyInfo RenderWidgetHostImpl::CreateRWHLatencyInfoIfNotExist( 13237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const ui::LatencyInfo* original) { 132490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::LatencyInfo info; 13257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (original) 13267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info = *original; 13277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // In Aura, gesture event will already carry its original touch event's 13287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // INPUT_EVENT_LATENCY_RWH_COMPONENT. 13297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!info.FindLatency(ui::INPUT_EVENT_LATENCY_RWH_COMPONENT, 133090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetLatencyComponentId(), 13317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NULL)) { 13327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_RWH_COMPONENT, 13337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetLatencyComponentId(), 13347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++last_input_number_); 13357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return info; 1337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 1338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::SendInputEvent(const WebInputEvent& input_event, 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int event_size, 134190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ui::LatencyInfo& latency_info, 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_keyboard_shortcut) { 1343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_RWH_COMPONENT, 1344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetLatencyComponentId(), 1345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NULL)); 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) input_event_start_time_ = TimeTicks::Now(); 1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_HandleInputEvent( 1348b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) routing_id_, &input_event, latency_info, is_keyboard_shortcut)); 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) increment_in_flight_event_count(); 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void RenderWidgetHostImpl::ForwardInputEvent( 1353b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const WebInputEvent& input_event, int event_size, 135490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ui::LatencyInfo& latency_info, bool is_keyboard_shortcut) { 1355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardInputEvent"); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!process_->HasConnection()) 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!process_->IgnoreInputEvents()); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (overscroll_controller_.get() && 1363b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !overscroll_controller_->WillDispatchEvent(input_event, latency_info)) { 1364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (input_event.type == WebKit::WebInputEvent::MouseMove) { 1365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Since this mouse-move event has been consumed, there will be no ACKs. 1366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // So reset the state here so that future mouse-move events do reach the 1367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // renderer. 1368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) mouse_move_pending_ = false; 1369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (input_event.type == WebKit::WebInputEvent::MouseWheel) { 1370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Reset the wheel-event state when appropriate. 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_wheel_pending_ = false; 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (WebInputEvent::isGestureEventType(input_event.type) && 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gesture_event_filter_->HasQueuedGestureEvents()) { 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the gesture-event filter has queued gesture events, that implies it 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is awaiting an ack for the event. Since the event is being consumed by 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the over scroll here, it is never sent to the renderer, and so it won't 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // receive any ACKs. So send the ACK to the gesture event filter 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // immediately, and mark it as having been processed. 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gesture_event_filter_->ProcessGestureAck(true, input_event.type); 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (WebInputEvent::isTouchEventType(input_event.type)) { 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // During an overscroll gesture initiated by touch-scrolling, the 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // touch-events do not reset or contribute to the overscroll gesture. 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // However, the touch-events are not sent to the renderer. So send and ACK 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to the touch-event queue immediately. Mark the event as not processed, 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to make sure that the touch-scroll gesture that initiated the 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // overscroll is updated properly. 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) touch_event_queue_->ProcessTouchAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Transmit any pending wheel events on a non-wheel event. This ensures that 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the renderer receives the final PhaseEnded wheel event, which is necessary 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to terminate rubber-banding, for example. 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (input_event.type != WebInputEvent::MouseWheel) { 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < coalesced_mouse_wheel_events_.size(); ++i) { 1397b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SendInputEvent(coalesced_mouse_wheel_events_[i].event, 1398b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) sizeof(WebMouseWheelEvent), 1399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) coalesced_mouse_wheel_events_[i].latency, 1400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) false); 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) coalesced_mouse_wheel_events_.clear(); 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) { 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Perform optional, synchronous event handling, sending ACK messages for 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // processed events, or proceeding as usual. 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InputEventAckState filter_ack = view_->FilterInputEvent(input_event); 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (filter_ack) { 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Send the ACK and early exit. 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case INPUT_EVENT_ACK_STATE_CONSUMED: 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS: 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_mouse_move_.reset(); 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnInputEventAck(input_event.type, filter_ack); 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WARNING: |this| may be deleted at this point. 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Proceed as normal. 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case INPUT_EVENT_ACK_STATE_UNKNOWN: 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case INPUT_EVENT_ACK_STATE_NOT_CONSUMED: 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1426b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SendInputEvent(input_event, event_size, latency_info, is_keyboard_shortcut); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Any input event cancels a pending mouse move event. Note that 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |next_mouse_move_| possibly owns |input_event|, so don't use |input_event| 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after this line. 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_mouse_move_.reset(); 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartHangMonitorTimeout( 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderWidgetHostImpl::ForwardTouchEventWithLatencyInfo( 14387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const WebKit::WebTouchEvent& touch_event, 14397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const ui::LatencyInfo& ui_latency) { 14407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::LatencyInfo latency_info = CreateRWHLatencyInfoIfNotExist(&ui_latency); 14417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TouchEventWithLatencyInfo touch_with_latency(touch_event, latency_info); 14427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_event_queue_->QueueEvent(touch_with_latency); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::AddKeyboardListener(KeyboardListener* listener) { 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) keyboard_listeners_.AddObserver(listener); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RemoveKeyboardListener( 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyboardListener* listener) { 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Ensure that the element is actually an observer. 1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(keyboard_listeners_.HasObserver(listener)); 1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) keyboard_listeners_.RemoveObserver(listener); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::GetWebScreenInfo(WebKit::WebScreenInfo* result) { 14577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::GetWebScreenInfo"); 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetView()) 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<RenderWidgetHostViewPort*>(GetView())->GetScreenInfo(result); 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostViewPort::GetDefaultScreenInfo(result); 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const NativeWebKeyboardEvent* 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostImpl::GetLastKeyboardEvent() const { 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (key_queue_.empty()) 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return &key_queue_.front(); 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::NotifyScreenInfoChanged() { 147290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The resize message (which may not happen immediately) will carry with it 147390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the screen info as well as the new size (if the screen has changed scale 147490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // factor). 147590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) screen_info_.reset(); 147690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) screen_info_out_of_date_ = true; 147790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WasResized(); 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::GetSnapshotFromRenderer( 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& src_subrect, 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(bool, const SkBitmap&)>& callback) { 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("browser", "RenderWidgetHostImpl::GetSnapshotFromRenderer"); 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_snapshots_.push(callback); 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect copy_rect = src_subrect.IsEmpty() ? 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(view_->GetViewBounds().size()) : src_subrect; 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 148990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect copy_rect_in_pixel = ConvertViewRectToPixel(view_, copy_rect); 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewMsg_Snapshot(GetRoutingID(), copy_rect_in_pixel)); 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnSnapshot(bool success, 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SkBitmap& bitmap) { 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_snapshots_.size() == 0) { 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "RenderWidgetHostImpl::OnSnapshot: " 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Received a snapshot that was not requested."; 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Callback<void(bool, const SkBitmap&)> callback = 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_snapshots_.front(); 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_snapshots_.pop(); 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!success) { 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(success, SkBitmap()); 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(success, bitmap); 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::UpdateVSyncParameters(base::TimeTicks timebase, 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta interval) { 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_UpdateVSyncParameters(GetRoutingID(), timebase, interval)); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RendererExited(base::TerminationStatus status, 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exit_code) { 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clearing this flag causes us to re-create the renderer when recovering 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from a crashed renderer. 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_initialized_ = false; 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_screen_rects_ack_ = false; 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must reset these to ensure that mouse move/wheel events work with a new 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer. 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_move_pending_ = false; 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_mouse_move_.reset(); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_pending_ = false; 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) coalesced_mouse_wheel_events_.clear(); 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must reset these to ensure that SelectRange works with a new renderer. 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_range_pending_ = false; 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_selection_range_.reset(); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Must reset these to ensure that MoveCaret works with a new renderer. 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) move_caret_pending_ = false; 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_move_caret_.reset(); 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_event_queue_->Reset(); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must reset these to ensure that gesture events work with a new renderer. 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event_filter_->Reset(); 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (overscroll_controller_) 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_controller_->Reset(); 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must reset these to ensure that keyboard events work with a new renderer. 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_queue_.clear(); 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suppress_next_char_events_ = false; 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset some fields in preparation for recovering from a crash. 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSizeAndRepaintPendingFlags(); 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_size_.SetSize(0, 0); 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_hidden_ = false; 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_accelerated_compositing_active_ = false; 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset this to ensure the hung renderer mechanism is working properly. 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_flight_event_count_ = 0; 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) { 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuSurfaceTracker::Get()->SetSurfaceHandle(surface_id_, 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::GLSurfaceHandle()); 15657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch view_->RenderProcessGone(status, exit_code); 15667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch view_ = NULL; // The View should be deleted by RenderProcessGone. 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStoreManager::RemoveBackingStore(this); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::UpdateTextDirection(WebTextDirection direction) { 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_direction_updated_ = true; 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_direction_ = direction; 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::CancelUpdateTextDirection() { 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text_direction_updated_) 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_direction_canceled_ = true; 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::NotifyTextDirection() { 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text_direction_updated_) { 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!text_direction_canceled_) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetTextDirection(GetRoutingID(), text_direction_)); 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_direction_updated_ = false; 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_direction_canceled_ = false; 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetInputMethodActive(bool activate) { 15927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) input_method_active_ = activate; 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetInputMethodActive(GetRoutingID(), activate)); 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ImeSetComposition( 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text, 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<WebKit::WebCompositionUnderline>& underlines, 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selection_start, 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selection_end) { 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ImeSetComposition( 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRoutingID(), text, underlines, selection_start, selection_end)); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ImeConfirmComposition( 16067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const string16& text, 16077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const ui::Range& replacement_range, 16087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool keep_selection) { 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ImeConfirmComposition( 16107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetRoutingID(), text, replacement_range, keep_selection)); 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ImeCancelComposition() { 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ImeSetComposition(GetRoutingID(), string16(), 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebKit::WebCompositionUnderline>(), 0, 0)); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ExtendSelectionAndDelete( 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t before, 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t after) { 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ExtendSelectionAndDelete(GetRoutingID(), before, after)); 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderWidgetHostImpl::GetRootWindowResizerRect() const { 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RequestToLockMouse(bool user_gesture, 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_unlocked_by_target) { 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Directly reject to lock the mouse. Subclass can override this method to 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // decide whether to allow mouse lock or not. 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GotResponseToLockMouseRequest(false); 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RejectMouseLockOrUnlockIfNecessary() { 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!pending_mouse_lock_request_ || !IsMouseLocked()); 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pending_mouse_lock_request_) { 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_mouse_lock_request_ = false; 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_LockMouse_ACK(routing_id_, false)); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IsMouseLocked()) { 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->UnlockMouse(); 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::IsMouseLocked() const { 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_ ? view_->IsMouseLocked() : false; 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::IsFullscreen() const { 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetShouldAutoResize(bool enable) { 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_auto_resize_ = enable; 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostImpl::IsInOverscrollGesture() const { 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return overscroll_controller_.get() && 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_controller_->overscroll_mode() != OVERSCROLL_NONE; 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Destroy() { 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<RenderWidgetHost>(this), 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the view to die. 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that in the process of the view shutting down, it can call a ton 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of other messages on us. So if you do any other deinitialization here, 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // do it after this call to view_->Destroy(). 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->Destroy(); 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::CheckRendererIsUnresponsive() { 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we received a call to StopHangMonitorTimeout. 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (time_when_considered_hung_.is_null()) 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have not waited long enough, then wait some more. 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time now = Time::Now(); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (now < time_when_considered_hung_) { 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartHangMonitorTimeout(time_when_considered_hung_ - now); 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OK, looks like we have a hung renderer! 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDERER_PROCESS_HANG, 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<RenderWidgetHost>(this), 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_unresponsive_ = true; 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyRendererUnresponsive(); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RendererIsResponsive() { 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_unresponsive_) { 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_unresponsive_ = false; 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyRendererResponsive(); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnRenderViewReady() { 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendScreenRects(); 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WasResized(); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostImpl::OnRenderProcessGone(int status, int exit_code) { 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(evanm): This synchronously ends up calling "delete this". 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is that really what we want in response to this message? I'm matching 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // previous behavior of the code here. 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Destroy(); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnClose() { 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shutdown(); 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnSetTooltipText( 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& tooltip_text, 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTextDirection text_direction_hint) { 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First, add directionality marks around tooltip text if necessary. 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A naive solution would be to simply always wrap the text. However, on 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // windows, Unicode directional embedding characters can't be displayed on 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // systems that lack RTL fonts and are instead displayed as empty squares. 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To get around this we only wrap the string when we deem it necessary i.e. 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the locale direction is different than the tooltip direction hint. 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Currently, we use element's directionality as the tooltip direction hint. 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An alternate solution would be to set the overall directionality based on 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // trying to detect the directionality from the tooltip text rather than the 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // element direction. One could argue that would be a preferable solution 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but we use the current approach to match Fx & IE's behavior. 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 wrapped_tooltip_text = tooltip_text; 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tooltip_text.empty()) { 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text_direction_hint == WebKit::WebTextDirectionLeftToRight) { 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the tooltip to have LTR directionality. 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wrapped_tooltip_text = 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::GetDisplayStringInLTRDirectionality(wrapped_tooltip_text); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (text_direction_hint == WebKit::WebTextDirectionRightToLeft && 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !base::i18n::IsRTL()) { 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the tooltip to have RTL directionality. 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::WrapStringWithRTLFormatting(&wrapped_tooltip_text); 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetView()) 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SetTooltipText(wrapped_tooltip_text); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnUpdateScreenRectsAck() { 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_screen_rects_ack_ = false; 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_) 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_->GetViewBounds() == last_view_screen_rect_ && 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->GetBoundsInRootWindow() == last_window_screen_rect_) { 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendScreenRects(); 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnRequestMove(const gfx::Rect& pos) { 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that we ignore the position. 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) { 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SetBounds(pos); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_Move_ACK(routing_id_)); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnPaintAtSizeAck(int tag, const gfx::Size& size) { 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<int, gfx::Size> details = std::make_pair(tag, size); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_PAINT_AT_SIZE_ACK, 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<RenderWidgetHost>(this), 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<std::pair<int, gfx::Size> >(&details)); 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_MACOSX) 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::OnCompositorSurfaceBuffersSwapped( 178590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ViewHostMsg_CompositorSurfaceBuffersSwapped_Params& params) { 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("renderer_host", 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RenderWidgetHostImpl::OnCompositorSurfaceBuffersSwapped"); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_) { 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AcceleratedSurfaceMsg_BufferPresented_Params ack_params; 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ack_params.sync_point = 0; 179190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderWidgetHostImpl::AcknowledgeBufferPresent(params.route_id, 179290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.gpu_process_host_id, 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ack_params); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params gpu_params; 179790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gpu_params.surface_id = params.surface_id; 179890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gpu_params.surface_handle = params.surface_handle; 179990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gpu_params.route_id = params.route_id; 180090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gpu_params.size = params.size; 180190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gpu_params.scale_factor = params.scale_factor; 1802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gpu_params.latency_info = params.latency_info; 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->AcceleratedSurfaceBuffersSwapped(gpu_params, 180490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.gpu_process_host_id); 18057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch view_->DidReceiveRendererFrame(); 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // OS_MACOSX 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostImpl::OnSwapCompositorFrame( 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& message) { 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ViewHostMsg_SwapCompositorFrame::Param param; 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) param.a.AssignTo(frame.get()); 18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) { 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->OnSwapCompositorFrame(frame.Pass()); 18197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch view_->DidReceiveRendererFrame(); 18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::CompositorFrameAck ack; 18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (frame->gl_frame_data) { 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ack.gl_frame_data = frame->gl_frame_data.Pass(); 18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ack.gl_frame_data->sync_point = 0; 18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (frame->delegated_frame_data) { 18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ack.resources.swap(frame->delegated_frame_data->resource_list); 1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (frame->software_frame_data) { 1828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ack.last_software_frame_id = frame->software_frame_data->id; 18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendSwapCompositorFrameAck(routing_id_, process_->GetID(), ack); 18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 183590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetHostImpl::OnOverscrolled( 183690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Vector2dF accumulated_overscroll, 183790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Vector2dF current_fling_velocity) { 183890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (view_) 183990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) view_->OnOverscrolled(accumulated_overscroll, current_fling_velocity); 184090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 184190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnUpdateRect( 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_UpdateRect_Params& params) { 18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::OnUpdateRect"); 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks paint_start = TimeTicks::Now(); 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update our knowledge of the RenderWidget's size. 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_size_ = params.view_size; 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update our knowledge of the RenderWidget's scroll offset. 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_scroll_offset_ = params.scroll_offset; 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_resize_ack = 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags); 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resize_ack_pending_ needs to be cleared before we call DidPaintRect, since 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that will end up reaching GetBackingStore. 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_resize_ack) { 1858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!g_check_for_pending_resize_ack || resize_ack_pending_); 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resize_ack_pending_ = false; 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_repaint_ack = 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewHostMsg_UpdateRect_Flags::is_repaint_ack(params.flags); 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_repaint_ack) { 1865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(repaint_ack_pending_); 1866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_ASYNC_END0( 1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_ack_pending_ = false; 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta delta = TimeTicks::Now() - repaint_start_time_; 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta); 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!params.view_size.IsEmpty()); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_async = false; 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a GPU UpdateRect, params.bitmap is invalid and dib will be NULL. 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportDIB* dib = process_->GetTransportDIB(params.bitmap); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If gpu process does painting, scroll_rect and copy_rects are always empty 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and backing store is never used. 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dib) { 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!params.bitmap_rect.IsEmpty()); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size pixel_size = gfx::ToFlooredSize( 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ScaleSize(params.bitmap_rect.size(), params.scale_factor)); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size = pixel_size.height() * pixel_size.width() * 4; 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dib->size() < size) { 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(WARNING) << "Transport DIB too small for given rectangle"; 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("BadMessageTerminate_RWH1")); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcess()->ReceivedBadMessage(); 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scroll the backing store. 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params.scroll_rect.IsEmpty()) { 18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollBackingStoreRect(params.scroll_delta, 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.scroll_rect, 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.view_size); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paint the backing store. This will update it with the 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer-supplied bits. The view will read out of the backing store 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later to actually draw to the screen. 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_async = PaintBackingStoreRect( 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bitmap, 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bitmap_rect, 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.copy_rects, 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.view_size, 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.scale_factor, 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&RenderWidgetHostImpl::DidUpdateBackingStore, 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), params, paint_start)); 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!was_async) { 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidUpdateBackingStore(params, paint_start); 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (should_auto_resize_) { 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool post_callback = new_auto_size_.IsEmpty(); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_auto_size_ = params.view_size; 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (post_callback) { 1921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask( 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&RenderWidgetHostImpl::DelayedAutoResized, 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr())); 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Log the time delta for processing a paint message. On platforms that don't 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // support asynchronous painting, this is equivalent to 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MPArch.RWH_TotalPaintTime. 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta delta = TimeTicks::Now() - paint_start; 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("MPArch.RWH_OnMsgUpdateRect", delta); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnUpdateIsDelayed() { 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (in_get_backing_store_) 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort_get_backing_store_ = true; 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::DidUpdateBackingStore( 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_UpdateRect_Params& params, 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TimeTicks& paint_start) { 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::DidUpdateBackingStore"); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks update_start = TimeTicks::Now(); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.needs_ack) { 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ACK early so we can prefetch the next PaintRect if there is a next one. 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This must be done AFTER we're done painting with the bitmap supplied by 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the renderer. This ACK is a signal to the renderer that the backing store 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can be re-used, so the bitmap may be invalid after this call. 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_UpdateRect_ACK(routing_id_)); 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the plugins if the view hasn't already been destroyed. Plugin moves 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will not be re-issued, so must move them now, regardless of whether we 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // paint or not. MovePluginWindows attempts to move the plugin windows and 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the process could dispatch other window messages which could cause the 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // view to be destroyed. 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->MovePluginWindows(params.scroll_offset, params.plugin_window_moves); 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE, 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<RenderWidgetHost>(this), 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't need to update the view if the view is hidden. We must do this 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // early return after the ACK is sent, however, or the renderer will not send 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // us more data. 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_hidden_) 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now paint the view. Watch out: it might be destroyed already. 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_ && !is_accelerated_compositing_active_) { 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_being_painted_ = true; 19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->DidUpdateBackingStore(params.scroll_rect, params.scroll_delta, 1977868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.copy_rects, params.latency_info); 19787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch view_->DidReceiveRendererFrame(); 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_being_painted_ = false; 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we got a resize ack, then perhaps we have another resize to send? 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_resize_ack = 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags); 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_resize_ack) 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WasResized(); 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Log the time delta for processing a paint message. 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks now = TimeTicks::Now(); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta delta = now - update_start; 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("MPArch.RWH_DidUpdateBackingStore", delta); 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Measures the time from receiving the MsgUpdateRect IPC to completing the 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DidUpdateBackingStore() method. On platforms which have asynchronous 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // painting, such as Linux, this is the sum of MPArch.RWH_OnMsgUpdateRect, 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MPArch.RWH_DidUpdateBackingStore, and the time spent asynchronously 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // waiting for the paint to complete. 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On other platforms, this will be equivalent to MPArch.RWH_OnMsgUpdateRect. 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta = now - paint_start; 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("MPArch.RWH_TotalPaintTime", delta); 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnInputEventAck( 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebInputEvent::Type event_type, InputEventAckState ack_result) { 2006868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("input", "RenderWidgetHostImpl::OnInputEventAck"); 20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool processed = (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED); 20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Log the time delta for processing an input event. 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta delta = TimeTicks::Now() - input_event_start_time_; 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("MPArch.RWH_InputEventDelta", delta); 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel pending hung renderer checks since the renderer is responsive. 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decrement_in_flight_event_count() == 0) 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopHangMonitorTimeout(); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type = static_cast<int>(event_type); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type < WebInputEvent::Undefined) { 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("BadMessageTerminate_RWH2")); 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_->ReceivedBadMessage(); 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (type == WebInputEvent::MouseMove) { 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_move_pending_ = false; 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // now, we can send the next mouse move event 2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (next_mouse_move_) { 2026b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(next_mouse_move_->event.type == WebInputEvent::MouseMove); 2027b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ForwardMouseEventWithLatencyInfo(*next_mouse_move_); 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (WebInputEvent::isKeyboardEventType(type)) { 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessKeyboardEventAck(type, processed); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (type == WebInputEvent::MouseWheel) { 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessWheelAck(processed); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (WebInputEvent::isTouchEventType(type)) { 20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProcessTouchAck(ack_result); 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (WebInputEvent::isGestureEventType(type)) { 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessGestureAck(processed, type); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WARNING: |this| may be deleted at this point. 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is used only for testing, and the other end does not use the 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // source object. On linux, specifying 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Source<RenderWidgetHost> results in a very strange 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // runtime error in the epilogue of the enclosing 20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (OnInputEventAck) method, but not on other platforms; using 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 'void' instead is just as safe (since NotificationSource 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is not actually typesafe) and avoids this error. 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_INPUT_EVENT_ACK, 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<void>(this), 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<int>(&type)); 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnBeginSmoothScroll( 2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ViewHostMsg_BeginSmoothScroll_Params& params) { 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_) 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smooth_scroll_gesture_controller_.BeginSmoothScroll(view_, params); 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnSelectRangeAck() { 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_range_pending_ = false; 2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (next_selection_range_) { 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SelectionRange> next(next_selection_range_.Pass()); 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectRange(next->start, next->end); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnMsgMoveCaretAck() { 20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) move_caret_pending_ = false; 2071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (next_move_caret_) { 20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<gfx::Point> next(next_move_caret_.Pass()); 20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MoveCaret(*next); 20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ProcessWheelAck(bool processed) { 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_pending_ = false; 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (overscroll_controller_) 20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_controller_->ReceivedEventACK(current_wheel_event_, processed); 20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2083a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Process the unhandled wheel event here before calling 2084a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // ForwardWheelEventWithLatencyInfo() since it will mutate 2085a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // current_wheel_event_. 2086a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!processed && !is_hidden_ && view_) 2087a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->UnhandledWheelEvent(current_wheel_event_); 2088a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now send the next (coalesced) mouse wheel event. 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!coalesced_mouse_wheel_events_.empty()) { 2091b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MouseWheelEventWithLatencyInfo next_wheel_event = 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) coalesced_mouse_wheel_events_.front(); 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) coalesced_mouse_wheel_events_.pop_front(); 2094b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ForwardWheelEventWithLatencyInfo(next_wheel_event.event, 2095b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) next_wheel_event.latency); 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ProcessGestureAck(bool processed, int type) { 2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (overscroll_controller_) { 21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_controller_->ReceivedEventACK( 21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gesture_event_filter_->GetGestureEventAwaitingAck(), processed); 21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event_filter_->ProcessGestureAck(processed, type); 2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) 2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->GestureEventAck(type); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::ProcessTouchAck(InputEventAckState ack_result) { 21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) touch_event_queue_->ProcessTouchAck(ack_result); 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnFocus() { 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only RenderViewHost can deal with that message. 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("BadMessageTerminate_RWH4")); 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcess()->ReceivedBadMessage(); 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnBlur() { 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only RenderViewHost can deal with that message. 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("BadMessageTerminate_RWH5")); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcess()->ReceivedBadMessage(); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnHasTouchEventHandlers(bool has_handlers) { 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_touch_handler_ == has_handlers) 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_touch_handler_ = has_handlers; 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_touch_handler_) 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_event_queue_->FlushQueue(); 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->HasTouchEventHandlers(has_touch_handler_); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnSetCursor(const WebCursor& cursor) { 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_) { 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->UpdateCursor(cursor); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostImpl::OnTextInputTypeChanged( 21467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::TextInputType type, 21477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool can_compose_inline, 21487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::TextInputMode input_mode) { 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) 21507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch view_->TextInputTypeChanged(type, can_compose_inline, input_mode); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) 21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnImeCompositionRangeChanged( 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Range& range, 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::Rect>& character_bounds) { 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->ImeCompositionRangeChanged(range, character_bounds); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnImeCancelComposition() { 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->ImeCancelComposition(); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnDidActivateAcceleratedCompositing(bool activated) { 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT1("renderer_host", 21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "RenderWidgetHostImpl::OnDidActivateAcceleratedCompositing", 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "activated", activated); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_accelerated_compositing_active_ = activated; 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->OnAcceleratedCompositingStateChange(); 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnLockMouse(bool user_gesture, 21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool last_unlocked_by_target, 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool privileged) { 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pending_mouse_lock_request_) { 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_LockMouse_ACK(routing_id_, false)); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IsMouseLocked()) { 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_LockMouse_ACK(routing_id_, true)); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_mouse_lock_request_ = true; 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (privileged && allow_privileged_mouse_lock_) { 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Directly approve to lock the mouse. 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GotResponseToLockMouseRequest(true); 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestToLockMouse(user_gesture, last_unlocked_by_target); 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnUnlockMouse() { 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RejectMouseLockOrUnlockIfNecessary(); 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnShowDisambiguationPopup( 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size, 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TransportDIB::Id& id) { 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!rect.IsEmpty()); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!size.IsEmpty()); 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportDIB* dib = process_->GetTransportDIB(id); 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(dib->memory()); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(dib->size() == SkBitmap::ComputeSize(SkBitmap::kARGB_8888_Config, 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.width(), size.height())); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap zoomed_bitmap; 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoomed_bitmap.setConfig(SkBitmap::kARGB_8888_Config, 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.width(), size.height()); 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoomed_bitmap.setPixels(dib->memory()); 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->ShowDisambiguationPopup(rect, zoomed_bitmap); 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoomed_bitmap.setPixels(0); 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ReleaseDisambiguationPopupDIB(GetRoutingID(), 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dib->handle())); 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::OnWindowlessPluginDummyWindowCreated( 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeViewId dummy_activation_window) { 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND hwnd = reinterpret_cast<HWND>(dummy_activation_window); 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsWindow(hwnd) || 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !WebPluginDelegateImpl::IsDummyActivationWindow(hwnd)) { 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This may happen as a result of a race condition when the plugin is going 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // away. 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetParent(hwnd, reinterpret_cast<HWND>(GetNativeViewId())); 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dummy_windows_for_activation_.push_back(hwnd); 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::OnWindowlessPluginDummyWindowDestroyed( 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeViewId dummy_activation_window) { 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND hwnd = reinterpret_cast<HWND>(dummy_activation_window); 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<HWND>::iterator i = dummy_windows_for_activation_.begin(); 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; i != dummy_windows_for_activation_.end(); ++i) { 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i) == hwnd) { 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dummy_windows_for_activation_.erase(i); 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unknown dummy window"; 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::PaintBackingStoreRect( 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportDIB::Id bitmap, 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bitmap_rect, 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::Rect>& copy_rects, 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& view_size, 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scale_factor, 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& completion_callback) { 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view may be destroyed already. 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_) 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_hidden_) { 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't bother updating the backing store when we're hidden. Just mark it 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as being totally invalid. This will cause a complete repaint when the 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // view is restored. 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needs_repainting_on_restore_ = true; 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_full_paint = false; 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool scheduled_completion_callback = false; 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStoreManager::PrepareBackingStore(this, view_size, bitmap, bitmap_rect, 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy_rects, scale_factor, 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) completion_callback, 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &needs_full_paint, 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &scheduled_completion_callback); 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (needs_full_paint) { 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_start_time_ = TimeTicks::Now(); 2287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!repaint_ack_pending_); 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_ack_pending_ = true; 2289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0( 2290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_Repaint(routing_id_, view_size)); 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scheduled_completion_callback; 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::ScrollBackingStoreRect(const gfx::Vector2d& delta, 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& clip_rect, 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& view_size) { 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_hidden_) { 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't bother updating the backing store when we're hidden. Just mark it 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as being totally invalid. This will cause a complete repaint when the 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // view is restored. 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needs_repainting_on_restore_ = true; 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(darin): do we need to do something else if our backing store is not 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same size as the advertised view? maybe we just assume there is a 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // full paint on its way? 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackingStore* backing_store = BackingStoreManager::Lookup(this); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!backing_store || (backing_store->size() != view_size)) 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backing_store->ScrollBackingStore(delta, clip_rect, view_size); 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Replace(const string16& word) { 2318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_Replace(routing_id_, word)); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::ReplaceMisspelling(const string16& word) { 2322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_ReplaceMisspelling(routing_id_, word)); 23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetIgnoreInputEvents(bool ignore_input_events) { 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_input_events_ = ignore_input_events; 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostImpl::KeyPressListenersHandleEvent( 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NativeWebKeyboardEvent& event) { 23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event.skip_in_browser || event.type != WebKeyboardEvent::RawKeyDown) 23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ObserverList<KeyboardListener>::Iterator it(keyboard_listeners_); 2335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) KeyboardListener* listener; 2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) while ((listener = it.GetNext()) != NULL) { 2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (listener->HandleKeyPressEvent(event)) 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ProcessKeyboardEventAck(int type, bool processed) { 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_queue_.empty()) { 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Got a KeyEvent back from the renderer but we " 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "don't seem to have sent it to the renderer!"; 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (key_queue_.front().type != type) { 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "We seem to have a different key type sent from " 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "the renderer. (" << key_queue_.front().type << " vs. " 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << type << "). Ignoring event."; 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Something must be wrong. Clear the |key_queue_| and 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |suppress_next_char_events_| so that we can resume from the error. 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_queue_.clear(); 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suppress_next_char_events_ = false; 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeWebKeyboardEvent front_item = key_queue_.front(); 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_queue_.pop_front(); 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_hidden_ && view_->PostProcessEventForPluginIme(front_item)) 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only send unprocessed key event upwards if we are not hidden, 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because the user has moved away from us and no longer expect any effect 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of this key event. 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && !processed && !is_hidden_ && !front_item.skip_in_browser) { 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleKeyboardEvent(front_item); 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WARNING: This RenderWidgetHostImpl can be deallocated at this point 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (i.e. in the case of Ctrl+W, where the call to 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HandleKeyboardEvent destroys this RenderWidgetHostImpl). 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::Vector2d& RenderWidgetHostImpl::GetLastScrollOffset() const { 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_scroll_offset_; 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::ShouldForwardTouchEvent() const { 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always send a touch event if the renderer has a touch-event handler. It is 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // possible that a renderer stops listening to touch-events while there are 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // still events in the touch-queue. In such cases, the new events should still 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get into the queue. 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return has_touch_handler_ || !touch_event_queue_->empty(); 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::StartUserGesture() { 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUserGesture(); 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Stop() { 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_Stop(GetRoutingID())); 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetBackground(const SkBitmap& background) { 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetBackground(GetRoutingID(), background)); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetEditCommandsForNextKeyEvent( 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<EditCommand>& commands) { 2405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_SetEditCommandsForNextKeyEvent(GetRoutingID(), commands)); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetAccessibilityMode(AccessibilityMode mode) { 24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) accessibility_mode_ = mode; 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetAccessibilityMode(routing_id_, mode)); 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::AccessibilityDoDefaultAction(int object_id) { 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new AccessibilityMsg_DoDefaultAction(GetRoutingID(), object_id)); 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::AccessibilitySetFocus(int object_id) { 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new AccessibilityMsg_SetFocus(GetRoutingID(), object_id)); 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::AccessibilityScrollToMakeVisible( 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int acc_obj_id, gfx::Rect subfocus) { 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new AccessibilityMsg_ScrollToMakeVisible( 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRoutingID(), acc_obj_id, subfocus)); 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::AccessibilityScrollToPoint( 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int acc_obj_id, gfx::Point point) { 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new AccessibilityMsg_ScrollToPoint( 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRoutingID(), acc_obj_id, point)); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::AccessibilitySetTextSelection( 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int object_id, int start_offset, int end_offset) { 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new AccessibilityMsg_SetTextSelection( 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRoutingID(), object_id, start_offset, end_offset)); 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::FatalAccessibilityTreeError() { 24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new AccessibilityMsg_FatalError(GetRoutingID())); 24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 244490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetHostImpl::SetParentNativeViewAccessible( 244590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::NativeViewAccessible accessible_parent) { 244690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (view_) 244790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) view_->SetParentNativeViewAccessible(accessible_parent); 244890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 244990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible 2451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RenderWidgetHostImpl::GetParentNativeViewAccessible() const { 2452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return delegate_->GetParentNativeViewAccessible(); 2453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 2455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ExecuteEditCommand(const std::string& command, 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value) { 2458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_ExecuteEditCommand(GetRoutingID(), command, value)); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ScrollFocusedEditableNodeIntoRect( 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect) { 2463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_ScrollFocusedEditableNodeIntoRect(GetRoutingID(), rect)); 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SelectRange(const gfx::Point& start, 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& end) { 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (select_range_pending_) { 2469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!next_selection_range_) { 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_selection_range_.reset(new SelectionRange()); 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_selection_range_->start = start; 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_selection_range_->end = end; 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_range_pending_ = true; 2478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_SelectRange(GetRoutingID(), start, end)); 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::MoveCaret(const gfx::Point& point) { 24822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (move_caret_pending_) { 24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_move_caret_.reset(new gfx::Point(point)); 24842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) move_caret_pending_ = true; 2488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_MoveCaret(GetRoutingID(), point)); 24892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Undo() { 2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_Undo(GetRoutingID())); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("Undo")); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Redo() { 2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_Redo(GetRoutingID())); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("Redo")); 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Cut() { 2502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_Cut(GetRoutingID())); 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("Cut")); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Copy() { 2507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_Copy(GetRoutingID())); 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("Copy")); 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::CopyToFindPboard() { 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows/Linux don't have the concept of a find pasteboard. 2514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_CopyToFindPboard(GetRoutingID())); 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("CopyToFindPboard")); 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Paste() { 2520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_Paste(GetRoutingID())); 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("Paste")); 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::PasteAndMatchStyle() { 2525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_PasteAndMatchStyle(GetRoutingID())); 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("PasteAndMatchStyle")); 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Delete() { 2530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_Delete(GetRoutingID())); 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("DeleteSelection")); 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SelectAll() { 2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new InputMsg_SelectAll(GetRoutingID())); 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("SelectAll")); 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 25397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderWidgetHostImpl::Unselect() { 25407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new InputMsg_Unselect(GetRoutingID())); 25417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RecordAction(UserMetricsAction("Unselect")); 25427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 25437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::GotResponseToLockMouseRequest(bool allowed) { 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!allowed) { 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RejectMouseLockOrUnlockIfNecessary(); 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pending_mouse_lock_request_) { 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is possible, e.g., the plugin sends us an unlock request before 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the user allows to lock to mouse. 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_mouse_lock_request_ = false; 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_ || !view_->HasFocus()|| !view_->LockMouse()) { 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_LockMouse_ACK(routing_id_, false)); 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_LockMouse_ACK(routing_id_, true)); 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::AcknowledgeBufferPresent( 25682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 route_id, int gpu_host_id, 25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AcceleratedSurfaceMsg_BufferPresented_Params& params) { 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHostUIShim* ui_shim = GpuProcessHostUIShim::FromID(gpu_host_id); 25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ui_shim) { 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_shim->Send(new AcceleratedSurfaceMsg_BufferPresented(route_id, 25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params)); 25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 25782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::SendSwapCompositorFrameAck( 25792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 route_id, int renderer_host_id, const cc::CompositorFrameAck& ack) { 25802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderProcessHost* host = RenderProcessHost::FromID(renderer_host_id); 25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host) 25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->Send(new ViewMsg_SwapCompositorFrameAck(route_id, ack)); 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::AcknowledgeSwapBuffersToRenderer() { 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_threaded_compositing_enabled_) 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SwapBuffers_ACK(routing_id_)); 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ParentChanged(gfx::NativeViewId new_parent) { 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND hwnd = reinterpret_cast<HWND>(new_parent); 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hwnd) 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hwnd = WebPluginDelegateImpl::GetDefaultWindowParent(); 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::list<HWND>::iterator i = dummy_windows_for_activation_.begin(); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != dummy_windows_for_activation_.end(); ++i) { 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetParent(*i, hwnd); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::DelayedAutoResized() { 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size new_size = new_auto_size_; 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the new_auto_size_ since the empty value is used as a flag to 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicate that no callback is in progress (i.e. without this line 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DelayedAutoResized will not get called again). 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_auto_size_.SetSize(0, 0); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!should_auto_resize_) 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRenderAutoResized(new_size); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::DetachDelegate() { 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = NULL; 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderWidgetHostImpl::ComputeTouchLatency( 2623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ui::LatencyInfo& latency_info) { 2624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::LatencyInfo::LatencyComponent ui_component; 2625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::LatencyInfo::LatencyComponent rwh_component; 2626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::LatencyInfo::LatencyComponent acked_component; 2627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 2629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0, 2630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &ui_component) || 2631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_RWH_COMPONENT, 2632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetLatencyComponentId(), 2633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &rwh_component)) 2634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 2635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(ui_component.event_count == 1); 2637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(rwh_component.event_count == 1); 2638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeDelta ui_delta = 2640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rwh_component.event_time - ui_component.event_time; 2641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rendering_stats_.touch_ui_count++; 2642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rendering_stats_.total_touch_ui_latency += ui_delta; 2643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UMA_HISTOGRAM_CUSTOM_COUNTS( 2644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "Event.Latency.Browser.TouchUI", 2645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui_delta.InMicroseconds(), 2646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0, 2647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 20000, 2648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100); 2649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_ACKED_COMPONENT, 2651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0, 2652eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &acked_component)) { 2653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(acked_component.event_count == 1); 2654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeDelta acked_delta = 2655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch acked_component.event_time - rwh_component.event_time; 2656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rendering_stats_.touch_acked_count++; 2657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rendering_stats_.total_touch_acked_latency += acked_delta; 2658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UMA_HISTOGRAM_CUSTOM_COUNTS( 2659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "Event.Latency.Browser.TouchAcked", 2660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch acked_delta.InMicroseconds(), 2661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0, 2662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1000000, 2663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100); 2664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (CommandLine::ForCurrentProcess()->HasSwitch( 2667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switches::kEnableGpuBenchmarking)) 2668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Send(new ViewMsg_SetBrowserRenderingStats(routing_id_, rendering_stats_)); 2669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 267190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetHostImpl::FrameSwapped(const ui::LatencyInfo& latency_info) { 26727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::LatencyInfo::LatencyComponent rwh_component; 26737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_RWH_COMPONENT, 26747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetLatencyComponentId(), 26757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &rwh_component)) 2676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 2677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 26787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch rendering_stats_.input_event_count += rwh_component.event_count; 2679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) rendering_stats_.total_input_latency += 26807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch rwh_component.event_count * 26817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (latency_info.swap_timestamp - rwh_component.event_time); 26827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 26837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::LatencyInfo::LatencyComponent original_component; 26847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (latency_info.FindLatency( 26857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT, 26867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetLatencyComponentId(), 26877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &original_component)) { 26887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // This UMA metric tracks the time from when the original touch event is 26897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // created (averaged if there are multiple) to when the scroll gesture 26907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // results in final frame swap. 26917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::TimeDelta delta = 26927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch latency_info.swap_timestamp - original_component.event_time; 26937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UMA_HISTOGRAM_CUSTOM_COUNTS( 26947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "Event.Latency.TouchToScrollUpdateSwap", 26957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delta.InMicroseconds(), 26967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 0, 26977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1000000, 26987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 100); 26997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch rendering_stats_.scroll_update_count += original_component.event_count; 27007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch rendering_stats_.total_scroll_update_latency += 27017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch original_component.event_count * 27027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (latency_info.swap_timestamp - original_component.event_time); 27037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2704868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 2706868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) switches::kEnableGpuBenchmarking)) 2707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Send(new ViewMsg_SetBrowserRenderingStats(routing_id_, rendering_stats_)); 2708868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 27107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostImpl::DidReceiveRendererFrame() { 27117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch view_->DidReceiveRendererFrame(); 27127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 27137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// static 2715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RenderWidgetHostImpl::CompositorFrameDrawn( 2716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const ui::LatencyInfo& latency_info) { 2717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ui::LatencyInfo::LatencyMap::const_iterator b = 2718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) latency_info.latency_components.begin(); 2719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) b != latency_info.latency_components.end(); 2720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ++b) { 27217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (b->first.first != ui::INPUT_EVENT_LATENCY_RWH_COMPONENT) 2722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) continue; 2723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Matches with GetLatencyComponentId 2724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int routing_id = b->first.second & 0xffffffff; 2725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int process_id = (b->first.second >> 32) & 0xffffffff; 2726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderWidgetHost* rwh = 2727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderWidgetHost::FromID(process_id, routing_id); 2728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!rwh) 2729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) continue; 2730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RenderWidgetHostImpl::From(rwh)->FrameSwapped(latency_info); 2731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2732b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 2733b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 2735