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, &param))
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