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 |