Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Side by Side Diff: content/browser/renderer_host/render_widget_host_impl.cc

Issue 11858007: Splits SmoothGestureController from RenderWidgetHostImpl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adds missing ifdef for aura Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/render_widget_host_impl.h" 5 #include "content/browser/renderer_host/render_widget_host_impl.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 14 matching lines...) Expand all
25 #include "content/browser/gpu/gpu_surface_tracker.h" 25 #include "content/browser/gpu/gpu_surface_tracker.h"
26 #include "content/browser/renderer_host/backing_store.h" 26 #include "content/browser/renderer_host/backing_store.h"
27 #include "content/browser/renderer_host/backing_store_manager.h" 27 #include "content/browser/renderer_host/backing_store_manager.h"
28 #include "content/browser/renderer_host/dip_util.h" 28 #include "content/browser/renderer_host/dip_util.h"
29 #include "content/browser/renderer_host/gesture_event_filter.h" 29 #include "content/browser/renderer_host/gesture_event_filter.h"
30 #include "content/browser/renderer_host/overscroll_controller.h" 30 #include "content/browser/renderer_host/overscroll_controller.h"
31 #include "content/browser/renderer_host/render_process_host_impl.h" 31 #include "content/browser/renderer_host/render_process_host_impl.h"
32 #include "content/browser/renderer_host/render_view_host_impl.h" 32 #include "content/browser/renderer_host/render_view_host_impl.h"
33 #include "content/browser/renderer_host/render_widget_helper.h" 33 #include "content/browser/renderer_host/render_widget_helper.h"
34 #include "content/browser/renderer_host/render_widget_host_delegate.h" 34 #include "content/browser/renderer_host/render_widget_host_delegate.h"
35 #include "content/browser/renderer_host/smooth_scroll_gesture_controller.h"
35 #include "content/browser/renderer_host/touch_event_queue.h" 36 #include "content/browser/renderer_host/touch_event_queue.h"
36 #include "content/browser/renderer_host/touchpad_tap_suppression_controller.h" 37 #include "content/browser/renderer_host/touchpad_tap_suppression_controller.h"
37 #include "content/common/accessibility_messages.h" 38 #include "content/common/accessibility_messages.h"
38 #include "content/common/content_constants_internal.h" 39 #include "content/common/content_constants_internal.h"
39 #include "content/common/gpu/gpu_messages.h" 40 #include "content/common/gpu/gpu_messages.h"
40 #include "content/common/view_messages.h" 41 #include "content/common/view_messages.h"
41 #include "content/port/browser/render_widget_host_view_port.h" 42 #include "content/port/browser/render_widget_host_view_port.h"
42 #include "content/port/browser/smooth_scroll_gesture.h"
43 #include "content/public/browser/compositor_util.h" 43 #include "content/public/browser/compositor_util.h"
44 #include "content/public/browser/native_web_keyboard_event.h" 44 #include "content/public/browser/native_web_keyboard_event.h"
45 #include "content/public/browser/notification_service.h" 45 #include "content/public/browser/notification_service.h"
46 #include "content/public/browser/notification_types.h" 46 #include "content/public/browser/notification_types.h"
47 #include "content/public/browser/user_metrics.h" 47 #include "content/public/browser/user_metrics.h"
48 #include "content/public/common/content_constants.h" 48 #include "content/public/common/content_constants.h"
49 #include "content/public/common/content_switches.h" 49 #include "content/public/common/content_switches.h"
50 #include "content/public/common/result_codes.h" 50 #include "content/public/common/result_codes.h"
51 #include "skia/ext/image_operations.h" 51 #include "skia/ext/image_operations.h"
52 #include "skia/ext/platform_canvas.h" 52 #include "skia/ext/platform_canvas.h"
(...skipping 30 matching lines...) Expand all
83 83
84 namespace content { 84 namespace content {
85 namespace { 85 namespace {
86 86
87 // How long to (synchronously) wait for the renderer to respond with a 87 // How long to (synchronously) wait for the renderer to respond with a
88 // PaintRect message, when our backing-store is invalid, before giving up and 88 // PaintRect message, when our backing-store is invalid, before giving up and
89 // returning a null or incorrectly sized backing-store from GetBackingStore. 89 // returning a null or incorrectly sized backing-store from GetBackingStore.
90 // This timeout impacts the "choppiness" of our window resize perf. 90 // This timeout impacts the "choppiness" of our window resize perf.
91 const int kPaintMsgTimeoutMS = 50; 91 const int kPaintMsgTimeoutMS = 50;
92 92
93 // How many milliseconds apart synthetic scroll messages should be sent.
94 static const int kSyntheticScrollMessageIntervalMs = 8;
95
96 // Returns |true| if the two wheel events should be coalesced. 93 // Returns |true| if the two wheel events should be coalesced.
97 bool ShouldCoalesceMouseWheelEvents(const WebMouseWheelEvent& last_event, 94 bool ShouldCoalesceMouseWheelEvents(const WebMouseWheelEvent& last_event,
98 const WebMouseWheelEvent& new_event) { 95 const WebMouseWheelEvent& new_event) {
99 return last_event.modifiers == new_event.modifiers && 96 return last_event.modifiers == new_event.modifiers &&
100 last_event.scrollByPage == new_event.scrollByPage && 97 last_event.scrollByPage == new_event.scrollByPage &&
101 last_event.hasPreciseScrollingDeltas 98 last_event.hasPreciseScrollingDeltas
102 == new_event.hasPreciseScrollingDeltas && 99 == new_event.hasPreciseScrollingDeltas &&
103 last_event.phase == new_event.phase && 100 last_event.phase == new_event.phase &&
104 last_event.momentumPhase == new_event.momentumPhase; 101 last_event.momentumPhase == new_event.momentumPhase;
105 } 102 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 view_being_painted_(false), 159 view_being_painted_(false),
163 ignore_input_events_(false), 160 ignore_input_events_(false),
164 text_direction_updated_(false), 161 text_direction_updated_(false),
165 text_direction_(WebKit::WebTextDirectionLeftToRight), 162 text_direction_(WebKit::WebTextDirectionLeftToRight),
166 text_direction_canceled_(false), 163 text_direction_canceled_(false),
167 suppress_next_char_events_(false), 164 suppress_next_char_events_(false),
168 pending_mouse_lock_request_(false), 165 pending_mouse_lock_request_(false),
169 allow_privileged_mouse_lock_(false), 166 allow_privileged_mouse_lock_(false),
170 has_touch_handler_(false), 167 has_touch_handler_(false),
171 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), 168 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)),
172 tick_active_smooth_scroll_gestures_task_posted_(false), 169 smooth_scroll_gesture_controller_(new SmoothScrollGestureController()),
173 touch_event_queue_(new TouchEventQueue(this)), 170 touch_event_queue_(new TouchEventQueue(this)),
174 gesture_event_filter_(new GestureEventFilter(this)) { 171 gesture_event_filter_(new GestureEventFilter(this)) {
175 CHECK(delegate_); 172 CHECK(delegate_);
176 if (routing_id_ == MSG_ROUTING_NONE) { 173 if (routing_id_ == MSG_ROUTING_NONE) {
177 routing_id_ = process_->GetNextRoutingID(); 174 routing_id_ = process_->GetNextRoutingID();
178 surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForRenderer( 175 surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForRenderer(
179 process_->GetID(), 176 process_->GetID(),
180 routing_id_); 177 routing_id_);
181 } else { 178 } else {
182 // TODO(piman): This is a O(N) lookup, where we could forward the 179 // TODO(piman): This is a O(N) lookup, where we could forward the
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 return; 289 return;
293 290
294 last_view_screen_rect_ = view_->GetViewBounds(); 291 last_view_screen_rect_ = view_->GetViewBounds();
295 last_window_screen_rect_ = view_->GetBoundsInRootWindow(); 292 last_window_screen_rect_ = view_->GetBoundsInRootWindow();
296 Send(new ViewMsg_UpdateScreenRects( 293 Send(new ViewMsg_UpdateScreenRects(
297 GetRoutingID(), last_view_screen_rect_, last_window_screen_rect_)); 294 GetRoutingID(), last_view_screen_rect_, last_window_screen_rect_));
298 waiting_for_screen_rects_ack_ = true; 295 waiting_for_screen_rects_ack_ = true;
299 } 296 }
300 297
301 int RenderWidgetHostImpl::SyntheticScrollMessageInterval() const { 298 int RenderWidgetHostImpl::SyntheticScrollMessageInterval() const {
302 return kSyntheticScrollMessageIntervalMs; 299 return smooth_scroll_gesture_controller_->SyntheticScrollMessageInterval();
303 } 300 }
304 301
305 void RenderWidgetHostImpl::SetOverscrollControllerEnabled(bool enabled) { 302 void RenderWidgetHostImpl::SetOverscrollControllerEnabled(bool enabled) {
306 if (!enabled) 303 if (!enabled)
307 overscroll_controller_.reset(); 304 overscroll_controller_.reset();
308 else if (!overscroll_controller_.get()) 305 else if (!overscroll_controller_.get())
309 overscroll_controller_.reset(new OverscrollController(this)); 306 overscroll_controller_.reset(new OverscrollController(this));
310 } 307 }
311 308
312 void RenderWidgetHostImpl::SuppressNextCharEvents() { 309 void RenderWidgetHostImpl::SuppressNextCharEvents() {
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 // Only forward the non-native portions of our event. 1131 // Only forward the non-native portions of our event.
1135 ForwardInputEvent(key_event, sizeof(WebKeyboardEvent), 1132 ForwardInputEvent(key_event, sizeof(WebKeyboardEvent),
1136 is_keyboard_shortcut); 1133 is_keyboard_shortcut);
1137 } 1134 }
1138 } 1135 }
1139 1136
1140 void RenderWidgetHostImpl::SendInputEvent(const WebInputEvent& input_event, 1137 void RenderWidgetHostImpl::SendInputEvent(const WebInputEvent& input_event,
1141 int event_size, 1138 int event_size,
1142 bool is_keyboard_shortcut) { 1139 bool is_keyboard_shortcut) {
1143 input_event_start_time_ = TimeTicks::Now(); 1140 input_event_start_time_ = TimeTicks::Now();
1141 in_process_event_types_.push(input_event.type);
1142 smooth_scroll_gesture_controller_->OnForwardInputEvent();
1144 Send(new ViewMsg_HandleInputEvent( 1143 Send(new ViewMsg_HandleInputEvent(
1145 routing_id_, &input_event, is_keyboard_shortcut)); 1144 routing_id_, &input_event, is_keyboard_shortcut));
1146 increment_in_flight_event_count(); 1145 increment_in_flight_event_count();
1147 } 1146 }
1148 1147
1149 void RenderWidgetHostImpl::ForwardInputEvent(const WebInputEvent& input_event, 1148 void RenderWidgetHostImpl::ForwardInputEvent(const WebInputEvent& input_event,
1150 int event_size, 1149 int event_size,
1151 bool is_keyboard_shortcut) { 1150 bool is_keyboard_shortcut) {
1152 TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::ForwardInputEvent"); 1151 TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::ForwardInputEvent");
1153 1152
(...skipping 20 matching lines...) Expand all
1174 // touch-events do not reset or contribute to the overscroll gesture. 1173 // touch-events do not reset or contribute to the overscroll gesture.
1175 // However, the touch-events are not sent to the renderer. So send and ACK 1174 // However, the touch-events are not sent to the renderer. So send and ACK
1176 // to the touch-event queue immediately. Mark the event as not processed, 1175 // to the touch-event queue immediately. Mark the event as not processed,
1177 // to make sure that the touch-scroll gesture that initiated the 1176 // to make sure that the touch-scroll gesture that initiated the
1178 // overscroll is updated properly. 1177 // overscroll is updated properly.
1179 touch_event_queue_->ProcessTouchAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1178 touch_event_queue_->ProcessTouchAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1180 } 1179 }
1181 return; 1180 return;
1182 } 1181 }
1183 1182
1184 in_process_event_types_.push(input_event.type);
1185
1186 // Transmit any pending wheel events on a non-wheel event. This ensures that 1183 // Transmit any pending wheel events on a non-wheel event. This ensures that
1187 // the renderer receives the final PhaseEnded wheel event, which is necessary 1184 // the renderer receives the final PhaseEnded wheel event, which is necessary
1188 // to terminate rubber-banding, for example. 1185 // to terminate rubber-banding, for example.
1189 if (input_event.type != WebInputEvent::MouseWheel) { 1186 if (input_event.type != WebInputEvent::MouseWheel) {
1190 for (size_t i = 0; i < coalesced_mouse_wheel_events_.size(); ++i) { 1187 for (size_t i = 0; i < coalesced_mouse_wheel_events_.size(); ++i) {
1191 SendInputEvent(coalesced_mouse_wheel_events_[i], 1188 SendInputEvent(coalesced_mouse_wheel_events_[i],
1192 sizeof(WebMouseWheelEvent), false); 1189 sizeof(WebMouseWheelEvent), false);
1193 } 1190 }
1194 coalesced_mouse_wheel_events_.clear(); 1191 coalesced_mouse_wheel_events_.clear();
1195 } 1192 }
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after
1805 in_process_event_types_.pop(); 1802 in_process_event_types_.pop();
1806 1803
1807 // Log the time delta for processing an input event. 1804 // Log the time delta for processing an input event.
1808 TimeDelta delta = TimeTicks::Now() - input_event_start_time_; 1805 TimeDelta delta = TimeTicks::Now() - input_event_start_time_;
1809 UMA_HISTOGRAM_TIMES("MPArch.RWH_InputEventDelta", delta); 1806 UMA_HISTOGRAM_TIMES("MPArch.RWH_InputEventDelta", delta);
1810 1807
1811 // Cancel pending hung renderer checks since the renderer is responsive. 1808 // Cancel pending hung renderer checks since the renderer is responsive.
1812 if (decrement_in_flight_event_count() == 0) 1809 if (decrement_in_flight_event_count() == 0)
1813 StopHangMonitorTimeout(); 1810 StopHangMonitorTimeout();
1814 1811
1815 // If an input ack is pending, then hold off ticking the gesture 1812 smooth_scroll_gesture_controller_->OnInputEventACK(this);
1816 // until we get an input ack.
1817 if (in_process_event_types_.empty() &&
1818 !active_smooth_scroll_gestures_.empty())
1819 TickActiveSmoothScrollGesture();
1820 1813
1821 int type = static_cast<int>(event_type); 1814 int type = static_cast<int>(event_type);
1822 if (type < WebInputEvent::Undefined) { 1815 if (type < WebInputEvent::Undefined) {
1823 RecordAction(UserMetricsAction("BadMessageTerminate_RWH2")); 1816 RecordAction(UserMetricsAction("BadMessageTerminate_RWH2"));
1824 process_->ReceivedBadMessage(); 1817 process_->ReceivedBadMessage();
1825 } else if (type == WebInputEvent::MouseMove) { 1818 } else if (type == WebInputEvent::MouseMove) {
1826 mouse_move_pending_ = false; 1819 mouse_move_pending_ = false;
1827 1820
1828 // now, we can send the next mouse move event 1821 // now, we can send the next mouse move event
1829 if (next_mouse_move_.get()) { 1822 if (next_mouse_move_.get()) {
(...skipping 19 matching lines...) Expand all
1849 // (OnInputEventAck) method, but not on other platforms; using 1842 // (OnInputEventAck) method, but not on other platforms; using
1850 // 'void' instead is just as safe (since NotificationSource 1843 // 'void' instead is just as safe (since NotificationSource
1851 // is not actually typesafe) and avoids this error. 1844 // is not actually typesafe) and avoids this error.
1852 NotificationService::current()->Notify( 1845 NotificationService::current()->Notify(
1853 NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_INPUT_EVENT_ACK, 1846 NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_INPUT_EVENT_ACK,
1854 Source<void>(this), 1847 Source<void>(this),
1855 Details<int>(&type)); 1848 Details<int>(&type));
1856 } 1849 }
1857 1850
1858 void RenderWidgetHostImpl::OnBeginSmoothScroll( 1851 void RenderWidgetHostImpl::OnBeginSmoothScroll(
1859 int gesture_id, const ViewHostMsg_BeginSmoothScroll_Params &params) { 1852 const ViewHostMsg_BeginSmoothScroll_Params& params,
1853 bool* smooth_scroll_started) {
1860 if (!view_) 1854 if (!view_)
1861 return; 1855 return;
1862 active_smooth_scroll_gestures_.insert( 1856 *smooth_scroll_started =
1863 std::make_pair(gesture_id, 1857 smooth_scroll_gesture_controller_->OnBeginSmoothScroll(view_, params);
1864 view_->CreateSmoothScrollGesture(
1865 params.scroll_down, params.pixels_to_scroll,
1866 params.mouse_event_x, params.mouse_event_y)));
1867 1858
1868 // If an input ack is pending, then hold off ticking the gesture
1869 // until we get an input ack.
1870 if (!in_process_event_types_.empty())
1871 return;
1872 if (tick_active_smooth_scroll_gestures_task_posted_)
1873 return;
1874 TickActiveSmoothScrollGesture();
1875 }
1876
1877 void RenderWidgetHostImpl::TickActiveSmoothScrollGesture() {
1878 TRACE_EVENT0("input", "RenderWidgetHostImpl::TickActiveSmoothScrollGesture");
1879 tick_active_smooth_scroll_gestures_task_posted_ = false;
1880 if (active_smooth_scroll_gestures_.empty()) {
1881 TRACE_EVENT_INSTANT0("input", "EarlyOut_NoActiveScrollGesture",
1882 TRACE_EVENT_SCOPE_THREAD);
1883 return;
1884 }
1885
1886 base::TimeTicks now = TimeTicks::HighResNow();
1887 base::TimeDelta preferred_interval =
1888 base::TimeDelta::FromMilliseconds(kSyntheticScrollMessageIntervalMs);
1889 base::TimeDelta time_until_next_ideal_interval =
1890 (last_smooth_scroll_gestures_tick_time_ + preferred_interval) -
1891 now;
1892 if (time_until_next_ideal_interval.InMilliseconds() > 0) {
1893 TRACE_EVENT_INSTANT1(
1894 "input", "EarlyOut_TickedTooRecently", TRACE_EVENT_SCOPE_THREAD,
1895 "delay", time_until_next_ideal_interval.InMilliseconds());
1896 // Post a task.
1897 tick_active_smooth_scroll_gestures_task_posted_ = true;
1898 MessageLoop::current()->PostDelayedTask(
1899 FROM_HERE,
1900 base::Bind(&RenderWidgetHostImpl::TickActiveSmoothScrollGesture,
1901 weak_factory_.GetWeakPtr()),
1902 time_until_next_ideal_interval);
1903 return;
1904 }
1905
1906 last_smooth_scroll_gestures_tick_time_ = now;
1907
1908 // Separate ticking of gestures from sending their completion messages.
1909 std::vector<int> ids_that_are_done;
1910 for (SmoothScrollGestureMap::iterator it =
1911 active_smooth_scroll_gestures_.begin();
1912 it != active_smooth_scroll_gestures_.end();
1913 ++it) {
1914
1915 bool active = it->second->ForwardInputEvents(now, this);
1916 if (!active)
1917 ids_that_are_done.push_back(it->first);
1918 }
1919
1920 // Delete completed gestures and send their completion event.
1921 for(size_t i = 0; i < ids_that_are_done.size(); i++) {
1922 int id = ids_that_are_done[i];
1923 SmoothScrollGestureMap::iterator it =
1924 active_smooth_scroll_gestures_.find(id);
1925 DCHECK(it != active_smooth_scroll_gestures_.end());
1926 active_smooth_scroll_gestures_.erase(it);
1927
1928 Send(new ViewMsg_SmoothScrollCompleted(routing_id_, id));
1929 }
1930
1931 // No need to post the next tick if an input is in flight.
1932 if (!in_process_event_types_.empty())
1933 return;
1934
1935 TRACE_EVENT_INSTANT1("input", "PostTickTask", TRACE_EVENT_SCOPE_THREAD,
1936 "delay", preferred_interval.InMilliseconds());
1937 tick_active_smooth_scroll_gestures_task_posted_ = true;
1938 MessageLoop::current()->PostDelayedTask(
1939 FROM_HERE,
1940 base::Bind(&RenderWidgetHostImpl::TickActiveSmoothScrollGesture,
1941 weak_factory_.GetWeakPtr()),
1942 preferred_interval);
1943 } 1859 }
1944 1860
1945 void RenderWidgetHostImpl::OnSelectRangeAck() { 1861 void RenderWidgetHostImpl::OnSelectRangeAck() {
1946 select_range_pending_ = false; 1862 select_range_pending_ = false;
1947 if (next_selection_range_.get()) { 1863 if (next_selection_range_.get()) {
1948 scoped_ptr<SelectionRange> next(next_selection_range_.Pass()); 1864 scoped_ptr<SelectionRange> next(next_selection_range_.Pass());
1949 SelectRange(next->start, next->end); 1865 SelectRange(next->start, next->end);
1950 } 1866 }
1951 } 1867 }
1952 1868
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
2469 return; 2385 return;
2470 2386
2471 OnRenderAutoResized(new_size); 2387 OnRenderAutoResized(new_size);
2472 } 2388 }
2473 2389
2474 void RenderWidgetHostImpl::DetachDelegate() { 2390 void RenderWidgetHostImpl::DetachDelegate() {
2475 delegate_ = NULL; 2391 delegate_ = NULL;
2476 } 2392 }
2477 2393
2478 } // namespace content 2394 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698