| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |