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>
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/auto_reset.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/containers/hash_tables.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h"
17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/lazy_instance.h"
189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/thread_task_runner_handle.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/base/switches.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame_ack.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/accessibility/accessibility_mode_helper.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_state_impl.h"
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest.h"
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/browser/gpu/compositor_util.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_process_host.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_process_host_ui_shim.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_surface_tracker.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/dip_util.h"
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/input/input_router_config_helper.h"
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/input_router_impl.h"
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/renderer_host/input/synthetic_gesture.h"
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/renderer_host/input/synthetic_gesture_controller.h"
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/renderer_host/input/synthetic_gesture_target.h"
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/timeout_monitor.h"
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/renderer_host/input/touch_emulator.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_helper.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_delegate.h"
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_base.h"
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/renderer_host/render_widget_resize_helper.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/content_constants_internal.h"
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/common/cursors/webcursor.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_messages.h"
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/common/host_shared_bitmap_manager.h"
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/render_widget_host_iterator.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/result_codes.h"
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/web_preferences.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/image_operations.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h"
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size_conversions.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skbitmap_operations.h"
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h"
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/snapshot/snapshot.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_WIN)
74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/common/plugin_constants_win.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeTicks;
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent;
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent;
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebKeyboardEvent;
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent;
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent;
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTextDirection;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool g_check_for_pending_resize_ack = true;
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef std::pair<int32, int32> RenderWidgetHostID;
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef base::hash_map<RenderWidgetHostID, RenderWidgetHostImpl*>
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    RoutingIDWidgetMap;
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)base::LazyInstance<RoutingIDWidgetMap> g_routing_id_widget_map =
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LAZY_INSTANCE_INITIALIZER;
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int GetInputRouterViewFlagsFromCompositorFrameMetadata(
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const cc::CompositorFrameMetadata metadata) {
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int view_flags = InputRouter::VIEW_FLAGS_NONE;
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (metadata.min_page_scale_factor == metadata.max_page_scale_factor)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_flags |= InputRouter::FIXED_PAGE_SCALE;
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const float window_width_dip = std::ceil(
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      metadata.page_scale_factor * metadata.scrollable_viewport_size.width());
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const float content_width_css = metadata.root_layer_size.width();
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (content_width_css <= window_width_dip)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_flags |= InputRouter::MOBILE_VIEWPORT;
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return view_flags;
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Implements the RenderWidgetHostIterator interface. It keeps a list of
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// RenderWidgetHosts, and makes sure it returns a live RenderWidgetHost at each
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// iteration (or NULL if there isn't any left).
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class RenderWidgetHostIteratorImpl : public RenderWidgetHostIterator {
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RenderWidgetHostIteratorImpl()
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : current_index_(0) {
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~RenderWidgetHostIteratorImpl() {
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void Add(RenderWidgetHost* host) {
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    hosts_.push_back(RenderWidgetHostID(host->GetProcess()->GetID(),
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                        host->GetRoutingID()));
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // RenderWidgetHostIterator:
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual RenderWidgetHost* GetNextHost() OVERRIDE {
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    RenderWidgetHost* host = NULL;
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    while (current_index_ < hosts_.size() && !host) {
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      RenderWidgetHostID id = hosts_[current_index_];
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      host = RenderWidgetHost::FromID(id.first, id.second);
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ++current_index_;
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return host;
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<RenderWidgetHostID> hosts_;
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  size_t current_index_;
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostIteratorImpl);
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostImpl
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           RenderProcessHost* process,
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           int routing_id,
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           bool hidden)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : view_(NULL),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      renderer_initialized_(false),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hung_renderer_delay_ms_(kHungRendererDelayMs),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(delegate),
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      process_(process),
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      routing_id_(routing_id),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      surface_id_(0),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_loading_(false),
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      is_hidden_(hidden),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      repaint_ack_pending_(false),
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resize_ack_pending_(false),
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      screen_info_out_of_date_(false),
170e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba      auto_resize_enabled_(false),
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_screen_rects_ack_(false),
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      needs_repainting_on_restore_(false),
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_unresponsive_(false),
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in_flight_event_count_(0),
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in_get_backing_store_(false),
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ignore_input_events_(false),
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      input_method_active_(false),
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_direction_updated_(false),
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      text_direction_(blink::WebTextDirectionLeftToRight),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_direction_canceled_(false),
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      suppress_next_char_events_(false),
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_mouse_lock_request_(false),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allow_privileged_mouse_lock_(false),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_touch_handler_(false),
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      last_input_number_(static_cast<int64>(GetProcess()->GetID()) << 32),
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      next_browser_snapshot_id_(1),
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      weak_factory_(this) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(delegate_);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (routing_id_ == MSG_ROUTING_NONE) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    routing_id_ = process_->GetNextRoutingID();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForRenderer(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_->GetID(),
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        routing_id_);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(piman): This is a O(N) lookup, where we could forward the
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // information from the RenderWidgetHelper. The problem is that doing so
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // currently leaks outside of content all the way to chrome classes, and
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // would be a layering violation. Since we don't expect more than a few
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // hundreds of RWH, this seems acceptable. Revisit if performance become a
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // problem, for example by tracking in the RenderWidgetHelper the routing id
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (and surface id) that have been created, but whose RWH haven't yet.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    surface_id_ = GpuSurfaceTracker::Get()->LookupSurfaceForRenderer(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_->GetID(),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        routing_id_);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(surface_id_);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::pair<RoutingIDWidgetMap::iterator, bool> result =
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      g_routing_id_widget_map.Get().insert(std::make_pair(
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          RenderWidgetHostID(process->GetID(), routing_id_), this));
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CHECK(result.second) << "Inserting a duplicate item!";
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  process_->AddRoute(routing_id_, this);
2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // If we're initially visible, tell the process host that we're alive.
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Otherwise we'll notify the process host when we are first shown.
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!hidden)
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    process_->WidgetRestored();
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  input_router_.reset(new InputRouterImpl(
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      process_, this, this, routing_id_, GetInputRouterConfigForPlatform()));
221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
222a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  touch_emulator_.reset();
223a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      IsRenderView() ? RenderViewHost::From(this) : NULL);
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (BrowserPluginGuest::IsGuest(rvh) ||
2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      !base::CommandLine::ForCurrentProcess()->HasSwitch(
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          switches::kDisableHangMonitor)) {
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    hang_monitor_timeout_.reset(new TimeoutMonitor(
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        base::Bind(&RenderWidgetHostImpl::RendererIsUnresponsive,
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   weak_factory_.GetWeakPtr())));
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostImpl::~RenderWidgetHostImpl() {
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (view_weak_)
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_weak_->RenderWidgetHostGone();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetView(NULL);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuSurfaceTracker::Get()->RemoveSurface(surface_id_);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  surface_id_ = 0;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  process_->RemoveRoute(routing_id_);
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  g_routing_id_widget_map.Get().erase(
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      RenderWidgetHostID(process_->GetID(), routing_id_));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RenderWidgetDeleted(this);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRenderWidgetHost* RenderWidgetHost::FromID(
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int32 process_id,
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int32 routing_id) {
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return RenderWidgetHostImpl::FromID(process_id, routing_id);
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRenderWidgetHostImpl* RenderWidgetHostImpl::FromID(
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int32 process_id,
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int32 routing_id) {
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RoutingIDWidgetMap* widgets = g_routing_id_widget_map.Pointer();
264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RoutingIDWidgetMap::iterator it = widgets->find(
265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      RenderWidgetHostID(process_id, routing_id));
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return it == widgets->end() ? NULL : it->second;
267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<RenderWidgetHostIterator> RenderWidgetHost::GetRenderWidgetHosts() {
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RenderWidgetHostIteratorImpl* hosts = new RenderWidgetHostIteratorImpl();
272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RoutingIDWidgetMap* widgets = g_routing_id_widget_map.Pointer();
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (RoutingIDWidgetMap::const_iterator it = widgets->begin();
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       it != widgets->end();
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       ++it) {
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    RenderWidgetHost* widget = it->second;
2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (!widget->IsRenderView()) {
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      hosts->Add(widget);
2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      continue;
2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Add only active RenderViewHosts.
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    RenderViewHost* rvh = RenderViewHost::From(widget);
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (RenderViewHostImpl::IsRVHStateActive(
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            static_cast<RenderViewHostImpl*>(rvh)->rvh_state()))
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      hosts->Add(widget);
2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return scoped_ptr<RenderWidgetHostIterator>(hosts);
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static
29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<RenderWidgetHostIterator>
29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)RenderWidgetHostImpl::GetAllRenderWidgetHosts() {
29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RenderWidgetHostIteratorImpl* hosts = new RenderWidgetHostIteratorImpl();
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RoutingIDWidgetMap* widgets = g_routing_id_widget_map.Pointer();
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for (RoutingIDWidgetMap::const_iterator it = widgets->begin();
2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch       it != widgets->end();
3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch       ++it) {
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    hosts->Add(it->second);
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return scoped_ptr<RenderWidgetHostIterator>(hosts);
305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostImpl* RenderWidgetHostImpl::From(RenderWidgetHost* rwh) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rwh->AsRenderWidgetHostImpl();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RenderWidgetHostImpl::SetView(RenderWidgetHostViewBase* view) {
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (view)
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_weak_ = view->GetWeakPtr();
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_weak_.reset();
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  view_ = view;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  GpuSurfaceTracker::Get()->SetSurfaceHandle(
32023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      surface_id_, GetCompositingSurface());
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  synthetic_gesture_controller_.reset();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* RenderWidgetHostImpl::GetProcess() const {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return process_;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderWidgetHostImpl::GetRoutingID() const {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return routing_id_;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* RenderWidgetHostImpl::GetView() const {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return view_;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostImpl* RenderWidgetHostImpl::AsRenderWidgetHostImpl() {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeViewId RenderWidgetHostImpl::GetNativeViewId() const {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return view_->GetNativeViewId();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::GLSurfaceHandle RenderWidgetHostImpl::GetCompositingSurface() {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return view_->GetCompositingSurface();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::GLSurfaceHandle();
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ResetSizeAndRepaintPendingFlags() {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resize_ack_pending_ = false;
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (repaint_ack_pending_) {
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_ASYNC_END0(
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this);
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  repaint_ack_pending_ = false;
360e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  if (old_resize_params_)
361e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    old_resize_params_->new_size = gfx::Size();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SendScreenRects() {
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!renderer_initialized_ || waiting_for_screen_rects_ack_)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_hidden_) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // On GTK, this comes in for backgrounded tabs. Ignore, to match what
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // happens on Win & Mac, and when the view is shown it'll call this again.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!view_)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_view_screen_rect_ = view_->GetViewBounds();
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_window_screen_rect_ = view_->GetBoundsInRootWindow();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_UpdateScreenRects(
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRoutingID(), last_view_screen_rect_, last_window_screen_rect_));
38190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (delegate_)
38290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    delegate_->DidSendScreenRects(this);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_screen_rects_ack_ = true;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::SuppressNextCharEvents() {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suppress_next_char_events_ = true;
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
39068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void RenderWidgetHostImpl::FlushInput() {
39168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  input_router_->Flush();
392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (synthetic_gesture_controller_)
393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    synthetic_gesture_controller_->Flush(base::TimeTicks::Now());
394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostImpl::SetNeedsFlush() {
397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (view_)
398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    view_->OnSetNeedsFlushInput();
39968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
40068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Init() {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(process_->HasConnection());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_initialized_ = true;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuSurfaceTracker::Get()->SetSurfaceHandle(
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      surface_id_, GetCompositingSurface());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the ack along with the information on placement.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_CreatingNew_ACK(routing_id_));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetProcess()->ResumeRequestsForView(routing_id_);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WasResized();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Shutdown() {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RejectMouseLockOrUnlockIfNecessary();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (process_->HasConnection()) {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tell the renderer object to close.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool rv = Send(new ViewMsg_Close(routing_id_));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(rv);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Destroy();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::IsLoading() const {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_loading_;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::IsRenderView() const {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::OnMessageReceived(const IPC::Message &msg) {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostImpl, msg)
439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    IPC_MESSAGE_HANDLER(InputHostMsg_QueueSyntheticGesture,
440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        OnQueueSyntheticGesture)
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    IPC_MESSAGE_HANDLER(InputHostMsg_ImeCancelComposition,
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        OnImeCancelComposition)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RenderViewReady, OnRenderViewReady)
4447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(ViewHostMsg_RenderProcessGone, OnRenderProcessGone)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_Close, OnClose)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateScreenRects_ACK,
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnUpdateScreenRectsAck)
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RequestMove, OnRequestMove)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnSetTooltipText)
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER_GENERIC(ViewHostMsg_SwapCompositorFrame,
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                OnSwapCompositorFrame(msg))
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidStopFlinging, OnFlingingStopped)
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateRect, OnUpdateRect)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_Focus, OnFocus)
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_Blur, OnBlur)
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_SetCursor, OnSetCursor)
4571675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    IPC_MESSAGE_HANDLER(ViewHostMsg_TextInputTypeChanged,
4581675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                        OnTextInputTypeChanged)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_LockMouse, OnLockMouse)
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UnlockMouse, OnUnlockMouse)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ShowDisambiguationPopup,
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnShowDisambiguationPopup)
463effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnSelectionChanged)
464effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionBoundsChanged,
465effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        OnSelectionBoundsChanged)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_WindowlessPluginDummyWindowCreated,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnWindowlessPluginDummyWindowCreated)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_WindowlessPluginDummyWindowDestroyed,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnWindowlessPluginDummyWindowDestroyed)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
472a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_MACOSX) || defined(USE_AURA)
473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    IPC_MESSAGE_HANDLER(InputHostMsg_ImeCompositionRangeChanged,
4747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnImeCompositionRangeChanged)
4757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
479ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!handled && input_router_ && input_router_->OnMessageReceived(msg))
480ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return true;
481ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!handled && view_ && view_->OnMessageReceived(msg))
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::Send(IPC::Message* msg) {
489ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (IPC_MESSAGE_ID_CLASS(msg->type()) == InputMsgStart)
49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return input_router_->SendInput(make_scoped_ptr(msg));
491ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return process_->Send(msg);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderWidgetHostImpl::SetIsLoading(bool is_loading) {
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  is_loading_ = is_loading;
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!view_)
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  view_->SetIsLoading(is_loading);
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::WasHidden() {
5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (is_hidden_)
5043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_hidden_ = true;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't bother reporting hung state when we aren't active.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopHangMonitorTimeout();
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we have a renderer, then inform it that we are being hidden so it can
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reduce its resource utilization.
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_WasHidden(routing_id_));
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the RenderProcessHost we were hidden.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->WidgetHidden();
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_visible = false;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<RenderWidgetHost>(this),
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Details<bool>(&is_visible));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderWidgetHostImpl::WasShown(const ui::LatencyInfo& latency_info) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_hidden_)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_hidden_ = false;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendScreenRects();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Always repaint on restore.
5330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool needs_repainting = true;
5340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  needs_repainting_on_restore_ = false;
5356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Send(new ViewMsg_WasShown(routing_id_, needs_repainting, latency_info));
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->WidgetRestored();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_visible = true;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<RenderWidgetHost>(this),
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Details<bool>(&is_visible));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It's possible for our size to be out of sync with the renderer. The
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // following is one case that leads to this:
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. WasResized -> Send ViewMsg_Resize to render
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. WasResized -> do nothing as resize_ack_pending_ is true
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3. WasHidden
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 4. OnUpdateRect from (1) processed. Does NOT invoke WasResized as view
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    is hidden. Now renderer/browser out of sync with what they think size
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    is.
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // By invoking WasResized the renderer is updated as necessary. WasResized
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // does nothing if the sizes are already in sync.
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: ideally ViewMsg_WasShown would take a size. This way, the renderer
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // could handle both the restore and resize at once. This isn't that big a
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deal as RenderWidget::WasShown delays updating, so that the resize from
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WasResized is usually processed before the renderer is painted.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WasResized();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
563e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosibavoid RenderWidgetHostImpl::GetResizeParams(
564e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    ViewMsg_Resize_Params* resize_params) {
565e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  *resize_params = ViewMsg_Resize_Params();
566e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba
567e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  if (!screen_info_) {
568e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    screen_info_.reset(new blink::WebScreenInfo);
569e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    GetWebScreenInfo(screen_info_.get());
570e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  }
571e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  resize_params->screen_info = *screen_info_;
572e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  resize_params->resizer_rect = GetRootWindowResizerRect();
573e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba
574e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  if (view_) {
575e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    resize_params->new_size = view_->GetRequestedRendererSize();
576e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    resize_params->physical_backing_size = view_->GetPhysicalBackingSize();
577e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    resize_params->top_controls_layout_height =
578e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba        view_->GetTopControlsLayoutHeight();
579e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    resize_params->visible_viewport_size = view_->GetVisibleViewportSize();
580e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    resize_params->is_fullscreen = IsFullscreen();
581e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  }
582e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba}
583e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba
584e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosibavoid RenderWidgetHostImpl::SetInitialRenderSizeParams(
585e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    const ViewMsg_Resize_Params& resize_params) {
586e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  // We don't expect to receive an ACK when the requested size or the physical
587e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  // backing size is empty, or when the main viewport size didn't change.
588e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  if (!resize_params.new_size.IsEmpty() &&
589e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba      !resize_params.physical_backing_size.IsEmpty()) {
590e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    resize_ack_pending_ = g_check_for_pending_resize_ack;
591e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  }
592e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba
593e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  old_resize_params_ =
594e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba      make_scoped_ptr(new ViewMsg_Resize_Params(resize_params));
595e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba}
596e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::WasResized() {
5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Skip if the |delegate_| has already been detached because
5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // it's web contents is being deleted.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (resize_ack_pending_ || !process_->HasConnection() || !view_ ||
601e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba      !renderer_initialized_ || auto_resize_enabled_ || !delegate_) {
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  bool size_changed = true;
606e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  bool side_payload_changed = screen_info_out_of_date_;
607e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  scoped_ptr<ViewMsg_Resize_Params> params(new ViewMsg_Resize_Params);
608e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba
609e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  GetResizeParams(params.get());
610e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  if (old_resize_params_) {
611e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    size_changed = old_resize_params_->new_size != params->new_size;
612e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    side_payload_changed =
613e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba        side_payload_changed ||
614e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba        old_resize_params_->physical_backing_size !=
615e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba            params->physical_backing_size ||
616e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba        old_resize_params_->is_fullscreen != params->is_fullscreen ||
617e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba        old_resize_params_->top_controls_layout_height !=
618e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba            params->top_controls_layout_height ||
619e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba        old_resize_params_->visible_viewport_size !=
620e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba            params->visible_viewport_size;
621e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!size_changed && !side_payload_changed)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We don't expect to receive an ACK when the requested size or the physical
62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // backing size is empty, or when the main viewport size didn't change.
628e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  if (!params->new_size.IsEmpty() && !params->physical_backing_size.IsEmpty() &&
629e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba      size_changed) {
630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resize_ack_pending_ = g_check_for_pending_resize_ack;
631e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  }
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
633e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  if (!Send(new ViewMsg_Resize(routing_id_, *params))) {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resize_ack_pending_ = false;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
636e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba    old_resize_params_.swap(params);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ResizeRectChanged(const gfx::Rect& new_rect) {
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_ChangeResizeRect(routing_id_, new_rect));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::GotFocus() {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Focus();
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Focus() {
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Send(new InputMsg_SetFocus(routing_id_, true));
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Blur() {
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there is a pending mouse lock request, we don't want to reject it at
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this point. The user can switch focus back to this view and approve the
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request later.
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsMouseLocked())
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->UnlockMouse();
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
659a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (touch_emulator_)
660a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    touch_emulator_->CancelTouch();
661a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Send(new InputMsg_SetFocus(routing_id_, false));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::LostCapture() {
666a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (touch_emulator_)
667a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    touch_emulator_->CancelTouch();
668a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Send(new InputMsg_MouseCaptureLost(routing_id_));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetActive(bool active) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SetActive(routing_id_, active));
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::LostMouseLock() {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_MouseLockLost(routing_id_));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ViewDestroyed() {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RejectMouseLockOrUnlockIfNecessary();
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(evanm): tracking this may no longer be necessary;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // eliminate this function if so.
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetView(NULL);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::CopyFromBackingStore(
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& src_subrect,
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Size& accelerated_dst_size,
691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const base::Callback<void(bool, const SkBitmap&)>& callback,
692116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const SkColorType color_type) {
693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (view_) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT0("browser",
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "RenderWidgetHostImpl::CopyFromBackingStore::FromCompositingSurface");
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect accelerated_copy_rect = src_subrect.IsEmpty() ?
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gfx::Rect(view_->GetViewBounds().size()) : src_subrect;
698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    view_->CopyFromCompositingSurface(
699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        accelerated_copy_rect, accelerated_dst_size, callback, color_type);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  callback.Run(false, SkBitmap());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool RenderWidgetHostImpl::CanCopyFromBackingStore() {
70723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (view_)
70823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return view_->IsSurfaceAvailableForCopy();
70923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return false;
71023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
71123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
71223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(OS_ANDROID)
71323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void RenderWidgetHostImpl::LockBackingStore() {
71423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (view_)
71523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    view_->LockCompositingSurface();
71623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
71723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
71823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void RenderWidgetHostImpl::UnlockBackingStore() {
71923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (view_)
72023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    view_->UnlockCompositingSurface();
72123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
72223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif
72323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX)
72523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void RenderWidgetHostImpl::PauseForPendingResizeOrRepaints() {
72623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TRACE_EVENT0("browser",
72723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      "RenderWidgetHostImpl::PauseForPendingResizeOrRepaints");
72823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
729c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!CanPauseForPendingResizeOrRepaints())
730c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
731c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
7320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  WaitForSurface();
733c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
734c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
735c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool RenderWidgetHostImpl::CanPauseForPendingResizeOrRepaints() {
73623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Do not pause if the view is hidden.
73723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (is_hidden())
738c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
73923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
74023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Do not pause if there is not a paint or resize already coming.
741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!repaint_ack_pending_ && !resize_ack_pending_)
742c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
74323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
744c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return true;
74523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
74623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid RenderWidgetHostImpl::WaitForSurface() {
7480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TRACE_EVENT0("browser", "RenderWidgetHostImpl::WaitForSurface");
7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // How long to (synchronously) wait for the renderer to respond with a
751116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // new frame when our current frame doesn't exist or is the wrong size.
752116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // This timeout impacts the "choppiness" of our window resize.
753116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int kPaintMsgTimeoutMS = 50;
754116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!view_)
7560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The view_size will be current_size_ for auto-sized views and otherwise the
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // size of the view_. (For auto-sized views, current_size_ is updated during
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UpdateRect messages.)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size view_size = current_size_;
762e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  if (!auto_resize_enabled_) {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get the desired size from the current view bounds.
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect view_rect = view_->GetViewBounds();
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (view_rect.IsEmpty())
7660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_size = view_rect.size();
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TRACE_EVENT2("renderer_host",
7710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               "RenderWidgetHostImpl::WaitForBackingStore",
7720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               "width",
7730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               base::IntToString(view_size.width()),
7740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               "height",
7750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               base::IntToString(view_size.height()));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should not be asked to paint while we are hidden.  If we are hidden,
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then it means that our consumer failed to call WasShown. If we're not
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // force creating the backing store, it's OK since we can feel free to give
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // out our cached one if we have it.
7810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(!is_hidden_) << "WaitForSurface called while hidden!";
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should never be called recursively; this can theoretically lead to
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // infinite recursion and almost certainly leads to lower performance.
7850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(!in_get_backing_store_) << "WaitForSurface called recursively!";
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::AutoReset<bool> auto_reset_in_get_backing_store(
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &in_get_backing_store_, true);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // We might have a surface that we can use!
7900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (view_->HasAcceleratedSurface(view_size))
7910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do not have a suitable backing store in the cache, so send out a
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request to the renderer to paint the view if required.
795cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!repaint_ack_pending_ && !resize_ack_pending_) {
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repaint_start_time_ = TimeTicks::Now();
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repaint_ack_pending_ = true;
798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN0(
799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new ViewMsg_Repaint(routing_id_, view_size));
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta max_delay = TimeDelta::FromMilliseconds(kPaintMsgTimeoutMS);
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks end_time = TimeTicks::Now() + max_delay;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
8060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    TRACE_EVENT0("renderer_host", "WaitForSurface::WaitForUpdate");
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When we have asked the RenderWidget to resize, and we are still waiting
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // on a response, block for a little while to see if we can't get a response
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // before returning the old (incorrectly sized) backing store.
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message msg;
812116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (RenderWidgetResizeHelper::Get()->WaitForSingleTaskToRun(max_delay)) {
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // For auto-resized views, current_size_ determines the view_size and it
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // may have changed during the handling of an UpdateRect message.
816e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba      if (auto_resize_enabled_)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        view_size = current_size_;
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Break now if we got a backing store or accelerated surface of the
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // correct size.
821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (view_->HasAcceleratedSurface(view_size))
8220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        return;
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
8240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      TRACE_EVENT0("renderer_host", "WaitForSurface::Timeout");
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Loop if we still have time left and haven't gotten a properly sized
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // BackingStore yet. This is necessary to support the GPU path which
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // typically has multiple frames pipelined -- we may need to skip one or two
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // BackingStore messages to get to the latest.
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_delay = end_time - TimeTicks::Now();
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (max_delay > TimeDelta::FromSeconds(0));
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool RenderWidgetHostImpl::ScheduleComposite() {
838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_hidden_ || current_size_.IsEmpty() || repaint_ack_pending_ ||
839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      resize_ack_pending_) {
8403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send out a request to the renderer to paint the view if required.
8443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  repaint_start_time_ = TimeTicks::Now();
8453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  repaint_ack_pending_ = true;
8463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TRACE_EVENT_ASYNC_BEGIN0(
8473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this);
8483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Send(new ViewMsg_Repaint(routing_id_, current_size_));
8493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return true;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
852a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostImpl::StartHangMonitorTimeout(base::TimeDelta delay) {
853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (hang_monitor_timeout_)
854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    hang_monitor_timeout_->Start(delay);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RestartHangMonitorTimeout() {
858a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (hang_monitor_timeout_)
859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    hang_monitor_timeout_->Restart(
860a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(hung_renderer_delay_ms_));
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::StopHangMonitorTimeout() {
864a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (hang_monitor_timeout_)
865a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    hang_monitor_timeout_->Stop();
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererIsResponsive();
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ForwardMouseEvent(const WebMouseEvent& mouse_event) {
8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ForwardMouseEventWithLatencyInfo(mouse_event, ui::LatencyInfo());
871b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
872b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
873b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void RenderWidgetHostImpl::ForwardMouseEventWithLatencyInfo(
8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const blink::WebMouseEvent& mouse_event,
8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const ui::LatencyInfo& ui_latency) {
876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  TRACE_EVENT2("input", "RenderWidgetHostImpl::ForwardMouseEvent",
8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               "x", mouse_event.x, "y", mouse_event.y);
8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::LatencyInfo::InputCoordinate logical_coordinate(mouse_event.x,
8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      mouse_event.y);
8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::LatencyInfo latency_info = CreateRWHLatencyInfoIfNotExist(
8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      &ui_latency, mouse_event.type, &logical_coordinate, 1);
883424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
884424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < mouse_event_callbacks_.size(); ++i) {
8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (mouse_event_callbacks_[i].Run(mouse_event))
886424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return;
887424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
888424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
8894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IgnoreInputEvents())
8904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
8914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
892a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (touch_emulator_ && touch_emulator_->HandleMouseEvent(mouse_event))
893a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
894a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_router_->SendMouseEvent(MouseEventWithLatencyInfo(mouse_event,
8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                          latency_info));
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::OnPointerEventActivate() {
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ForwardWheelEvent(
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebMouseWheelEvent& wheel_event) {
9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ForwardWheelEventWithLatencyInfo(wheel_event, ui::LatencyInfo());
905b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
906b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
907b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void RenderWidgetHostImpl::ForwardWheelEventWithLatencyInfo(
9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const blink::WebMouseWheelEvent& wheel_event,
9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const ui::LatencyInfo& ui_latency) {
910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardWheelEvent");
9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::LatencyInfo::InputCoordinate logical_coordinate(wheel_event.x,
9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      wheel_event.y);
9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::LatencyInfo latency_info = CreateRWHLatencyInfoIfNotExist(
9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      &ui_latency, wheel_event.type, &logical_coordinate, 1);
9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IgnoreInputEvents())
9194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
9204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
921a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (touch_emulator_ && touch_emulator_->HandleMouseWheelEvent(wheel_event))
922a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
923a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo(wheel_event,
9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                               latency_info));
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ForwardGestureEvent(
929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebGestureEvent& gesture_event) {
930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ForwardGestureEventWithLatencyInfo(gesture_event, ui::LatencyInfo());
931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderWidgetHostImpl::ForwardGestureEventWithLatencyInfo(
934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebGestureEvent& gesture_event,
935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const ui::LatencyInfo& ui_latency) {
936868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardGestureEvent");
937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Early out if necessary, prior to performing latency logic.
938ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (IgnoreInputEvents())
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (delegate_->PreHandleGestureEvent(gesture_event))
9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::LatencyInfo::InputCoordinate logical_coordinate(gesture_event.x,
9451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      gesture_event.y);
9461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::LatencyInfo latency_info = CreateRWHLatencyInfoIfNotExist(
9481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      &ui_latency, gesture_event.type, &logical_coordinate, 1);
9497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (gesture_event.type == blink::WebInputEvent::GestureScrollUpdate) {
9517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    latency_info.AddLatencyNumber(
9527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_RWH_COMPONENT,
9537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        GetLatencyComponentId(),
9547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ++last_input_number_);
9557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
9567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Make a copy of the INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT with a
9577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // different name INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT.
9587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // So we can track the latency specifically for scroll update events.
9597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ui::LatencyInfo::LatencyComponent original_component;
9607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT,
9617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 0,
9627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 &original_component)) {
9637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      latency_info.AddLatencyNumberWithTimestamp(
9647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT,
9657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          GetLatencyComponentId(),
9667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          original_component.sequence_number,
9677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          original_component.event_time,
9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          original_component.event_count);
9697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
9707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
971b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
972ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  GestureEventWithLatencyInfo gesture_with_latency(gesture_event, latency_info);
973ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  input_router_->SendGestureEvent(gesture_with_latency);
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderWidgetHostImpl::ForwardEmulatedTouchEvent(
977a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const blink::WebTouchEvent& touch_event) {
9785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardEmulatedTouchEvent");
9791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::LatencyInfo::InputCoordinate
9811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      logical_coordinates[ui::LatencyInfo::kMaxInputCoordinates];
9821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t logical_coordinates_size =
9831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      std::min(arraysize(logical_coordinates),
9841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               static_cast<size_t>(touch_event.touchesLength));
9851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < logical_coordinates_size; i++) {
9861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    logical_coordinates[i] = ui::LatencyInfo::InputCoordinate(
9871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        touch_event.touches[i].position.x, touch_event.touches[i].position.y);
9881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::LatencyInfo latency_info = CreateRWHLatencyInfoIfNotExist(
9911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NULL, touch_event.type, logical_coordinates, logical_coordinates_size);
9925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TouchEventWithLatencyInfo touch_with_latency(touch_event, latency_info);
9935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_router_->SendTouchEvent(touch_with_latency);
994a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
995a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
996ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderWidgetHostImpl::ForwardTouchEventWithLatencyInfo(
997f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebTouchEvent& touch_event,
998ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const ui::LatencyInfo& ui_latency) {
999868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardTouchEvent");
10008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
10018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Always forward TouchEvents for touch stream consistency. They will be
10028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // ignored if appropriate in FilterInputEvent().
10034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::LatencyInfo::InputCoordinate
10051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      logical_coordinates[ui::LatencyInfo::kMaxInputCoordinates];
10061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t logical_coordinates_size =
10071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      std::min(arraysize(logical_coordinates),
10081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               static_cast<size_t>(touch_event.touchesLength));
10091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < logical_coordinates_size; i++) {
10101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    logical_coordinates[i] = ui::LatencyInfo::InputCoordinate(
10111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        touch_event.touches[i].position.x, touch_event.touches[i].position.y);
10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
10131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::LatencyInfo latency_info =
10151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateRWHLatencyInfoIfNotExist(&ui_latency,
10161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     touch_event.type,
10171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     logical_coordinates,
10181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     logical_coordinates_size);
1019ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  TouchEventWithLatencyInfo touch_with_latency(touch_event, latency_info);
10205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (touch_emulator_ &&
10225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      touch_emulator_->HandleTouchEvent(touch_with_latency.event)) {
10235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (view_) {
10245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      view_->ProcessAckedTouchEvent(
10255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          touch_with_latency, INPUT_EVENT_ACK_STATE_CONSUMED);
10265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
10275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
10285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
10295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1030ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  input_router_->SendTouchEvent(touch_with_latency);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ForwardKeyboardEvent(
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NativeWebKeyboardEvent& key_event) {
1035868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardKeyboardEvent");
10364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IgnoreInputEvents())
10374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
10384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!process_->HasConnection())
10404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
10414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // First, let keypress listeners take a shot at handling the event.  If a
10434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // listener handles the event, it should not be propagated to the renderer.
10444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (KeyPressListenersHandleEvent(key_event)) {
10454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Some keypresses that are accepted by the listener might have follow up
10464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // char events, which should be ignored.
10474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (key_event.type == WebKeyboardEvent::RawKeyDown)
10484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      suppress_next_char_events_ = true;
10494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
10504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
10514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (key_event.type == WebKeyboardEvent::Char &&
10534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      (key_event.windowsKeyCode == ui::VKEY_RETURN ||
10544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       key_event.windowsKeyCode == ui::VKEY_SPACE)) {
10554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    OnUserGesture();
10564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
10574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Double check the type to make sure caller hasn't sent us nonsense that
10594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // will mess up our key queue.
10604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!WebInputEvent::isKeyboardEventType(key_event.type))
10614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
10624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (suppress_next_char_events_) {
10644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // If preceding RawKeyDown event was handled by the browser, then we need
10654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // suppress all Char events generated by it. Please note that, one
10664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // RawKeyDown event may generate multiple Char events, so we can't reset
10674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // |suppress_next_char_events_| until we get a KeyUp or a RawKeyDown.
10684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (key_event.type == WebKeyboardEvent::Char)
10694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
10704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // We get a KeyUp or a RawKeyDown event.
10714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    suppress_next_char_events_ = false;
10724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
10734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool is_shortcut = false;
10754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Only pre-handle the key event if it's not handled by the input method.
10774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (delegate_ && !key_event.skip_in_browser) {
10784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // We need to set |suppress_next_char_events_| to true if
10794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // PreHandleKeyboardEvent() returns true, but |this| may already be
10804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // destroyed at that time. So set |suppress_next_char_events_| true here,
10814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // then revert it afterwards when necessary.
10824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (key_event.type == WebKeyboardEvent::RawKeyDown)
10834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      suppress_next_char_events_ = true;
10844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Tab switching/closing accelerators aren't sent to the renderer to avoid
10864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // a hung/malicious renderer from interfering.
10874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (delegate_->PreHandleKeyboardEvent(key_event, &is_shortcut))
10884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
10894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (key_event.type == WebKeyboardEvent::RawKeyDown)
10914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      suppress_next_char_events_ = false;
10924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
10934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1094a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (touch_emulator_ && touch_emulator_->HandleKeyboardEvent(key_event))
1095a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
1096a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_router_->SendKeyboardEvent(
10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      key_event,
10991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateRWHLatencyInfoIfNotExist(NULL, key_event.type, NULL, 0),
11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_shortcut);
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostImpl::QueueSyntheticGesture(
1104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    scoped_ptr<SyntheticGesture> synthetic_gesture,
1105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const base::Callback<void(SyntheticGesture::Result)>& on_complete) {
1106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!synthetic_gesture_controller_ && view_) {
1107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    synthetic_gesture_controller_.reset(
1108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        new SyntheticGestureController(
1109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            view_->CreateSyntheticGestureTarget().Pass()));
1110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (synthetic_gesture_controller_) {
1112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    synthetic_gesture_controller_->QueueSyntheticGesture(
1113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        synthetic_gesture.Pass(), on_complete);
1114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid RenderWidgetHostImpl::SetCursor(const WebCursor& cursor) {
1118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!view_)
1119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
1120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  view_->UpdateCursor(cursor);
1121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
11235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderWidgetHostImpl::ShowContextMenuAtPoint(const gfx::Point& point) {
11245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Send(new ViewMsg_ShowContextMenu(
11255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GetRoutingID(), ui::MENU_SOURCE_MOUSE, point));
11265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
11275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetHostImpl::SendCursorVisibilityState(bool is_visible) {
1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Send(new InputMsg_CursorVisibilityChange(GetRoutingID(), is_visible));
1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1132b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int64 RenderWidgetHostImpl::GetLatencyComponentId() {
1133b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return GetRoutingID() | (static_cast<int64>(GetProcess()->GetID()) << 32);
1134b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// static
1137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RenderWidgetHostImpl::DisableResizeAckCheckForTesting() {
1138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  g_check_for_pending_resize_ack = false;
1139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
11417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochui::LatencyInfo RenderWidgetHostImpl::CreateRWHLatencyInfoIfNotExist(
11421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ui::LatencyInfo* original,
11431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WebInputEvent::Type type,
11441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ui::LatencyInfo::InputCoordinate* logical_coordinates,
11451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size_t logical_coordinates_size) {
114690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::LatencyInfo info;
11477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (original)
11487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    info = *original;
11497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // In Aura, gesture event will already carry its original touch event's
11507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // INPUT_EVENT_LATENCY_RWH_COMPONENT.
11514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!info.FindLatency(ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
115290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        GetLatencyComponentId(),
11537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        NULL)) {
11544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
11557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          GetLatencyComponentId(),
11567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          ++last_input_number_);
11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    info.TraceEventType(WebInputEventTraits::GetName(type));
11581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Convert logical coordinates to physical coordinates, based on the
11601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // device scale factor.
11611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    float device_scale_factor =
11621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        screen_info_ ? screen_info_->deviceScaleFactor : 1;
11631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(logical_coordinates_size <= ui::LatencyInfo::kMaxInputCoordinates);
11641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    info.input_coordinates_size = logical_coordinates_size;
11651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (size_t i = 0; i < info.input_coordinates_size; i++) {
11661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      info.input_coordinates[i].x =
11671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          logical_coordinates[i].x * device_scale_factor;
11681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      info.input_coordinates[i].y =
11691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          logical_coordinates[i].y * device_scale_factor;
11701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
11717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
11721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return info;
1174b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1175b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RenderWidgetHostImpl::AddKeyPressEventCallback(
1178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const KeyPressEventCallback& callback) {
1179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  key_press_event_callbacks_.push_back(callback);
1180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RenderWidgetHostImpl::RemoveKeyPressEventCallback(
1183424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const KeyPressEventCallback& callback) {
1184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < key_press_event_callbacks_.size(); ++i) {
1185424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (key_press_event_callbacks_[i].Equals(callback)) {
1186424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      key_press_event_callbacks_.erase(
1187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          key_press_event_callbacks_.begin() + i);
1188424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return;
1189424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
1190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1192424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1193424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RenderWidgetHostImpl::AddMouseEventCallback(
1194424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const MouseEventCallback& callback) {
1195424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  mouse_event_callbacks_.push_back(callback);
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1198424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RenderWidgetHostImpl::RemoveMouseEventCallback(
1199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const MouseEventCallback& callback) {
1200424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < mouse_event_callbacks_.size(); ++i) {
1201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (mouse_event_callbacks_[i].Equals(callback)) {
1202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      mouse_event_callbacks_.erase(mouse_event_callbacks_.begin() + i);
1203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return;
1204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
1205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostImpl::GetWebScreenInfo(blink::WebScreenInfo* result) {
12097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::GetWebScreenInfo");
1210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (view_)
1211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    view_->GetScreenInfo(result);
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
1213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RenderWidgetHostViewBase::GetDefaultScreenInfo(result);
12143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  screen_info_out_of_date_ = false;
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const NativeWebKeyboardEvent*
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderWidgetHostImpl::GetLastKeyboardEvent() const {
1219ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return input_router_->GetLastKeyboardEvent();
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::NotifyScreenInfoChanged() {
122390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The resize message (which may not happen immediately) will carry with it
122490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // the screen info as well as the new size (if the screen has changed scale
122590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // factor).
1226a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  InvalidateScreenInfo();
122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WasResized();
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1230a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid RenderWidgetHostImpl::InvalidateScreenInfo() {
12313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  screen_info_out_of_date_ = true;
1232a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  screen_info_.reset();
1233a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
1234a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
1235116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderWidgetHostImpl::GetSnapshotFromBrowser(
1236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::Callback<void(const unsigned char*,size_t)> callback) {
1237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int id = next_browser_snapshot_id_++;
1238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pending_browser_snapshots_.insert(std::make_pair(id, callback));
1239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Send(new ViewMsg_ForceRedraw(GetRoutingID(), id));
1240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderWidgetHostImpl::OnSelectionChanged(const base::string16& text,
1243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                              size_t offset,
1244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                              const gfx::Range& range) {
1245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (view_)
1246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    view_->SelectionChanged(text, offset, range);
1247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderWidgetHostImpl::OnSelectionBoundsChanged(
1250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ViewHostMsg_SelectionBounds_Params& params) {
1251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (view_) {
1252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    view_->SelectionBoundsChanged(params);
1253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::UpdateVSyncParameters(base::TimeTicks timebase,
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 base::TimeDelta interval) {
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_UpdateVSyncParameters(GetRoutingID(), timebase, interval));
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RendererExited(base::TerminationStatus status,
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          int exit_code) {
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clearing this flag causes us to re-create the renderer when recovering
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from a crashed renderer.
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_initialized_ = false;
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_screen_rects_ack_ = false;
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Must reset these to ensure that keyboard events work with a new renderer.
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suppress_next_char_events_ = false;
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset some fields in preparation for recovering from a crash.
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetSizeAndRepaintPendingFlags();
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_size_.SetSize(0, 0);
12756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // After the renderer crashes, the view is destroyed and so the
12766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // RenderWidgetHost cannot track its visibility anymore. We assume such
12776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // RenderWidgetHost to be visible for the sake of internal accounting - be
12786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // careful about changing this - see http://crbug.com/401859.
12796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //
12806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // We need to at least make sure that the RenderProcessHost is notified about
12816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // the |is_hidden_| change, so that the renderer will have correct visibility
12826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // set when respawned.
12831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (is_hidden_) {
12846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    process_->WidgetRestored();
12856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    is_hidden_ = false;
12866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset this to ensure the hung renderer mechanism is working properly.
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_flight_event_count_ = 0;
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_) {
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuSurfaceTracker::Get()->SetSurfaceHandle(surface_id_,
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               gfx::GLSurfaceHandle());
12947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    view_->RenderProcessGone(status, exit_code);
12951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_ = NULL; // The View should be deleted by RenderProcessGone.
12961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_weak_.reset();
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Reconstruct the input router to ensure that it has fresh state for a new
13005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // renderer. Otherwise it may be stuck waiting for the old renderer to ack an
13015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // event. (In particular, the above call to view_->RenderProcessGone will
13025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // destroy the aura window, which may dispatch a synthetic mouse move.)
13035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_router_.reset(new InputRouterImpl(
13045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      process_, this, this, routing_id_, GetInputRouterConfigForPlatform()));
13055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  synthetic_gesture_controller_.reset();
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::UpdateTextDirection(WebTextDirection direction) {
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  text_direction_updated_ = true;
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  text_direction_ = direction;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::CancelUpdateTextDirection() {
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (text_direction_updated_)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_direction_canceled_ = true;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::NotifyTextDirection() {
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (text_direction_updated_) {
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!text_direction_canceled_)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Send(new ViewMsg_SetTextDirection(GetRoutingID(), text_direction_));
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_direction_updated_ = false;
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_direction_canceled_ = false;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetInputMethodActive(bool activate) {
13297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  input_method_active_ = activate;
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SetInputMethodActive(GetRoutingID(), activate));
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostImpl::CandidateWindowShown() {
1334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Send(new ViewMsg_CandidateWindowShown(GetRoutingID()));
1335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostImpl::CandidateWindowUpdated() {
1338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Send(new ViewMsg_CandidateWindowUpdated(GetRoutingID()));
1339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostImpl::CandidateWindowHidden() {
1342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Send(new ViewMsg_CandidateWindowHidden(GetRoutingID()));
1343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ImeSetComposition(
1346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& text,
1347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::vector<blink::WebCompositionUnderline>& underlines,
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int selection_start,
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int selection_end) {
1350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Send(new InputMsg_ImeSetComposition(
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRoutingID(), text, underlines, selection_start, selection_end));
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ImeConfirmComposition(
1355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& text,
135658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const gfx::Range& replacement_range,
13577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool keep_selection) {
1358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Send(new InputMsg_ImeConfirmComposition(
13597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        GetRoutingID(), text, replacement_range, keep_selection));
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ImeCancelComposition() {
1363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Send(new InputMsg_ImeSetComposition(GetRoutingID(), base::string16(),
1364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            std::vector<blink::WebCompositionUnderline>(), 0, 0));
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderWidgetHostImpl::GetRootWindowResizerRect() const {
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Rect();
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RequestToLockMouse(bool user_gesture,
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              bool last_unlocked_by_target) {
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Directly reject to lock the mouse. Subclass can override this method to
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // decide whether to allow mouse lock or not.
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GotResponseToLockMouseRequest(false);
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RejectMouseLockOrUnlockIfNecessary() {
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!pending_mouse_lock_request_ || !IsMouseLocked());
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pending_mouse_lock_request_) {
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_mouse_lock_request_ = false;
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new ViewMsg_LockMouse_ACK(routing_id_, false));
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (IsMouseLocked()) {
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->UnlockMouse();
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::IsMouseLocked() const {
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return view_ ? view_->IsMouseLocked() : false;
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::IsFullscreen() const {
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1396e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosibavoid RenderWidgetHostImpl::SetAutoResize(bool enable,
1397e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba                                         const gfx::Size& min_size,
1398e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba                                         const gfx::Size& max_size) {
1399e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  auto_resize_enabled_ = enable;
1400e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  min_size_for_auto_resize_ = min_size;
1401e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  max_size_for_auto_resize_ = max_size;
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::Destroy() {
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<RenderWidgetHost>(this),
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NotificationService::NoDetails());
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the view to die.
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that in the process of the view shutting down, it can call a ton
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of other messages on us.  So if you do any other deinitialization here,
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // do it after this call to view_->Destroy().
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->Destroy();
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderWidgetHostImpl::RendererIsUnresponsive() {
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
1422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      NOTIFICATION_RENDER_WIDGET_HOST_HANG,
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<RenderWidgetHost>(this),
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NotificationService::NoDetails());
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_unresponsive_ = true;
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyRendererUnresponsive();
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::RendererIsResponsive() {
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_unresponsive_) {
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_unresponsive_ = false;
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyRendererResponsive();
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnRenderViewReady() {
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendScreenRects();
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WasResized();
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostImpl::OnRenderProcessGone(int status, int exit_code) {
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(evanm): This synchronously ends up calling "delete this".
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Is that really what we want in response to this message?  I'm matching
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // previous behavior of the code here.
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Destroy();
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnClose() {
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shutdown();
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnSetTooltipText(
1453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& tooltip_text,
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebTextDirection text_direction_hint) {
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First, add directionality marks around tooltip text if necessary.
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A naive solution would be to simply always wrap the text. However, on
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // windows, Unicode directional embedding characters can't be displayed on
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // systems that lack RTL fonts and are instead displayed as empty squares.
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To get around this we only wrap the string when we deem it necessary i.e.
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the locale direction is different than the tooltip direction hint.
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently, we use element's directionality as the tooltip direction hint.
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An alternate solution would be to set the overall directionality based on
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // trying to detect the directionality from the tooltip text rather than the
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // element direction.  One could argue that would be a preferable solution
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but we use the current approach to match Fx & IE's behavior.
1468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 wrapped_tooltip_text = tooltip_text;
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!tooltip_text.empty()) {
1470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (text_direction_hint == blink::WebTextDirectionLeftToRight) {
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Force the tooltip to have LTR directionality.
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wrapped_tooltip_text =
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::i18n::GetDisplayStringInLTRDirectionality(wrapped_tooltip_text);
1474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    } else if (text_direction_hint == blink::WebTextDirectionRightToLeft &&
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               !base::i18n::IsRTL()) {
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Force the tooltip to have RTL directionality.
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::i18n::WrapStringWithRTLFormatting(&wrapped_tooltip_text);
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetView())
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->SetTooltipText(wrapped_tooltip_text);
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnUpdateScreenRectsAck() {
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_screen_rects_ack_ = false;
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!view_)
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_->GetViewBounds() == last_view_screen_rect_ &&
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      view_->GetBoundsInRootWindow() == last_window_screen_rect_) {
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendScreenRects();
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnRequestMove(const gfx::Rect& pos) {
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_) {
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->SetBounds(pos);
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new ViewMsg_Move_ACK(routing_id_));
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostImpl::OnSwapCompositorFrame(
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const IPC::Message& message) {
1506c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // This trace event is used in
1507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // chrome/browser/extensions/api/cast_streaming/performance_test.cc
15081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT0("test_fps",
15091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               TRACE_DISABLED_BY_DEFAULT("OnSwapCompositorFrame"));
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ViewHostMsg_SwapCompositorFrame::Param param;
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ViewHostMsg_SwapCompositorFrame::Read(&message, &param))
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
1514ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  uint32 output_surface_id = param.a;
1515ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  param.b.AssignTo(frame.get());
15165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<IPC::Message> messages_to_deliver_with_frame;
15175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  messages_to_deliver_with_frame.swap(param.c);
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < frame->metadata.latency_info.size(); i++)
15205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AddLatencyInfoComponentIds(&frame->metadata.latency_info[i]);
15215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_router_->OnViewUpdated(
15235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetInputRouterViewFlagsFromCompositorFrameMetadata(frame->metadata));
1524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (view_) {
1526ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    view_->OnSwapCompositorFrame(output_surface_id, frame.Pass());
15277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    view_->DidReceiveRendererFrame();
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cc::CompositorFrameAck ack;
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (frame->gl_frame_data) {
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ack.gl_frame_data = frame->gl_frame_data.Pass();
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ack.gl_frame_data->sync_point = 0;
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (frame->delegated_frame_data) {
15343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      cc::TransferableResource::ReturnResources(
15353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          frame->delegated_frame_data->resource_list,
15363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          &ack.resources);
1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (frame->software_frame_data) {
1538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ack.last_software_frame_id = frame->software_frame_data->id;
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SendSwapCompositorFrameAck(routing_id_, output_surface_id,
15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               process_->GetID(), ack);
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderProcessHost* rph = GetProcess();
15455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (std::vector<IPC::Message>::const_iterator i =
15465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)           messages_to_deliver_with_frame.begin();
15475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       i != messages_to_deliver_with_frame.end();
15485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       ++i) {
15495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    rph->OnMessageReceived(*i);
15505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (i->dispatch_error())
15515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      rph->OnBadMessageReceived(*i);
15525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
15535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  messages_to_deliver_with_frame.clear();
15545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostImpl::OnFlingingStopped() {
15595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (view_)
15605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->DidStopFlinging();
15615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
15625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnUpdateRect(
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_UpdateRect_Params& params) {
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::OnUpdateRect");
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks paint_start = TimeTicks::Now();
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update our knowledge of the RenderWidget's size.
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_size_ = params.view_size;
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_resize_ack =
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags);
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resize_ack_pending_ needs to be cleared before we call DidPaintRect, since
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that will end up reaching GetBackingStore.
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_resize_ack) {
1577868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DCHECK(!g_check_for_pending_resize_ack || resize_ack_pending_);
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resize_ack_pending_ = false;
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_repaint_ack =
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ViewHostMsg_UpdateRect_Flags::is_repaint_ack(params.flags);
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_repaint_ack) {
1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(repaint_ack_pending_);
1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_ASYNC_END0(
1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this);
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    repaint_ack_pending_ = false;
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TimeDelta delta = TimeTicks::Now() - repaint_start_time_;
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta);
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!params.view_size.IsEmpty());
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DidUpdateBackingStore(params, paint_start);
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1596e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  if (auto_resize_enabled_) {
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool post_callback = new_auto_size_.IsEmpty();
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_auto_size_ = params.view_size;
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (post_callback) {
1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::current()->PostTask(
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&RenderWidgetHostImpl::DelayedAutoResized,
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     weak_factory_.GetWeakPtr()));
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Log the time delta for processing a paint message. On platforms that don't
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // support asynchronous painting, this is equivalent to
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MPArch.RWH_TotalPaintTime.
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta delta = TimeTicks::Now() - paint_start;
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_TIMES("MPArch.RWH_OnMsgUpdateRect", delta);
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::DidUpdateBackingStore(
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_UpdateRect_Params& params,
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TimeTicks& paint_start) {
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::DidUpdateBackingStore");
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks update_start = TimeTicks::Now();
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move the plugins if the view hasn't already been destroyed.  Plugin moves
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will not be re-issued, so must move them now, regardless of whether we
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // paint or not.  MovePluginWindows attempts to move the plugin windows and
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the process could dispatch other window messages which could cause the
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // view to be destroyed.
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
16265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    view_->MovePluginWindows(params.plugin_window_moves);
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE,
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<RenderWidgetHost>(this),
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NotificationService::NoDetails());
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't need to update the view if the view is hidden. We must do this
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // early return after the ACK is sent, however, or the renderer will not send
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // us more data.
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_hidden_)
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we got a resize ack, then perhaps we have another resize to send?
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_resize_ack =
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags);
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_resize_ack)
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WasResized();
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Log the time delta for processing a paint message.
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks now = TimeTicks::Now();
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta delta = now - update_start;
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_TIMES("MPArch.RWH_DidUpdateBackingStore", delta);
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetHostImpl::OnQueueSyntheticGesture(
1652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const SyntheticGesturePacket& gesture_packet) {
1653effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Only allow untrustworthy gestures if explicitly enabled.
16546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
1655effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          cc::switches::kEnableGpuBenchmarking)) {
1656effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    RecordAction(base::UserMetricsAction("BadMessageTerminate_RWH7"));
1657effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    GetProcess()->ReceivedBadMessage();
1658effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
1659effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1660effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QueueSyntheticGesture(
1662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        SyntheticGesture::Create(*gesture_packet.gesture_params()),
1663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&RenderWidgetHostImpl::OnSyntheticGestureCompleted,
1664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
166558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
166658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnFocus() {
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only RenderViewHost can deal with that message.
16695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RecordAction(base::UserMetricsAction("BadMessageTerminate_RWH4"));
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetProcess()->ReceivedBadMessage();
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnBlur() {
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only RenderViewHost can deal with that message.
16755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RecordAction(base::UserMetricsAction("BadMessageTerminate_RWH5"));
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetProcess()->ReceivedBadMessage();
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnSetCursor(const WebCursor& cursor) {
1680a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  SetCursor(cursor);
1681a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1682a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
168303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void RenderWidgetHostImpl::SetTouchEventEmulationEnabled(bool enabled) {
1684a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (enabled) {
1685a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (!touch_emulator_)
1686a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      touch_emulator_.reset(new TouchEmulator(this));
168703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    touch_emulator_->Enable();
1688a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } else {
1689a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (touch_emulator_)
1690a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      touch_emulator_->Disable();
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16941675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochvoid RenderWidgetHostImpl::OnTextInputTypeChanged(
16951675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    ui::TextInputType type,
16961675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    ui::TextInputMode input_mode,
16971675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    bool can_compose_inline) {
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
16991675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    view_->TextInputTypeChanged(type, input_mode, can_compose_inline);
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1702a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_MACOSX) || defined(USE_AURA)
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnImeCompositionRangeChanged(
170458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const gfx::Range& range,
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<gfx::Rect>& character_bounds) {
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->ImeCompositionRangeChanged(range, character_bounds);
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnImeCancelComposition() {
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->ImeCancelComposition();
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnLockMouse(bool user_gesture,
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       bool last_unlocked_by_target,
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       bool privileged) {
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pending_mouse_lock_request_) {
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new ViewMsg_LockMouse_ACK(routing_id_, false));
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (IsMouseLocked()) {
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new ViewMsg_LockMouse_ACK(routing_id_, true));
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_mouse_lock_request_ = true;
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (privileged && allow_privileged_mouse_lock_) {
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Directly approve to lock the mouse.
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GotResponseToLockMouseRequest(true);
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RequestToLockMouse(user_gesture, last_unlocked_by_target);
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnUnlockMouse() {
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RejectMouseLockOrUnlockIfNecessary();
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::OnShowDisambiguationPopup(
17421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::Rect& rect_pixels,
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Size& size,
17440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const cc::SharedBitmapId& id) {
17451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!rect_pixels.IsEmpty());
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!size.IsEmpty());
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<cc::SharedBitmap> bitmap =
17490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      HostSharedBitmapManager::current()->GetSharedBitmapFromId(size, id);
17500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!bitmap) {
17515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RecordAction(base::UserMetricsAction("BadMessageTerminate_RWH6"));
17525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GetProcess()->ReceivedBadMessage();
17535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
17545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
17555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
17560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(bitmap->pixels());
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1758116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SkImageInfo info = SkImageInfo::MakeN32Premul(size.width(), size.height());
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap zoomed_bitmap;
1760116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  zoomed_bitmap.installPixels(info, bitmap->pixels(), info.minRowBytes());
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_ANDROID) || defined(TOOLKIT_VIEWS)
17631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Note that |rect| is in coordinates of pixels relative to the window origin.
17641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Aura-based systems will want to convert this to DIPs.
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
17661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_->ShowDisambiguationPopup(rect_pixels, zoomed_bitmap);
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // It is assumed that the disambiguation popup will make a copy of the
17721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // provided zoomed image, so we delete this one.
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zoomed_bitmap.setPixels(0);
17740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Send(new ViewMsg_ReleaseDisambiguationPopupBitmap(GetRoutingID(), id));
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::OnWindowlessPluginDummyWindowCreated(
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::NativeViewId dummy_activation_window) {
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND hwnd = reinterpret_cast<HWND>(dummy_activation_window);
1781ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1782ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This may happen as a result of a race condition when the plugin is going
1783ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // away.
1784ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  wchar_t window_title[MAX_PATH + 1] = {0};
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsWindow(hwnd) ||
1786ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      !GetWindowText(hwnd, window_title, arraysize(window_title)) ||
1787ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      lstrcmpiW(window_title, kDummyActivationWindowName) != 0) {
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(USE_AURA)
1792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetParent(hwnd,
1793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            reinterpret_cast<HWND>(view_->GetParentForWindowlessPlugin()));
17945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
17955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetParent(hwnd, reinterpret_cast<HWND>(GetNativeViewId()));
17965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_windows_for_activation_.push_back(hwnd);
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::OnWindowlessPluginDummyWindowDestroyed(
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::NativeViewId dummy_activation_window) {
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND hwnd = reinterpret_cast<HWND>(dummy_activation_window);
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<HWND>::iterator i = dummy_windows_for_activation_.begin();
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; i != dummy_windows_for_activation_.end(); ++i) {
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*i) == hwnd) {
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dummy_windows_for_activation_.erase(i);
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() << "Unknown dummy window";
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetIgnoreInputEvents(bool ignore_input_events) {
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ignore_input_events_ = ignore_input_events;
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetHostImpl::KeyPressListenersHandleEvent(
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NativeWebKeyboardEvent& event) {
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.skip_in_browser || event.type != WebKeyboardEvent::RawKeyDown)
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1823424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < key_press_event_callbacks_.size(); i++) {
18240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    size_t original_size = key_press_event_callbacks_.size();
1825424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (key_press_event_callbacks_[i].Run(event))
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
18270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
18280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Check whether the callback that just ran removed itself, in which case
18290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // the iterator needs to be decremented to properly account for the removal.
18300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    size_t current_size = key_press_event_callbacks_.size();
18310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (current_size != original_size) {
18320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      DCHECK_EQ(original_size - 1, current_size);
18330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      --i;
18340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1840ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochInputEventAckState RenderWidgetHostImpl::FilterInputEvent(
1841f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebInputEvent& event, const ui::LatencyInfo& latency_info) {
18428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Don't ignore touch cancel events, since they may be sent while input
18438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // events are being ignored in order to keep the renderer from getting
18448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // confused about how many touches are active.
18458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (IgnoreInputEvents() && event.type != WebInputEvent::TouchCancel)
18464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS;
18474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!process_->HasConnection())
1849ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return INPUT_EVENT_ACK_STATE_UNKNOWN;
18504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (event.type == WebInputEvent::MouseDown)
18524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    OnUserGesture();
1853ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1854ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return view_ ? view_->FilterInputEvent(event)
1855ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch               : INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
1856ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1857ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1858ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderWidgetHostImpl::IncrementInFlightEventCount() {
1859ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  StartHangMonitorTimeout(
1860ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      TimeDelta::FromMilliseconds(hung_renderer_delay_ms_));
1861ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  increment_in_flight_event_count();
1862ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1864ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderWidgetHostImpl::DecrementInFlightEventCount() {
186546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_GE(in_flight_event_count_, 0);
18661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (decrement_in_flight_event_count() <= 0) {
18671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Cancel pending hung renderer checks since the renderer is responsive.
1868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    StopHangMonitorTimeout();
18691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
18701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // The renderer is responsive, but there are in-flight events to wait for.
18711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RestartHangMonitorTimeout();
18721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1873ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1875ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderWidgetHostImpl::OnHasTouchEventHandlers(bool has_handlers) {
1876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  has_touch_handler_ = has_handlers;
1877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1878ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
187958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void RenderWidgetHostImpl::DidFlush() {
1880c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (synthetic_gesture_controller_)
1881c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    synthetic_gesture_controller_->OnDidFlushInput();
188268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (view_)
188368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    view_->OnDidFlushInput();
188458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
188558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1886cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderWidgetHostImpl::DidOverscroll(const DidOverscrollParams& params) {
1887cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (view_)
1888cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    view_->DidOverscroll(params);
1889cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1890cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1891ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderWidgetHostImpl::OnKeyboardEventAck(
1892ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const NativeWebKeyboardEvent& event,
1893ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      InputEventAckState ack_result) {
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1895ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!is_hidden() && view_ && view_->PostProcessEventForPluginIme(event))
1896ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1899ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // We only send unprocessed key event upwards if we are not hidden,
1900ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // because the user has moved away from us and no longer expect any effect
1901ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // of this key event.
1902ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const bool processed = (INPUT_EVENT_ACK_STATE_CONSUMED == ack_result);
1903ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (delegate_ && !processed && !is_hidden() && !event.skip_in_browser) {
1904ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    delegate_->HandleKeyboardEvent(event);
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1906ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // WARNING: This RenderWidgetHostImpl can be deallocated at this point
1907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // (i.e.  in the case of Ctrl+W, where the call to
1908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // HandleKeyboardEvent destroys this RenderWidgetHostImpl).
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1912ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderWidgetHostImpl::OnWheelEventAck(
19134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const MouseWheelEventWithLatencyInfo& wheel_event,
1914ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    InputEventAckState ack_result) {
19154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!wheel_event.latency.FindLatency(
19164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, NULL)) {
19174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // MouseWheelEvent latency ends when it is acked but does not cause any
19184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // rendering scheduled.
19194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ui::LatencyInfo latency = wheel_event.latency;
19204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    latency.AddLatencyNumber(
19214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ui::INPUT_EVENT_LATENCY_TERMINATED_MOUSE_COMPONENT, 0, 0);
19224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1923ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
192446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!is_hidden() && view_) {
192546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (ack_result != INPUT_EVENT_ACK_STATE_CONSUMED &&
192646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        delegate_->HandleWheelEvent(wheel_event.event)) {
192746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ack_result = INPUT_EVENT_ACK_STATE_CONSUMED;
192846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
192946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    view_->WheelEventAck(wheel_event.event, ack_result);
1930a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1931ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1932ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1933ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderWidgetHostImpl::OnGestureEventAck(
19344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const GestureEventWithLatencyInfo& event,
1935ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    InputEventAckState ack_result) {
19364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!event.latency.FindLatency(
19374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, NULL)) {
19384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // GestureEvent latency ends when it is acked but does not cause any
19394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // rendering scheduled.
19404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ui::LatencyInfo latency = event.latency;
19414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    latency.AddLatencyNumber(
19424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ui::INPUT_EVENT_LATENCY_TERMINATED_GESTURE_COMPONENT, 0 ,0);
19434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1944ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1945effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (ack_result != INPUT_EVENT_ACK_STATE_CONSUMED) {
1946effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (delegate_->HandleGestureEvent(event.event))
1947effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ack_result = INPUT_EVENT_ACK_STATE_CONSUMED;
1948effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1949effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1950ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (view_)
19515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->GestureEventAck(event.event, ack_result);
1952ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1953ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1954ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderWidgetHostImpl::OnTouchEventAck(
1955ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const TouchEventWithLatencyInfo& event,
1956ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    InputEventAckState ack_result) {
19574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TouchEventWithLatencyInfo touch_event = event;
19584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  touch_event.latency.AddLatencyNumber(
19594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ui::INPUT_EVENT_LATENCY_ACKED_TOUCH_COMPONENT, 0, 0);
19605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TouchEvent latency ends at ack if it didn't cause any rendering.
19615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!touch_event.latency.FindLatency(
19625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, NULL)) {
19635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    touch_event.latency.AddLatencyNumber(
19645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ui::INPUT_EVENT_LATENCY_TERMINATED_TOUCH_COMPONENT, 0, 0);
19655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
19664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ComputeTouchLatency(touch_event.latency);
1967a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
19685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (touch_emulator_ &&
19695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      touch_emulator_->HandleTouchEventAck(event.event, ack_result)) {
1970a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
19715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1972a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1973ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (view_)
19744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    view_->ProcessAckedTouchEvent(touch_event, ack_result);
1975ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1976ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
197758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void RenderWidgetHostImpl::OnUnexpectedEventAck(UnexpectedEventAckType type) {
197858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (type == BAD_ACK_MESSAGE) {
19795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RecordAction(base::UserMetricsAction("BadMessageTerminate_RWH2"));
1980ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    process_->ReceivedBadMessage();
198158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  } else if (type == UNEXPECTED_EVENT_TYPE) {
198258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    suppress_next_char_events_ = false;
1983ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1984ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1985ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1986a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderWidgetHostImpl::OnSyntheticGestureCompleted(
1987a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SyntheticGesture::Result result) {
1988a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Send(new InputMsg_SyntheticGestureCompleted(GetRoutingID()));
1989a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1990a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1991ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool RenderWidgetHostImpl::IgnoreInputEvents() const {
1992ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return ignore_input_events_ || process_->IgnoreInputEvents();
1993ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1994ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::ShouldForwardTouchEvent() const {
19965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // It's important that the emulator sees a complete native touch stream,
19975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // allowing it to perform touch filtering as appropriate.
19985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TODO(dgozman): Remove when touch stream forwarding issues resolved, see
19995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // crbug.com/375940.
20005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (touch_emulator_ && touch_emulator_->enabled())
20015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return true;
20025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2003ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return input_router_->ShouldForwardTouchEvent();
2004ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
2005ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::StartUserGesture() {
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnUserGesture();
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2010cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderWidgetHostImpl::SetBackgroundOpaque(bool opaque) {
2011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new ViewMsg_SetBackgroundOpaque(GetRoutingID(), opaque));
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::SetEditCommandsForNextKeyEvent(
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<EditCommand>& commands) {
2016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Send(new InputMsg_SetEditCommandsForNextKeyEvent(GetRoutingID(), commands));
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ExecuteEditCommand(const std::string& command,
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              const std::string& value) {
2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Send(new InputMsg_ExecuteEditCommand(GetRoutingID(), command, value));
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::ScrollFocusedEditableNodeIntoRect(
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect) {
2026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Send(new InputMsg_ScrollFocusedEditableNodeIntoRect(GetRoutingID(), rect));
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::MoveCaret(const gfx::Point& point) {
2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Send(new InputMsg_MoveCaret(GetRoutingID(), point));
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostImpl::GotResponseToLockMouseRequest(bool allowed) {
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!allowed) {
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RejectMouseLockOrUnlockIfNecessary();
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pending_mouse_lock_request_) {
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // This is possible, e.g., the plugin sends us an unlock request before
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the user allows to lock to mouse.
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_mouse_lock_request_ = false;
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!view_ || !view_->HasFocus()|| !view_->LockMouse()) {
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Send(new ViewMsg_LockMouse_ACK(routing_id_, false));
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Send(new ViewMsg_LockMouse_ACK(routing_id_, true));
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::AcknowledgeBufferPresent(
20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32 route_id, int gpu_host_id,
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const AcceleratedSurfaceMsg_BufferPresented_Params& params) {
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuProcessHostUIShim* ui_shim = GpuProcessHostUIShim::FromID(gpu_host_id);
20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ui_shim) {
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_shim->Send(new AcceleratedSurfaceMsg_BufferPresented(route_id,
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                            params));
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetHostImpl::SendSwapCompositorFrameAck(
2068ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int32 route_id,
2069ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    uint32 output_surface_id,
2070ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int renderer_host_id,
2071ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const cc::CompositorFrameAck& ack) {
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderProcessHost* host = RenderProcessHost::FromID(renderer_host_id);
2073ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!host)
2074ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
2075ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  host->Send(new ViewMsg_SwapCompositorFrameAck(
2076ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      route_id, output_surface_id, ack));
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2079d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// static
2080d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void RenderWidgetHostImpl::SendReclaimCompositorResources(
2081d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    int32 route_id,
2082d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    uint32 output_surface_id,
2083d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    int renderer_host_id,
2084d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const cc::CompositorFrameAck& ack) {
2085d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  RenderProcessHost* host = RenderProcessHost::FromID(renderer_host_id);
2086d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!host)
2087d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
2088d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  host->Send(
2089d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      new ViewMsg_ReclaimCompositorResources(route_id, output_surface_id, ack));
2090d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
2091d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::DelayedAutoResized() {
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size new_size = new_auto_size_;
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the new_auto_size_ since the empty value is used as a flag to
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // indicate that no callback is in progress (i.e. without this line
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DelayedAutoResized will not get called again).
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_auto_size_.SetSize(0, 0);
2098e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba  if (!auto_resize_enabled_)
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnRenderAutoResized(new_size);
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostImpl::DetachDelegate() {
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = NULL;
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderWidgetHostImpl::ComputeTouchLatency(
2109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const ui::LatencyInfo& latency_info) {
2110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui::LatencyInfo::LatencyComponent ui_component;
2111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui::LatencyInfo::LatencyComponent rwh_component;
2112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui::LatencyInfo::LatencyComponent acked_component;
2113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_UI_COMPONENT,
2115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                0,
2116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                &ui_component) ||
21174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      !latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
2118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                GetLatencyComponentId(),
2119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                &rwh_component))
2120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
2121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(ui_component.event_count == 1);
2123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(rwh_component.event_count == 1);
2124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::TimeDelta ui_delta =
2126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      rwh_component.event_time - ui_component.event_time;
2127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UMA_HISTOGRAM_CUSTOM_COUNTS(
2128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "Event.Latency.Browser.TouchUI",
2129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ui_delta.InMicroseconds(),
21305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      1,
2131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      20000,
2132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      100);
2133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
21344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_ACKED_TOUCH_COMPONENT,
2135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               0,
2136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               &acked_component)) {
2137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(acked_component.event_count == 1);
2138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::TimeDelta acked_delta =
2139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        acked_component.event_time - rwh_component.event_time;
2140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    UMA_HISTOGRAM_CUSTOM_COUNTS(
2141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "Event.Latency.Browser.TouchAcked",
2142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        acked_delta.InMicroseconds(),
21435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        1,
2144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        1000000,
2145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        100);
2146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
214990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetHostImpl::FrameSwapped(const ui::LatencyInfo& latency_info) {
21504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::LatencyInfo::LatencyComponent window_snapshot_component;
2151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (latency_info.FindLatency(ui::WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT,
21524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                               GetLatencyComponentId(),
21534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                               &window_snapshot_component)) {
2154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WindowOldSnapshotReachedScreen(
21554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        static_cast<int>(window_snapshot_component.sequence_number));
21564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (latency_info.FindLatency(ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT,
2158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               GetLatencyComponentId(),
2159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               &window_snapshot_component)) {
2160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int sequence_number = static_cast<int>(
2161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        window_snapshot_component.sequence_number);
2162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX)
2163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // On Mac, when using CoreAnmation, there is a delay between when content
2164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // is drawn to the screen, and when the snapshot will actually pick up
2165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // that content. Insert a manual delay of 1/6th of a second (to simulate
2166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // 10 frames at 60 fps) before actually taking the snapshot.
2167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::MessageLoop::current()->PostDelayedTask(
2168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        FROM_HERE,
2169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Bind(&RenderWidgetHostImpl::WindowSnapshotReachedScreen,
2170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   weak_factory_.GetWeakPtr(),
2171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   sequence_number),
2172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::TimeDelta::FromSecondsD(1. / 6));
2173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WindowSnapshotReachedScreen(sequence_number);
2175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
21774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::LatencyInfo::LatencyComponent swap_component;
21796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!latency_info.FindLatency(
21806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT,
21816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          0,
21826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          &swap_component)) {
21836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
21846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
21856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui::LatencyInfo::LatencyComponent tab_switch_component;
21866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (latency_info.FindLatency(ui::TAB_SHOW_COMPONENT,
21876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               GetLatencyComponentId(),
21886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               &tab_switch_component)) {
21896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    base::TimeDelta delta =
21906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        swap_component.event_time - tab_switch_component.event_time;
21916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    for (size_t i = 0; i < tab_switch_component.event_count; i++) {
21926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      UMA_HISTOGRAM_TIMES("MPArch.RWH_TabSwitchPaintDuration", delta);
21936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
21946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
21956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
21966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui::LatencyInfo::LatencyComponent rwh_component;
21974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!latency_info.FindLatency(ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
21987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                GetLatencyComponentId(),
21996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                &rwh_component)) {
2200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
22014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
22037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ui::LatencyInfo::LatencyComponent original_component;
22047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (latency_info.FindLatency(
22057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT,
22067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          GetLatencyComponentId(),
22077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          &original_component)) {
22087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // This UMA metric tracks the time from when the original touch event is
22097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // created (averaged if there are multiple) to when the scroll gesture
22107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // results in final frame swap.
22117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::TimeDelta delta =
22124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        swap_component.event_time - original_component.event_time;
2213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    for (size_t i = 0; i < original_component.event_count; i++) {
2214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      UMA_HISTOGRAM_CUSTOM_COUNTS(
2215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          "Event.Latency.TouchToScrollUpdateSwap",
2216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          delta.InMicroseconds(),
22175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          1,
2218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          1000000,
2219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          100);
2220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
22217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
2222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
22247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetHostImpl::DidReceiveRendererFrame() {
22257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  view_->DidReceiveRendererFrame();
22267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
22277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
22285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostImpl::WindowSnapshotAsyncCallback(
22295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int routing_id,
22305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int snapshot_id,
22315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::Size snapshot_size,
22325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<base::RefCountedBytes> png_data) {
22331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!png_data.get()) {
22345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<unsigned char> png_vector;
22355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Send(new ViewMsg_WindowSnapshotCompleted(
22365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        routing_id, snapshot_id, gfx::Size(), png_vector));
22375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
22385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
22395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
22405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Send(new ViewMsg_WindowSnapshotCompleted(
22415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      routing_id, snapshot_id, snapshot_size, png_data->data()));
22425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
22435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2244116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderWidgetHostImpl::WindowOldSnapshotReachedScreen(int snapshot_id) {
22455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(base::MessageLoopForUI::IsCurrent());
22464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<unsigned char> png;
22484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This feature is behind the kEnableGpuBenchmarking command line switch
22504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // because it poses security concerns and should only be used for testing.
22516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const base::CommandLine& command_line =
22526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      *base::CommandLine::ForCurrentProcess();
22535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!command_line.HasSwitch(cc::switches::kEnableGpuBenchmarking)) {
22545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Send(new ViewMsg_WindowSnapshotCompleted(
22555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetRoutingID(), snapshot_id, gfx::Size(), png));
22565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
22574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect view_bounds = GetView()->GetViewBounds();
22605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect snapshot_bounds(view_bounds.size());
22615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Size snapshot_size = snapshot_bounds.size();
22625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
22635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ui::GrabViewSnapshot(
22645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          GetView()->GetNativeView(), &png, snapshot_bounds)) {
22655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Send(new ViewMsg_WindowSnapshotCompleted(
22665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetRoutingID(), snapshot_id, snapshot_size, png));
22675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
22685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
22695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
22705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::GrabViewSnapshotAsync(
22715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetView()->GetNativeView(),
22725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      snapshot_bounds,
22735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ThreadTaskRunnerHandle::Get(),
22745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&RenderWidgetHostImpl::WindowSnapshotAsyncCallback,
22755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
22765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 GetRoutingID(),
22775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 snapshot_id,
22785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 snapshot_size));
22794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
22804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2281116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderWidgetHostImpl::WindowSnapshotReachedScreen(int snapshot_id) {
2282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(base::MessageLoopForUI::IsCurrent());
2283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Rect view_bounds = GetView()->GetViewBounds();
2285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Rect snapshot_bounds(view_bounds.size());
2286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<unsigned char> png;
2288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (ui::GrabViewSnapshot(
2289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetView()->GetNativeView(), &png, snapshot_bounds)) {
2290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    OnSnapshotDataReceived(snapshot_id, &png.front(), png.size());
2291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
2292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui::GrabViewSnapshotAsync(
2295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetView()->GetNativeView(),
2296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      snapshot_bounds,
2297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::ThreadTaskRunnerHandle::Get(),
2298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&RenderWidgetHostImpl::OnSnapshotDataReceivedAsync,
2299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 weak_factory_.GetWeakPtr(),
2300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 snapshot_id));
2301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2303116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderWidgetHostImpl::OnSnapshotDataReceived(int snapshot_id,
2304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                  const unsigned char* data,
2305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                  size_t size) {
2306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Any pending snapshots with a lower ID than the one received are considered
2307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // to be implicitly complete, and returned the same snapshot data.
2308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PendingSnapshotMap::iterator it = pending_browser_snapshots_.begin();
2309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  while(it != pending_browser_snapshots_.end()) {
2310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (it->first <= snapshot_id) {
2311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        it->second.Run(data, size);
2312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        pending_browser_snapshots_.erase(it++);
2313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      } else {
2314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ++it;
2315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      }
2316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2319116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderWidgetHostImpl::OnSnapshotDataReceivedAsync(
2320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int snapshot_id,
2321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<base::RefCountedBytes> png_data) {
23221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (png_data.get())
2323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    OnSnapshotDataReceived(snapshot_id, png_data->front(), png_data->size());
2324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else
2325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    OnSnapshotDataReceived(snapshot_id, NULL, 0);
2326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// static
2329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RenderWidgetHostImpl::CompositorFrameDrawn(
23305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<ui::LatencyInfo>& latency_info) {
23315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < latency_info.size(); i++) {
23325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::set<RenderWidgetHostImpl*> rwhi_set;
23335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (ui::LatencyInfo::LatencyMap::const_iterator b =
23345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             latency_info[i].latency_components.begin();
23355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         b != latency_info[i].latency_components.end();
23365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         ++b) {
23375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (b->first.first == ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT ||
2338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          b->first.first == ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT ||
23396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          b->first.first == ui::WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT ||
23406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          b->first.first == ui::TAB_SHOW_COMPONENT) {
23415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Matches with GetLatencyComponentId
23425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        int routing_id = b->first.second & 0xffffffff;
23435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        int process_id = (b->first.second >> 32) & 0xffffffff;
23445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        RenderWidgetHost* rwh =
23455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            RenderWidgetHost::FromID(process_id, routing_id);
23465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if (!rwh) {
23475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          continue;
23485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        }
23495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rwh);
23505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if (rwhi_set.insert(rwhi).second)
23515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          rwhi->FrameSwapped(latency_info[i]);
23524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      }
23534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2355b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
2356b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
23575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetHostImpl::AddLatencyInfoComponentIds(
23585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::LatencyInfo* latency_info) {
23595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::LatencyInfo::LatencyMap new_components;
23605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::LatencyInfo::LatencyMap::iterator lc =
23615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      latency_info->latency_components.begin();
23625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (lc != latency_info->latency_components.end()) {
23635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::LatencyComponentType component_type = lc->first.first;
2364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (component_type == ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT ||
2365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        component_type == ui::WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT) {
23665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Generate a new component entry with the correct component ID
23675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ui::LatencyInfo::LatencyMap::key_type key =
23685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          std::make_pair(component_type, GetLatencyComponentId());
23695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new_components[key] = lc->second;
23705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
23715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Remove the old entry
23725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      latency_info->latency_components.erase(lc++);
23735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
23745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ++lc;
23755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
23765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
23775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
23785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Add newly generated components into the latency info
23795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (lc = new_components.begin(); lc != new_components.end(); ++lc) {
23805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    latency_info->latency_components[lc->first] = lc->second;
23815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
23825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
23835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2384116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserAccessibilityManager*
2385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RenderWidgetHostImpl::GetRootBrowserAccessibilityManager() {
2386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return delegate_ ? delegate_->GetRootBrowserAccessibilityManager() : NULL;
2387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2389116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserAccessibilityManager*
2390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RenderWidgetHostImpl::GetOrCreateRootBrowserAccessibilityManager() {
2391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return delegate_ ?
2392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      delegate_->GetOrCreateRootBrowserAccessibilityManager() : NULL;
2393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
2396116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::NativeViewAccessible
2397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RenderWidgetHostImpl::GetParentNativeViewAccessible() {
2398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return delegate_ ? delegate_->GetParentNativeViewAccessible() : NULL;
2399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2402116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSkColorType RenderWidgetHostImpl::PreferredReadbackFormat() {
2403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (view_)
2404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return view_->PreferredReadbackFormat();
2405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return kN32_SkColorType;
2406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2409