| 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/sys_utils.h" | 9 #include "base/android/sys_utils.h" |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 const float device_scale_factor = content_view_core_->GetDpiScale(); | 524 const float device_scale_factor = content_view_core_->GetDpiScale(); |
| 525 if (overscroll_effect_->OnOverscrolled( | 525 if (overscroll_effect_->OnOverscrolled( |
| 526 content_view_core_->GetLayer(), | 526 content_view_core_->GetLayer(), |
| 527 base::TimeTicks::Now(), | 527 base::TimeTicks::Now(), |
| 528 gfx::ScaleVector2d(params.accumulated_overscroll, | 528 gfx::ScaleVector2d(params.accumulated_overscroll, |
| 529 device_scale_factor), | 529 device_scale_factor), |
| 530 gfx::ScaleVector2d(params.latest_overscroll_delta, | 530 gfx::ScaleVector2d(params.latest_overscroll_delta, |
| 531 device_scale_factor), | 531 device_scale_factor), |
| 532 gfx::ScaleVector2d(params.current_fling_velocity, | 532 gfx::ScaleVector2d(params.current_fling_velocity, |
| 533 device_scale_factor))) { | 533 device_scale_factor))) { |
| 534 content_view_core_->SetNeedsAnimate(); | 534 SetNeedsAnimate(); |
| 535 } | 535 } |
| 536 } | 536 } |
| 537 | 537 |
| 538 void RenderWidgetHostViewAndroid::SendBeginFrame( | 538 void RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame(bool enabled) { |
| 539 const cc::BeginFrameArgs& args) { | 539 if (enabled == needs_begin_frame_) |
| 540 TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::SendBeginFrame"); | |
| 541 if (!host_) | |
| 542 return; | 540 return; |
| 543 | 541 |
| 544 if (flush_input_requested_) { | |
| 545 flush_input_requested_ = false; | |
| 546 host_->FlushInput(); | |
| 547 content_view_core_->RemoveBeginFrameSubscriber(); | |
| 548 } | |
| 549 | |
| 550 host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args)); | |
| 551 } | |
| 552 | |
| 553 void RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame(bool enabled) { | |
| 554 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame", | 542 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame", |
| 555 "enabled", enabled); | 543 "enabled", enabled); |
| 556 // ContentViewCoreImpl handles multiple subscribers to the BeginFrame, so | 544 if (content_view_core_ && enabled) |
| 557 // we have to make sure calls to ContentViewCoreImpl's | 545 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
| 558 // {Add,Remove}BeginFrameSubscriber are balanced, even if | 546 |
| 559 // RenderWidgetHostViewAndroid's may not be. | 547 needs_begin_frame_ = enabled; |
| 560 if (content_view_core_ && needs_begin_frame_ != enabled) { | |
| 561 if (enabled) | |
| 562 content_view_core_->AddBeginFrameSubscriber(); | |
| 563 else | |
| 564 content_view_core_->RemoveBeginFrameSubscriber(); | |
| 565 needs_begin_frame_ = enabled; | |
| 566 } | |
| 567 } | 548 } |
| 568 | 549 |
| 569 void RenderWidgetHostViewAndroid::OnStartContentIntent( | 550 void RenderWidgetHostViewAndroid::OnStartContentIntent( |
| 570 const GURL& content_url) { | 551 const GURL& content_url) { |
| 571 if (content_view_core_) | 552 if (content_view_core_) |
| 572 content_view_core_->StartContentIntent(content_url); | 553 content_view_core_->StartContentIntent(content_url); |
| 573 } | 554 } |
| 574 | 555 |
| 575 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted( | 556 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted( |
| 576 const base::string16& result) { | 557 const base::string16& result) { |
| (...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1076 void RenderWidgetHostViewAndroid::RemoveLayers() { | 1057 void RenderWidgetHostViewAndroid::RemoveLayers() { |
| 1077 if (!content_view_core_) | 1058 if (!content_view_core_) |
| 1078 return; | 1059 return; |
| 1079 if (!layer_.get()) | 1060 if (!layer_.get()) |
| 1080 return; | 1061 return; |
| 1081 | 1062 |
| 1082 content_view_core_->RemoveLayer(layer_); | 1063 content_view_core_->RemoveLayer(layer_); |
| 1083 overscroll_effect_->Disable(); | 1064 overscroll_effect_->Disable(); |
| 1084 } | 1065 } |
| 1085 | 1066 |
| 1067 void RenderWidgetHostViewAndroid::SetNeedsAnimate() { |
| 1068 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
| 1069 } |
| 1070 |
| 1086 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { | 1071 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { |
| 1087 return overscroll_effect_->Animate(frame_time); | 1072 return overscroll_effect_->Animate(frame_time); |
| 1088 } | 1073 } |
| 1089 | 1074 |
| 1090 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( | 1075 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( |
| 1091 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, | 1076 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, |
| 1092 int gpu_host_id) { | 1077 int gpu_host_id) { |
| 1093 NOTREACHED(); | 1078 NOTREACHED(); |
| 1094 } | 1079 } |
| 1095 | 1080 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1187 if (compositor) | 1172 if (compositor) |
| 1188 return compositor->HandleInputEvent(input_event); | 1173 return compositor->HandleInputEvent(input_event); |
| 1189 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; | 1174 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; |
| 1190 } | 1175 } |
| 1191 | 1176 |
| 1192 void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { | 1177 void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { |
| 1193 if (flush_input_requested_ || !content_view_core_) | 1178 if (flush_input_requested_ || !content_view_core_) |
| 1194 return; | 1179 return; |
| 1195 TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput"); | 1180 TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput"); |
| 1196 flush_input_requested_ = true; | 1181 flush_input_requested_ = true; |
| 1197 content_view_core_->AddBeginFrameSubscriber(); | |
| 1198 } | 1182 } |
| 1199 | 1183 |
| 1200 void RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManagerIfNeeded() { | 1184 void RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManagerIfNeeded() { |
| 1201 if (!host_ || host_->accessibility_mode() != AccessibilityModeComplete) | 1185 if (!host_ || host_->accessibility_mode() != AccessibilityModeComplete) |
| 1202 return; | 1186 return; |
| 1203 | 1187 |
| 1204 if (!GetBrowserAccessibilityManager()) { | 1188 if (!GetBrowserAccessibilityManager()) { |
| 1205 base::android::ScopedJavaLocalRef<jobject> obj; | 1189 base::android::ScopedJavaLocalRef<jobject> obj; |
| 1206 if (content_view_core_) | 1190 if (content_view_core_) |
| 1207 obj = content_view_core_->GetJavaObject(); | 1191 obj = content_view_core_->GetJavaObject(); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1278 void RenderWidgetHostViewAndroid::SendKeyEvent( | 1262 void RenderWidgetHostViewAndroid::SendKeyEvent( |
| 1279 const NativeWebKeyboardEvent& event) { | 1263 const NativeWebKeyboardEvent& event) { |
| 1280 if (host_) | 1264 if (host_) |
| 1281 host_->ForwardKeyboardEvent(event); | 1265 host_->ForwardKeyboardEvent(event); |
| 1282 } | 1266 } |
| 1283 | 1267 |
| 1284 void RenderWidgetHostViewAndroid::SendTouchEvent( | 1268 void RenderWidgetHostViewAndroid::SendTouchEvent( |
| 1285 const blink::WebTouchEvent& event) { | 1269 const blink::WebTouchEvent& event) { |
| 1286 if (host_) | 1270 if (host_) |
| 1287 host_->ForwardTouchEventWithLatencyInfo(event, CreateLatencyInfo(event)); | 1271 host_->ForwardTouchEventWithLatencyInfo(event, CreateLatencyInfo(event)); |
| 1272 |
| 1273 // Send a proactive BeginFrame on the next vsync to reduce latency. |
| 1274 // This is good enough as long as the first touch event has Begin semantics |
| 1275 // and the actual scroll happens on the next vsync. |
| 1276 // TODO: Is this actually still needed? |
| 1277 if (content_view_core_) { |
| 1278 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
| 1279 } |
| 1288 } | 1280 } |
| 1289 | 1281 |
| 1290 void RenderWidgetHostViewAndroid::SendMouseEvent( | 1282 void RenderWidgetHostViewAndroid::SendMouseEvent( |
| 1291 const blink::WebMouseEvent& event) { | 1283 const blink::WebMouseEvent& event) { |
| 1292 if (host_) | 1284 if (host_) |
| 1293 host_->ForwardMouseEvent(event); | 1285 host_->ForwardMouseEvent(event); |
| 1294 } | 1286 } |
| 1295 | 1287 |
| 1296 void RenderWidgetHostViewAndroid::SendMouseWheelEvent( | 1288 void RenderWidgetHostViewAndroid::SendMouseWheelEvent( |
| 1297 const blink::WebMouseWheelEvent& event) { | 1289 const blink::WebMouseWheelEvent& event) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1344 if (content_view_core_) | 1336 if (content_view_core_) |
| 1345 obj = content_view_core_->GetJavaObject(); | 1337 obj = content_view_core_->GetJavaObject(); |
| 1346 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> | 1338 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> |
| 1347 SetContentViewCore(obj); | 1339 SetContentViewCore(obj); |
| 1348 } | 1340 } |
| 1349 | 1341 |
| 1350 AttachLayers(); | 1342 AttachLayers(); |
| 1351 if (content_view_core_ && !using_synchronous_compositor_) { | 1343 if (content_view_core_ && !using_synchronous_compositor_) { |
| 1352 content_view_core_->GetWindowAndroid()->AddObserver(this); | 1344 content_view_core_->GetWindowAndroid()->AddObserver(this); |
| 1353 observing_root_window_ = true; | 1345 observing_root_window_ = true; |
| 1346 if (needs_begin_frame_) |
| 1347 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
| 1354 } | 1348 } |
| 1355 | 1349 |
| 1356 if (resize && content_view_core_) | 1350 if (resize && content_view_core_) |
| 1357 WasResized(); | 1351 WasResized(); |
| 1358 } | 1352 } |
| 1359 | 1353 |
| 1360 void RenderWidgetHostViewAndroid::RunAckCallbacks() { | 1354 void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
| 1361 while (!ack_callbacks_.empty()) { | 1355 while (!ack_callbacks_.empty()) { |
| 1362 ack_callbacks_.front().Run(); | 1356 ack_callbacks_.front().Run(); |
| 1363 ack_callbacks_.pop(); | 1357 ack_callbacks_.pop(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1379 RunAckCallbacks(); | 1373 RunAckCallbacks(); |
| 1380 } | 1374 } |
| 1381 | 1375 |
| 1382 void RenderWidgetHostViewAndroid::OnWillDestroyWindow() { | 1376 void RenderWidgetHostViewAndroid::OnWillDestroyWindow() { |
| 1383 // crbug.com/324341 | 1377 // crbug.com/324341 |
| 1384 // WindowAndroid and Compositor should outlive all WebContents. | 1378 // WindowAndroid and Compositor should outlive all WebContents. |
| 1385 NOTREACHED(); | 1379 NOTREACHED(); |
| 1386 observing_root_window_ = false; | 1380 observing_root_window_ = false; |
| 1387 } | 1381 } |
| 1388 | 1382 |
| 1383 void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time, |
| 1384 base::TimeDelta vsync_period) { |
| 1385 TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::OnVSync"); |
| 1386 if (!host_) |
| 1387 return; |
| 1388 |
| 1389 if (flush_input_requested_) { |
| 1390 flush_input_requested_ = false; |
| 1391 host_->FlushInput(); |
| 1392 } |
| 1393 |
| 1394 TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::SendBeginFrame"); |
| 1395 base::TimeTicks display_time = frame_time + vsync_period; |
| 1396 |
| 1397 // TODO(brianderson): Use adaptive draw-time estimation. |
| 1398 base::TimeDelta estimated_browser_composite_time = |
| 1399 base::TimeDelta::FromMicroseconds( |
| 1400 (1.0f * base::Time::kMicrosecondsPerSecond) / (3.0f * 60)); |
| 1401 |
| 1402 base::TimeTicks deadline = display_time - estimated_browser_composite_time; |
| 1403 |
| 1404 host_->Send(new ViewMsg_BeginFrame( |
| 1405 host_->GetRoutingID(), |
| 1406 cc::BeginFrameArgs::Create(frame_time, deadline, vsync_period))); |
| 1407 |
| 1408 // TODO(sievers): This should use the LayerTreeHostClient callback |
| 1409 bool needs_animate = Animate(frame_time); |
| 1410 if (needs_begin_frame_ || needs_animate) |
| 1411 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
| 1412 } |
| 1413 |
| 1389 void RenderWidgetHostViewAndroid::OnLostResources() { | 1414 void RenderWidgetHostViewAndroid::OnLostResources() { |
| 1390 ReleaseLocksOnSurface(); | 1415 ReleaseLocksOnSurface(); |
| 1391 if (layer_.get()) | 1416 if (layer_.get()) |
| 1392 DestroyDelegatedContent(); | 1417 DestroyDelegatedContent(); |
| 1393 DCHECK(ack_callbacks_.empty()); | 1418 DCHECK(ack_callbacks_.empty()); |
| 1394 } | 1419 } |
| 1395 | 1420 |
| 1396 // static | 1421 // static |
| 1397 void | 1422 void |
| 1398 RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResultForDelegatedReadback( | 1423 RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResultForDelegatedReadback( |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1505 // RenderWidgetHostView, public: | 1530 // RenderWidgetHostView, public: |
| 1506 | 1531 |
| 1507 // static | 1532 // static |
| 1508 RenderWidgetHostView* | 1533 RenderWidgetHostView* |
| 1509 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1534 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 1510 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1535 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 1511 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1536 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
| 1512 } | 1537 } |
| 1513 | 1538 |
| 1514 } // namespace content | 1539 } // namespace content |
| OLD | NEW |