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, ¶m)) 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