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

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

Issue 367173003: [Android] Implementation of overscroll effect for Android L (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Code review Created 6 years, 4 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
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_view_android.h" 5 #include "content/browser/renderer_host/render_widget_host_view_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include "base/android/build_info.h"
9 #include "base/basictypes.h" 10 #include "base/basictypes.h"
10 #include "base/bind.h" 11 #include "base/bind.h"
11 #include "base/callback_helpers.h" 12 #include "base/callback_helpers.h"
12 #include "base/command_line.h" 13 #include "base/command_line.h"
13 #include "base/logging.h" 14 #include "base/logging.h"
14 #include "base/message_loop/message_loop.h" 15 #include "base/message_loop/message_loop.h"
15 #include "base/metrics/histogram.h" 16 #include "base/metrics/histogram.h"
16 #include "base/strings/utf_string_conversions.h" 17 #include "base/strings/utf_string_conversions.h"
17 #include "base/sys_info.h" 18 #include "base/sys_info.h"
18 #include "base/threading/worker_pool.h" 19 #include "base/threading/worker_pool.h"
19 #include "cc/base/latency_info_swap_promise.h" 20 #include "cc/base/latency_info_swap_promise.h"
20 #include "cc/layers/delegated_frame_provider.h" 21 #include "cc/layers/delegated_frame_provider.h"
21 #include "cc/layers/delegated_renderer_layer.h" 22 #include "cc/layers/delegated_renderer_layer.h"
22 #include "cc/layers/layer.h" 23 #include "cc/layers/layer.h"
23 #include "cc/output/compositor_frame.h" 24 #include "cc/output/compositor_frame.h"
24 #include "cc/output/compositor_frame_ack.h" 25 #include "cc/output/compositor_frame_ack.h"
25 #include "cc/output/copy_output_request.h" 26 #include "cc/output/copy_output_request.h"
26 #include "cc/output/copy_output_result.h" 27 #include "cc/output/copy_output_result.h"
27 #include "cc/resources/single_release_callback.h" 28 #include "cc/resources/single_release_callback.h"
28 #include "cc/trees/layer_tree_host.h" 29 #include "cc/trees/layer_tree_host.h"
29 #include "content/browser/accessibility/browser_accessibility_manager_android.h" 30 #include "content/browser/accessibility/browser_accessibility_manager_android.h"
30 #include "content/browser/android/composited_touch_handle_drawable.h" 31 #include "content/browser/android/composited_touch_handle_drawable.h"
31 #include "content/browser/android/content_view_core_impl.h" 32 #include "content/browser/android/content_view_core_impl.h"
33 #include "content/browser/android/edge_effect.h"
34 #include "content/browser/android/edge_effect_l.h"
32 #include "content/browser/android/in_process/synchronous_compositor_impl.h" 35 #include "content/browser/android/in_process/synchronous_compositor_impl.h"
33 #include "content/browser/android/overscroll_glow.h" 36 #include "content/browser/android/overscroll_glow.h"
34 #include "content/browser/devtools/render_view_devtools_agent_host.h" 37 #include "content/browser/devtools/render_view_devtools_agent_host.h"
35 #include "content/browser/gpu/compositor_util.h" 38 #include "content/browser/gpu/compositor_util.h"
36 #include "content/browser/gpu/gpu_data_manager_impl.h" 39 #include "content/browser/gpu/gpu_data_manager_impl.h"
37 #include "content/browser/gpu/gpu_process_host_ui_shim.h" 40 #include "content/browser/gpu/gpu_process_host_ui_shim.h"
38 #include "content/browser/gpu/gpu_surface_tracker.h" 41 #include "content/browser/gpu/gpu_surface_tracker.h"
39 #include "content/browser/media/media_web_contents_observer.h" 42 #include "content/browser/media/media_web_contents_observer.h"
40 #include "content/browser/renderer_host/compositor_impl_android.h" 43 #include "content/browser/renderer_host/compositor_impl_android.h"
41 #include "content/browser/renderer_host/dip_util.h" 44 #include "content/browser/renderer_host/dip_util.h"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 79
77 namespace { 80 namespace {
78 81
79 const int kUndefinedOutputSurfaceId = -1; 82 const int kUndefinedOutputSurfaceId = -1;
80 83
81 // Used to accomodate finite precision when comparing scaled viewport and 84 // Used to accomodate finite precision when comparing scaled viewport and
82 // content widths. While this value may seem large, width=device-width on an N7 85 // content widths. While this value may seem large, width=device-width on an N7
83 // V1 saw errors of ~0.065 between computed window and content widths. 86 // V1 saw errors of ~0.065 between computed window and content widths.
84 const float kMobileViewportWidthEpsilon = 0.15f; 87 const float kMobileViewportWidthEpsilon = 0.15f;
85 88
89 // Used for conditional creation of EdgeEffect types for overscroll.
90 const int kKitKatMR2SDKVersion = 19;
91
86 static const char kAsyncReadBackString[] = "Compositing.CopyFromSurfaceTime"; 92 static const char kAsyncReadBackString[] = "Compositing.CopyFromSurfaceTime";
87 93
88 // Sends an acknowledgement to the renderer of a processed IME event. 94 // Sends an acknowledgement to the renderer of a processed IME event.
89 void SendImeEventAck(RenderWidgetHostImpl* host) { 95 void SendImeEventAck(RenderWidgetHostImpl* host) {
90 host->Send(new ViewMsg_ImeEventAck(host->GetRoutingID())); 96 host->Send(new ViewMsg_ImeEventAck(host->GetRoutingID()));
91 } 97 }
92 98
93 void CopyFromCompositingSurfaceFinished( 99 void CopyFromCompositingSurfaceFinished(
94 const base::Callback<void(bool, const SkBitmap&)>& callback, 100 const base::Callback<void(bool, const SkBitmap&)>& callback,
95 scoped_ptr<cc::SingleReleaseCallback> release_callback, 101 scoped_ptr<cc::SingleReleaseCallback> release_callback,
(...skipping 30 matching lines...) Expand all
126 const cc::CompositorFrameMetadata& frame_metadata) { 132 const cc::CompositorFrameMetadata& frame_metadata) {
127 const float scale_factor = 133 const float scale_factor =
128 frame_metadata.page_scale_factor * frame_metadata.device_scale_factor; 134 frame_metadata.page_scale_factor * frame_metadata.device_scale_factor;
129 135
130 // Compute the size and offsets for each edge, where each effect is sized to 136 // Compute the size and offsets for each edge, where each effect is sized to
131 // the viewport and offset by the distance of each viewport edge to the 137 // the viewport and offset by the distance of each viewport edge to the
132 // respective content edge. 138 // respective content edge.
133 OverscrollGlow::DisplayParameters params; 139 OverscrollGlow::DisplayParameters params;
134 params.size = gfx::ScaleSize( 140 params.size = gfx::ScaleSize(
135 frame_metadata.scrollable_viewport_size, scale_factor); 141 frame_metadata.scrollable_viewport_size, scale_factor);
136 params.edge_offsets[EdgeEffect::EDGE_TOP] = 142 params.edge_offsets[OverscrollGlow::EDGE_TOP] =
137 -frame_metadata.root_scroll_offset.y() * scale_factor; 143 -frame_metadata.root_scroll_offset.y() * scale_factor;
138 params.edge_offsets[EdgeEffect::EDGE_LEFT] = 144 params.edge_offsets[OverscrollGlow::EDGE_LEFT] =
139 -frame_metadata.root_scroll_offset.x() * scale_factor; 145 -frame_metadata.root_scroll_offset.x() * scale_factor;
140 params.edge_offsets[EdgeEffect::EDGE_BOTTOM] = 146 params.edge_offsets[OverscrollGlow::EDGE_BOTTOM] =
141 (frame_metadata.root_layer_size.height() - 147 (frame_metadata.root_layer_size.height() -
142 frame_metadata.root_scroll_offset.y() - 148 frame_metadata.root_scroll_offset.y() -
143 frame_metadata.scrollable_viewport_size.height()) * scale_factor; 149 frame_metadata.scrollable_viewport_size.height()) *
144 params.edge_offsets[EdgeEffect::EDGE_RIGHT] = 150 scale_factor;
151 params.edge_offsets[OverscrollGlow::EDGE_RIGHT] =
145 (frame_metadata.root_layer_size.width() - 152 (frame_metadata.root_layer_size.width() -
146 frame_metadata.root_scroll_offset.x() - 153 frame_metadata.root_scroll_offset.x() -
147 frame_metadata.scrollable_viewport_size.width()) * scale_factor; 154 frame_metadata.scrollable_viewport_size.width()) *
148 params.device_scale_factor = frame_metadata.device_scale_factor; 155 scale_factor;
149 156
150 return params; 157 return params;
151 } 158 }
152 159
160 bool UseEdgeEffectL() {
161 static bool use_edge_effect_l =
162 base::android::BuildInfo::GetInstance()->sdk_int() > kKitKatMR2SDKVersion;
163 return use_edge_effect_l;
164 }
165
166 scoped_ptr<EdgeEffectBase> CreateEdgeEffect(
167 ui::SystemUIResourceManager* resource_manager,
168 float device_scale_factor) {
169 DCHECK(resource_manager);
170 if (UseEdgeEffectL())
171 return scoped_ptr<EdgeEffectBase>(new EdgeEffectL(resource_manager));
172
173 return scoped_ptr<EdgeEffectBase>(
174 new EdgeEffect(resource_manager, device_scale_factor));
175 }
176
177 scoped_ptr<OverscrollGlow> CreateOverscrollEffect(
178 ContentViewCore* content_view_core) {
179 DCHECK(content_view_core);
180 ui::WindowAndroidCompositor* compositor =
181 content_view_core->GetWindowAndroid()->GetCompositor();
182 DCHECK(compositor);
183 ui::SystemUIResourceManager* system_resource_manager =
184 &compositor->GetSystemUIResourceManager();
185
186 if (UseEdgeEffectL())
187 EdgeEffectL::PreloadResources(system_resource_manager);
188 else
189 EdgeEffect::PreloadResources(system_resource_manager);
190
191 return make_scoped_ptr(
192 new OverscrollGlow(base::Bind(&CreateEdgeEffect,
193 system_resource_manager,
194 content_view_core->GetDpiScale())));
195 }
196
153 ui::GestureProvider::Config CreateGestureProviderConfig() { 197 ui::GestureProvider::Config CreateGestureProviderConfig() {
154 ui::GestureProvider::Config config = ui::DefaultGestureProviderConfig(); 198 ui::GestureProvider::Config config = ui::DefaultGestureProviderConfig();
155 config.disable_click_delay = 199 config.disable_click_delay =
156 base::CommandLine::ForCurrentProcess()->HasSwitch( 200 base::CommandLine::ForCurrentProcess()->HasSwitch(
157 switches::kDisableClickDelay); 201 switches::kDisableClickDelay);
158 return config; 202 return config;
159 } 203 }
160 204
161 bool HasFixedPageScale(const cc::CompositorFrameMetadata& frame_metadata) { 205 bool HasFixedPageScale(const cc::CompositorFrameMetadata& frame_metadata) {
162 return frame_metadata.min_page_scale_factor == 206 return frame_metadata.min_page_scale_factor ==
(...skipping 1067 matching lines...) Expand 10 before | Expand all | Expand 10 after
1230 1274
1231 void RenderWidgetHostViewAndroid::ProcessAckedTouchEvent( 1275 void RenderWidgetHostViewAndroid::ProcessAckedTouchEvent(
1232 const TouchEventWithLatencyInfo& touch, InputEventAckState ack_result) { 1276 const TouchEventWithLatencyInfo& touch, InputEventAckState ack_result) {
1233 const bool event_consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED; 1277 const bool event_consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED;
1234 gesture_provider_.OnTouchEventAck(event_consumed); 1278 gesture_provider_.OnTouchEventAck(event_consumed);
1235 } 1279 }
1236 1280
1237 void RenderWidgetHostViewAndroid::GestureEventAck( 1281 void RenderWidgetHostViewAndroid::GestureEventAck(
1238 const blink::WebGestureEvent& event, 1282 const blink::WebGestureEvent& event,
1239 InputEventAckState ack_result) { 1283 InputEventAckState ack_result) {
1284 // The overscroll effect requires an explicit release signal that may not be
1285 // sent from the renderer compositor.
1286 if (event.type == blink::WebInputEvent::GestureScrollEnd ||
1287 event.type == blink::WebInputEvent::GestureFlingStart) {
1288 DidOverscroll(DidOverscrollParams());
1289 }
1290
1240 switch (event.type) { 1291 switch (event.type) {
1241 case blink::WebInputEvent::GestureScrollBegin: 1292 case blink::WebInputEvent::GestureScrollBegin:
1242 touch_scrolling_ = true; 1293 touch_scrolling_ = true;
1243 potentially_active_fling_count_ = 0; 1294 potentially_active_fling_count_ = 0;
1244 OnContentScrollingChange(); 1295 OnContentScrollingChange();
1245 break; 1296 break;
1246 case blink::WebInputEvent::GestureScrollEnd: 1297 case blink::WebInputEvent::GestureScrollEnd:
1247 touch_scrolling_ = false; 1298 touch_scrolling_ = false;
1248 OnContentScrollingChange(); 1299 OnContentScrollingChange();
1249 break; 1300 break;
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1417 1468
1418 if (overscroll_effect_ && 1469 if (overscroll_effect_ &&
1419 overscroll_effect_->OnOverscrolled( 1470 overscroll_effect_->OnOverscrolled(
1420 content_view_core_->GetLayer(), 1471 content_view_core_->GetLayer(),
1421 base::TimeTicks::Now(), 1472 base::TimeTicks::Now(),
1422 gfx::ScaleVector2d(params.accumulated_overscroll, 1473 gfx::ScaleVector2d(params.accumulated_overscroll,
1423 device_scale_factor), 1474 device_scale_factor),
1424 gfx::ScaleVector2d(params.latest_overscroll_delta, 1475 gfx::ScaleVector2d(params.latest_overscroll_delta,
1425 device_scale_factor), 1476 device_scale_factor),
1426 gfx::ScaleVector2d(params.current_fling_velocity, 1477 gfx::ScaleVector2d(params.current_fling_velocity,
1427 device_scale_factor))) { 1478 device_scale_factor),
1479 gfx::ScaleVector2d(
1480 params.causal_event_viewport_point.OffsetFromOrigin(),
1481 device_scale_factor))) {
1428 SetNeedsAnimate(); 1482 SetNeedsAnimate();
1429 } 1483 }
1430 } 1484 }
1431 1485
1432 void RenderWidgetHostViewAndroid::DidStopFlinging() { 1486 void RenderWidgetHostViewAndroid::DidStopFlinging() {
1433 if (potentially_active_fling_count_) { 1487 if (potentially_active_fling_count_) {
1434 --potentially_active_fling_count_; 1488 --potentially_active_fling_count_;
1435 OnContentScrollingChange(); 1489 OnContentScrollingChange();
1436 } 1490 }
1437 1491
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1477 if (needs_begin_frame_) 1531 if (needs_begin_frame_)
1478 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); 1532 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
1479 } 1533 }
1480 1534
1481 if (resize) 1535 if (resize)
1482 WasResized(); 1536 WasResized();
1483 1537
1484 if (!selection_controller_) 1538 if (!selection_controller_)
1485 selection_controller_.reset(new TouchSelectionController(this)); 1539 selection_controller_.reset(new TouchSelectionController(this));
1486 1540
1487 if (!content_view_core_) { 1541 if (!content_view_core_)
1488 overscroll_effect_.reset(); 1542 overscroll_effect_.reset();
1489 } else if (overscroll_effect_enabled_ && !overscroll_effect_) { 1543 else if (overscroll_effect_enabled_ && !overscroll_effect_)
1490 DCHECK(content_view_core_->GetWindowAndroid()->GetCompositor()); 1544 overscroll_effect_ = CreateOverscrollEffect(content_view_core_);
1491 overscroll_effect_ =
1492 OverscrollGlow::Create(&content_view_core_->GetWindowAndroid()
1493 ->GetCompositor()
1494 ->GetSystemUIResourceManager());
1495 }
1496 } 1545 }
1497 1546
1498 void RenderWidgetHostViewAndroid::RunAckCallbacks() { 1547 void RenderWidgetHostViewAndroid::RunAckCallbacks() {
1499 while (!ack_callbacks_.empty()) { 1548 while (!ack_callbacks_.empty()) {
1500 ack_callbacks_.front().Run(); 1549 ack_callbacks_.front().Run();
1501 ack_callbacks_.pop(); 1550 ack_callbacks_.pop();
1502 } 1551 }
1503 } 1552 }
1504 1553
1505 void RenderWidgetHostViewAndroid::OnGestureEvent( 1554 void RenderWidgetHostViewAndroid::OnGestureEvent(
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
1693 results->orientationAngle = display.RotationAsDegree(); 1742 results->orientationAngle = display.RotationAsDegree();
1694 results->orientationType = 1743 results->orientationType =
1695 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); 1744 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display);
1696 gfx::DeviceDisplayInfo info; 1745 gfx::DeviceDisplayInfo info;
1697 results->depth = info.GetBitsPerPixel(); 1746 results->depth = info.GetBitsPerPixel();
1698 results->depthPerComponent = info.GetBitsPerComponent(); 1747 results->depthPerComponent = info.GetBitsPerComponent();
1699 results->isMonochrome = (results->depthPerComponent == 0); 1748 results->isMonochrome = (results->depthPerComponent == 0);
1700 } 1749 }
1701 1750
1702 } // namespace content 1751 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | content/common/input/did_overscroll_params.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698