| 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 <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 #include "content/public/common/content_switches.h" | 69 #include "content/public/common/content_switches.h" |
| 70 #include "gpu/command_buffer/client/gles2_implementation.h" | 70 #include "gpu/command_buffer/client/gles2_implementation.h" |
| 71 #include "gpu/command_buffer/client/gles2_interface.h" | 71 #include "gpu/command_buffer/client/gles2_interface.h" |
| 72 #include "gpu/config/gpu_driver_bug_workaround_type.h" | 72 #include "gpu/config/gpu_driver_bug_workaround_type.h" |
| 73 #include "ipc/ipc_message_macros.h" | 73 #include "ipc/ipc_message_macros.h" |
| 74 #include "ipc/ipc_message_start.h" | 74 #include "ipc/ipc_message_start.h" |
| 75 #include "skia/ext/image_operations.h" | 75 #include "skia/ext/image_operations.h" |
| 76 #include "third_party/khronos/GLES2/gl2.h" | 76 #include "third_party/khronos/GLES2/gl2.h" |
| 77 #include "third_party/khronos/GLES2/gl2ext.h" | 77 #include "third_party/khronos/GLES2/gl2ext.h" |
| 78 #include "third_party/skia/include/core/SkCanvas.h" | 78 #include "third_party/skia/include/core/SkCanvas.h" |
| 79 #include "ui/android/delegated_frame_host_android.h" | |
| 80 #include "ui/android/window_android.h" | 79 #include "ui/android/window_android.h" |
| 81 #include "ui/android/window_android_compositor.h" | 80 #include "ui/android/window_android_compositor.h" |
| 82 #include "ui/base/layout.h" | 81 #include "ui/base/layout.h" |
| 83 #include "ui/display/display.h" | 82 #include "ui/display/display.h" |
| 84 #include "ui/display/screen.h" | 83 #include "ui/display/screen.h" |
| 85 #include "ui/events/base_event_utils.h" | 84 #include "ui/events/base_event_utils.h" |
| 86 #include "ui/events/blink/blink_event_util.h" | 85 #include "ui/events/blink/blink_event_util.h" |
| 87 #include "ui/events/blink/did_overscroll_params.h" | 86 #include "ui/events/blink/did_overscroll_params.h" |
| 88 #include "ui/events/blink/web_input_event_traits.h" | 87 #include "ui/events/blink/web_input_event_traits.h" |
| 89 #include "ui/events/gesture_detection/gesture_provider_config_helper.h" | 88 #include "ui/events/gesture_detection/gesture_provider_config_helper.h" |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 static_cast<RenderWidgetHostViewAndroid*>(widget->GetView()) | 430 static_cast<RenderWidgetHostViewAndroid*>(widget->GetView()) |
| 432 ->OnLostResources(); | 431 ->OnLostResources(); |
| 433 } | 432 } |
| 434 } | 433 } |
| 435 } | 434 } |
| 436 | 435 |
| 437 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( | 436 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
| 438 RenderWidgetHostImpl* widget_host, | 437 RenderWidgetHostImpl* widget_host, |
| 439 ContentViewCoreImpl* content_view_core) | 438 ContentViewCoreImpl* content_view_core) |
| 440 : host_(widget_host), | 439 : host_(widget_host), |
| 441 outstanding_vsync_requests_(0), | 440 begin_frame_source_(nullptr), |
| 441 outstanding_begin_frame_requests_(0), |
| 442 is_showing_(!widget_host->is_hidden()), | 442 is_showing_(!widget_host->is_hidden()), |
| 443 is_window_visible_(true), | 443 is_window_visible_(true), |
| 444 is_window_activity_started_(true), | 444 is_window_activity_started_(true), |
| 445 content_view_core_(nullptr), | 445 content_view_core_(nullptr), |
| 446 ime_adapter_android_(this), | 446 ime_adapter_android_(this), |
| 447 cached_background_color_(SK_ColorWHITE), | 447 cached_background_color_(SK_ColorWHITE), |
| 448 last_compositor_frame_sink_id_(kUndefinedCompositorFrameSinkId), | 448 last_compositor_frame_sink_id_(kUndefinedCompositorFrameSinkId), |
| 449 gesture_provider_(ui::GetGestureProviderConfig( | 449 gesture_provider_(ui::GetGestureProviderConfig( |
| 450 ui::GestureProviderConfigType::CURRENT_PLATFORM), | 450 ui::GestureProviderConfigType::CURRENT_PLATFORM), |
| 451 this), | 451 this), |
| 452 stylus_text_selector_(this), | 452 stylus_text_selector_(this), |
| 453 using_browser_compositor_(CompositorImpl::IsInitialized()), | 453 using_browser_compositor_(CompositorImpl::IsInitialized()), |
| 454 synchronous_compositor_client_(nullptr), | 454 synchronous_compositor_client_(nullptr), |
| 455 frame_evictor_(new DelegatedFrameEvictor(this)), | 455 frame_evictor_(new DelegatedFrameEvictor(this)), |
| 456 locks_on_frame_count_(0), | 456 locks_on_frame_count_(0), |
| 457 observing_root_window_(false), | 457 observing_root_window_(false), |
| 458 weak_ptr_factory_(this) { | 458 weak_ptr_factory_(this) { |
| 459 // Set the layer which will hold the content layer for this view. The content | 459 // Set the layer which will hold the content layer for this view. The content |
| 460 // layer is managed by the DelegatedFrameHost. | 460 // layer is managed by the DelegatedFrameHost. |
| 461 view_.SetLayer(cc::Layer::Create()); | 461 view_.SetLayer(cc::Layer::Create()); |
| 462 if (using_browser_compositor_) { | 462 if (using_browser_compositor_) { |
| 463 delegated_frame_host_.reset(new ui::DelegatedFrameHostAndroid( | 463 delegated_frame_host_.reset(new ui::DelegatedFrameHostAndroid( |
| 464 &view_, cached_background_color_, | 464 &view_, cached_background_color_, this)); |
| 465 base::Bind(&RenderWidgetHostViewAndroid::ReturnResources, | |
| 466 weak_ptr_factory_.GetWeakPtr()))); | |
| 467 } | 465 } |
| 468 | 466 |
| 469 host_->SetView(this); | 467 host_->SetView(this); |
| 470 SetContentViewCore(content_view_core); | 468 SetContentViewCore(content_view_core); |
| 471 | 469 |
| 472 if (GetTextInputManager()) | 470 if (GetTextInputManager()) |
| 473 GetTextInputManager()->AddObserver(this); | 471 GetTextInputManager()->AddObserver(this); |
| 474 } | 472 } |
| 475 | 473 |
| 476 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { | 474 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 delegated_frame_host_->UpdateBackgroundColor(color); | 797 delegated_frame_host_->UpdateBackgroundColor(color); |
| 800 | 798 |
| 801 if (content_view_core_) | 799 if (content_view_core_) |
| 802 content_view_core_->OnBackgroundColorChanged(color); | 800 content_view_core_->OnBackgroundColorChanged(color); |
| 803 } | 801 } |
| 804 | 802 |
| 805 void RenderWidgetHostViewAndroid::SetNeedsBeginFrames(bool needs_begin_frames) { | 803 void RenderWidgetHostViewAndroid::SetNeedsBeginFrames(bool needs_begin_frames) { |
| 806 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SetNeedsBeginFrames", | 804 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SetNeedsBeginFrames", |
| 807 "needs_begin_frames", needs_begin_frames); | 805 "needs_begin_frames", needs_begin_frames); |
| 808 if (needs_begin_frames) | 806 if (needs_begin_frames) |
| 809 RequestVSyncUpdate(PERSISTENT_BEGIN_FRAME); | 807 AddBeginFrameRequest(PERSISTENT_BEGIN_FRAME); |
| 810 else | 808 else |
| 811 outstanding_vsync_requests_ &= ~PERSISTENT_BEGIN_FRAME; | 809 ClearBeginFrameRequest(PERSISTENT_BEGIN_FRAME); |
| 812 } | 810 } |
| 813 | 811 |
| 814 void RenderWidgetHostViewAndroid::OnStartContentIntent( | 812 void RenderWidgetHostViewAndroid::OnStartContentIntent( |
| 815 const GURL& content_url, bool is_main_frame) { | 813 const GURL& content_url, bool is_main_frame) { |
| 816 if (content_view_core_) | 814 if (content_view_core_) |
| 817 content_view_core_->StartContentIntent(content_url, is_main_frame); | 815 content_view_core_->StartContentIntent(content_url, is_main_frame); |
| 818 } | 816 } |
| 819 | 817 |
| 820 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted( | 818 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted( |
| 821 const base::string16& text, | 819 const base::string16& text, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 851 if (!result.succeeded) | 849 if (!result.succeeded) |
| 852 return false; | 850 return false; |
| 853 | 851 |
| 854 blink::WebTouchEvent web_event = ui::CreateWebTouchEventFromMotionEvent( | 852 blink::WebTouchEvent web_event = ui::CreateWebTouchEventFromMotionEvent( |
| 855 event, result.moved_beyond_slop_region); | 853 event, result.moved_beyond_slop_region); |
| 856 ui::LatencyInfo latency_info(ui::SourceEventType::TOUCH); | 854 ui::LatencyInfo latency_info(ui::SourceEventType::TOUCH); |
| 857 latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); | 855 latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); |
| 858 host_->ForwardTouchEventWithLatencyInfo(web_event, latency_info); | 856 host_->ForwardTouchEventWithLatencyInfo(web_event, latency_info); |
| 859 | 857 |
| 860 // Send a proactive BeginFrame for this vsync to reduce scroll latency for | 858 // Send a proactive BeginFrame for this vsync to reduce scroll latency for |
| 861 // scroll-inducing touch events. Note that Android's Choreographer ensures | 859 // scroll-inducing touch events. Note that even if we weren't observing the |
| 862 // that BeginFrame requests made during ACTION_MOVE dispatch will be honored | 860 // BeginFrameSource prior to this, we will receive a (missed) BeginFrame for |
| 863 // in the same vsync phase. | 861 // the current vsync phase. |
| 864 if (observing_root_window_ && result.moved_beyond_slop_region) | 862 if (observing_root_window_ && result.moved_beyond_slop_region) |
| 865 RequestVSyncUpdate(BEGIN_FRAME); | 863 AddBeginFrameRequest(BEGIN_FRAME); |
| 866 | 864 |
| 867 return true; | 865 return true; |
| 868 } | 866 } |
| 869 | 867 |
| 870 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( | 868 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( |
| 871 const ui::MotionEvent& event) { | 869 const ui::MotionEvent& event) { |
| 872 return selection_controller_ && | 870 return selection_controller_ && |
| 873 selection_controller_->WillHandleTouchEvent(event); | 871 selection_controller_->WillHandleTouchEvent(event); |
| 874 } | 872 } |
| 875 | 873 |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1152 if (!delegated_frame_host_->HasDelegatedContent()) | 1150 if (!delegated_frame_host_->HasDelegatedContent()) |
| 1153 return; | 1151 return; |
| 1154 | 1152 |
| 1155 frame_evictor_->DiscardedFrame(); | 1153 frame_evictor_->DiscardedFrame(); |
| 1156 delegated_frame_host_->DestroyDelegatedContent(); | 1154 delegated_frame_host_->DestroyDelegatedContent(); |
| 1157 } | 1155 } |
| 1158 | 1156 |
| 1159 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( | 1157 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
| 1160 uint32_t compositor_frame_sink_id, | 1158 uint32_t compositor_frame_sink_id, |
| 1161 cc::CompositorFrame frame) { | 1159 cc::CompositorFrame frame) { |
| 1160 uint64_t begin_frame_source_id = frame.metadata.begin_frame_source_id; |
| 1161 uint64_t begin_frame_number = frame.metadata.begin_frame_number; |
| 1162 uint64_t oldest_incorporated_frame = frame.metadata.oldest_incorporated_frame; |
| 1163 |
| 1162 InternalSwapCompositorFrame(compositor_frame_sink_id, std::move(frame)); | 1164 InternalSwapCompositorFrame(compositor_frame_sink_id, std::move(frame)); |
| 1165 |
| 1166 // DelegatedFrameHostAndroid always submits a frame. |
| 1167 bool has_updates = true; |
| 1168 cc::BeginFrameAck ack(begin_frame_source_id, begin_frame_number, |
| 1169 oldest_incorporated_frame, 0, has_updates); |
| 1170 if (begin_frame_source_) |
| 1171 begin_frame_source_->DidFinishFrame(this, ack); |
| 1172 } |
| 1173 |
| 1174 void RenderWidgetHostViewAndroid::OnBeginFrameDidNotDraw( |
| 1175 cc::BeginFrameAck ack) { |
| 1176 if (begin_frame_source_) |
| 1177 begin_frame_source_->DidFinishFrame(this, ack); |
| 1163 } | 1178 } |
| 1164 | 1179 |
| 1165 void RenderWidgetHostViewAndroid::ClearCompositorFrame() { | 1180 void RenderWidgetHostViewAndroid::ClearCompositorFrame() { |
| 1166 DestroyDelegatedContent(); | 1181 DestroyDelegatedContent(); |
| 1167 } | 1182 } |
| 1168 | 1183 |
| 1169 void RenderWidgetHostViewAndroid::RetainFrame(uint32_t compositor_frame_sink_id, | 1184 void RenderWidgetHostViewAndroid::RetainFrame(uint32_t compositor_frame_sink_id, |
| 1170 cc::CompositorFrame frame) { | 1185 cc::CompositorFrame frame) { |
| 1171 DCHECK(locks_on_frame_count_); | 1186 DCHECK(locks_on_frame_count_); |
| 1172 | 1187 |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1381 | 1396 |
| 1382 view_.GetLayer()->SetHideLayerAndSubtree(false); | 1397 view_.GetLayer()->SetHideLayerAndSubtree(false); |
| 1383 | 1398 |
| 1384 frame_evictor_->SetVisible(true); | 1399 frame_evictor_->SetVisible(true); |
| 1385 | 1400 |
| 1386 if (overscroll_controller_) | 1401 if (overscroll_controller_) |
| 1387 overscroll_controller_->Enable(); | 1402 overscroll_controller_->Enable(); |
| 1388 | 1403 |
| 1389 host_->WasShown(ui::LatencyInfo()); | 1404 host_->WasShown(ui::LatencyInfo()); |
| 1390 | 1405 |
| 1391 if (content_view_core_) { | 1406 if (content_view_core_ && view_.GetWindowAndroid()) { |
| 1392 StartObservingRootWindow(); | 1407 StartObservingRootWindow(); |
| 1393 RequestVSyncUpdate(BEGIN_FRAME); | 1408 AddBeginFrameRequest(BEGIN_FRAME); |
| 1394 } | 1409 } |
| 1395 } | 1410 } |
| 1396 | 1411 |
| 1397 void RenderWidgetHostViewAndroid::HideInternal() { | 1412 void RenderWidgetHostViewAndroid::HideInternal() { |
| 1398 DCHECK(!is_showing_ || !is_window_activity_started_ || !is_window_visible_) | 1413 DCHECK(!is_showing_ || !is_window_activity_started_ || !is_window_visible_) |
| 1399 << "Hide called when the widget should be shown."; | 1414 << "Hide called when the widget should be shown."; |
| 1400 | 1415 |
| 1401 // Only preserve the frontbuffer if the activity was stopped while the | 1416 // Only preserve the frontbuffer if the activity was stopped while the |
| 1402 // window is still visible. This avoids visual artificts when transitioning | 1417 // window is still visible. This avoids visual artificts when transitioning |
| 1403 // between activities. | 1418 // between activities. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1426 if (overscroll_controller_) | 1441 if (overscroll_controller_) |
| 1427 overscroll_controller_->Disable(); | 1442 overscroll_controller_->Disable(); |
| 1428 | 1443 |
| 1429 RunAckCallbacks(); | 1444 RunAckCallbacks(); |
| 1430 | 1445 |
| 1431 // Inform the renderer that we are being hidden so it can reduce its resource | 1446 // Inform the renderer that we are being hidden so it can reduce its resource |
| 1432 // utilization. | 1447 // utilization. |
| 1433 host_->WasHidden(); | 1448 host_->WasHidden(); |
| 1434 } | 1449 } |
| 1435 | 1450 |
| 1436 void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32_t requests) { | 1451 void RenderWidgetHostViewAndroid::SetBeginFrameSource( |
| 1437 bool should_request_vsync = !outstanding_vsync_requests_ && requests; | 1452 cc::BeginFrameSource* begin_frame_source) { |
| 1438 outstanding_vsync_requests_ |= requests; | 1453 if (begin_frame_source_ == begin_frame_source) |
| 1454 return; |
| 1439 | 1455 |
| 1440 // Note that if we're not currently observing the root window, outstanding | 1456 if (begin_frame_source_ && outstanding_begin_frame_requests_) |
| 1441 // vsync requests will be pushed if/when we resume observing in | 1457 begin_frame_source_->RemoveObserver(this); |
| 1442 // |StartObservingRootWindow()|. | 1458 begin_frame_source_ = begin_frame_source; |
| 1443 if (observing_root_window_ && should_request_vsync) { | 1459 if (begin_frame_source_ && outstanding_begin_frame_requests_) |
| 1460 begin_frame_source_->AddObserver(this); |
| 1461 } |
| 1462 |
| 1463 void RenderWidgetHostViewAndroid::AddBeginFrameRequest( |
| 1464 BeginFrameRequestType request) { |
| 1465 DCHECK(this); |
| 1466 uint32_t requests = outstanding_begin_frame_requests_ | request; |
| 1467 |
| 1468 // Note that if we don't currently have a BeginFrameSource, outstanding begin |
| 1469 // frame requests will be pushed if/when we get one during |
| 1470 // |StartObservingRootWindow()| or when the DelegatedFrameHostAndroid sets it. |
| 1471 cc::BeginFrameSource* source = begin_frame_source_; |
| 1472 if (source && requests && !outstanding_begin_frame_requests_) { |
| 1444 ui::WindowAndroid* windowAndroid = view_.GetWindowAndroid(); | 1473 ui::WindowAndroid* windowAndroid = view_.GetWindowAndroid(); |
| 1445 DCHECK(windowAndroid); | 1474 DCHECK(windowAndroid); |
| 1446 // TODO(boliu): This check should be redundant with | 1475 // TODO(boliu): This check should be redundant with |source| check above. |
| 1447 // |observing_root_window_| check above. However we are receiving trickle | 1476 // However, there seem to be cases where we are not notified of window |
| 1448 // of crash reports (crbug.com/639868) with no root cause. Should | 1477 // destruction, which invalidates the BeginFrameSource. See also related |
| 1449 // investigate more when time allows what corner case is missed. | 1478 // crash reports in crbug.com/639868. |
| 1450 if (windowAndroid) | 1479 if (windowAndroid) |
| 1451 windowAndroid->RequestVSyncUpdate(); | 1480 source->AddObserver(this); |
| 1452 } | 1481 } |
| 1482 outstanding_begin_frame_requests_ = requests; |
| 1483 } |
| 1484 |
| 1485 void RenderWidgetHostViewAndroid::ClearBeginFrameRequest( |
| 1486 BeginFrameRequestType request) { |
| 1487 uint32_t requests = outstanding_begin_frame_requests_ & ~request; |
| 1488 |
| 1489 cc::BeginFrameSource* source = begin_frame_source_; |
| 1490 if (source && !requests && outstanding_begin_frame_requests_) |
| 1491 source->RemoveObserver(this); |
| 1492 outstanding_begin_frame_requests_ = requests; |
| 1453 } | 1493 } |
| 1454 | 1494 |
| 1455 void RenderWidgetHostViewAndroid::StartObservingRootWindow() { | 1495 void RenderWidgetHostViewAndroid::StartObservingRootWindow() { |
| 1456 DCHECK(content_view_core_); | 1496 DCHECK(content_view_core_); |
| 1457 // TODO(yusufo): This will need to have a better fallback for cases where | |
| 1458 // setContentViewCore is called with a valid ContentViewCore without a window. | |
| 1459 DCHECK(view_.GetWindowAndroid()); | 1497 DCHECK(view_.GetWindowAndroid()); |
| 1460 DCHECK(is_showing_); | 1498 DCHECK(is_showing_); |
| 1461 if (observing_root_window_) | 1499 if (observing_root_window_) |
| 1462 return; | 1500 return; |
| 1463 | 1501 |
| 1464 observing_root_window_ = true; | 1502 observing_root_window_ = true; |
| 1465 if (host_) | 1503 if (host_) |
| 1466 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), false)); | 1504 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), false)); |
| 1467 view_.GetWindowAndroid()->AddObserver(this); | 1505 view_.GetWindowAndroid()->AddObserver(this); |
| 1468 | 1506 // When using browser compositor, DelegatedFrameHostAndroid provides the BFS. |
| 1469 // Clear existing vsync requests to allow a request to the new window. | 1507 if (!using_browser_compositor_) |
| 1470 uint32_t outstanding_vsync_requests = outstanding_vsync_requests_; | 1508 SetBeginFrameSource(view_.GetWindowAndroid()->GetBeginFrameSource()); |
| 1471 outstanding_vsync_requests_ = 0; | |
| 1472 RequestVSyncUpdate(outstanding_vsync_requests); | |
| 1473 | 1509 |
| 1474 ui::WindowAndroidCompositor* compositor = | 1510 ui::WindowAndroidCompositor* compositor = |
| 1475 view_.GetWindowAndroid()->GetCompositor(); | 1511 view_.GetWindowAndroid()->GetCompositor(); |
| 1476 if (compositor) { | 1512 if (compositor) { |
| 1477 delegated_frame_host_->RegisterFrameSinkHierarchy( | 1513 delegated_frame_host_->RegisterFrameSinkHierarchy( |
| 1478 compositor->GetFrameSinkId()); | 1514 compositor->GetFrameSinkId()); |
| 1479 } | 1515 } |
| 1480 } | 1516 } |
| 1481 | 1517 |
| 1482 void RenderWidgetHostViewAndroid::StopObservingRootWindow() { | 1518 void RenderWidgetHostViewAndroid::StopObservingRootWindow() { |
| 1483 if (!(view_.GetWindowAndroid())) { | 1519 if (!(view_.GetWindowAndroid())) { |
| 1484 DCHECK(!observing_root_window_); | 1520 DCHECK(!observing_root_window_); |
| 1485 return; | 1521 return; |
| 1486 } | 1522 } |
| 1487 | 1523 |
| 1488 if (!observing_root_window_) | 1524 if (!observing_root_window_) |
| 1489 return; | 1525 return; |
| 1490 | 1526 |
| 1491 // Reset window state variables to their defaults. | 1527 // Reset window state variables to their defaults. |
| 1492 is_window_activity_started_ = true; | 1528 is_window_activity_started_ = true; |
| 1493 is_window_visible_ = true; | 1529 is_window_visible_ = true; |
| 1494 observing_root_window_ = false; | 1530 observing_root_window_ = false; |
| 1495 if (host_) | 1531 if (host_) |
| 1496 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), true)); | 1532 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), true)); |
| 1497 view_.GetWindowAndroid()->RemoveObserver(this); | 1533 view_.GetWindowAndroid()->RemoveObserver(this); |
| 1534 if (!using_browser_compositor_) |
| 1535 SetBeginFrameSource(nullptr); |
| 1498 // If the DFH has already been destroyed, it will have cleaned itself up. | 1536 // If the DFH has already been destroyed, it will have cleaned itself up. |
| 1499 // This happens in some WebView cases. | 1537 // This happens in some WebView cases. |
| 1500 if (delegated_frame_host_) | 1538 if (delegated_frame_host_) |
| 1501 delegated_frame_host_->UnregisterFrameSinkHierarchy(); | 1539 delegated_frame_host_->UnregisterFrameSinkHierarchy(); |
| 1540 DCHECK_EQ(nullptr, begin_frame_source_); |
| 1502 } | 1541 } |
| 1503 | 1542 |
| 1504 void RenderWidgetHostViewAndroid::SendBeginFrame(base::TimeTicks frame_time, | 1543 void RenderWidgetHostViewAndroid::SendBeginFrame(cc::BeginFrameArgs args) { |
| 1505 base::TimeDelta vsync_period) { | 1544 TRACE_EVENT2("cc", "RenderWidgetHostViewAndroid::SendBeginFrame", |
| 1506 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SendBeginFrame", | 1545 "frame_number", args.sequence_number, |
| 1507 "frame_time_us", frame_time.ToInternalValue()); | 1546 "frame_time_us", args.frame_time.ToInternalValue()); |
| 1508 | 1547 |
| 1509 // Synchronous compositor does not use deadline-based scheduling. | 1548 // Synchronous compositor does not use deadline-based scheduling. |
| 1510 // TODO(brianderson): Replace this hardcoded deadline after Android | 1549 // TODO(brianderson): Replace this hardcoded deadline after Android |
| 1511 // switches to Surfaces and the Browser's commit isn't in the critcal path. | 1550 // switches to Surfaces and the Browser's commit isn't in the critical path. |
| 1512 base::TimeTicks deadline = | 1551 args.deadline = sync_compositor_ ? base::TimeTicks() |
| 1513 sync_compositor_ ? base::TimeTicks() : frame_time + (vsync_period * 0.6); | 1552 : args.frame_time + (args.interval * 0.6); |
| 1514 host_->Send(new ViewMsg_BeginFrame( | 1553 host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args)); |
| 1515 host_->GetRoutingID(), | |
| 1516 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, | |
| 1517 vsync_period, cc::BeginFrameArgs::NORMAL))); | |
| 1518 if (sync_compositor_) | 1554 if (sync_compositor_) |
| 1519 sync_compositor_->DidSendBeginFrame(view_.GetWindowAndroid()); | 1555 sync_compositor_->DidSendBeginFrame(view_.GetWindowAndroid()); |
| 1520 } | 1556 } |
| 1521 | 1557 |
| 1522 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { | 1558 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { |
| 1523 bool needs_animate = false; | 1559 bool needs_animate = false; |
| 1524 if (overscroll_controller_) { | 1560 if (overscroll_controller_) { |
| 1525 needs_animate |= overscroll_controller_->Animate( | 1561 needs_animate |= overscroll_controller_->Animate( |
| 1526 frame_time, content_view_core_->GetViewAndroid()->GetLayer()); | 1562 frame_time, content_view_core_->GetViewAndroid()->GetLayer()); |
| 1527 } | 1563 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1621 if (shim && gpu_data && | 1657 if (shim && gpu_data && |
| 1622 gpu_data->IsDriverBugWorkaroundActive(gpu::WAKE_UP_GPU_BEFORE_DRAWING)) | 1658 gpu_data->IsDriverBugWorkaroundActive(gpu::WAKE_UP_GPU_BEFORE_DRAWING)) |
| 1623 shim->Send(new GpuMsg_WakeUpGpu); | 1659 shim->Send(new GpuMsg_WakeUpGpu); |
| 1624 } | 1660 } |
| 1625 | 1661 |
| 1626 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; | 1662 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; |
| 1627 } | 1663 } |
| 1628 | 1664 |
| 1629 void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { | 1665 void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { |
| 1630 TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput"); | 1666 TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput"); |
| 1631 RequestVSyncUpdate(FLUSH_INPUT); | 1667 AddBeginFrameRequest(FLUSH_INPUT); |
| 1632 } | 1668 } |
| 1633 | 1669 |
| 1634 BrowserAccessibilityManager* | 1670 BrowserAccessibilityManager* |
| 1635 RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManager( | 1671 RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManager( |
| 1636 BrowserAccessibilityDelegate* delegate, bool for_root_frame) { | 1672 BrowserAccessibilityDelegate* delegate, bool for_root_frame) { |
| 1637 base::android::ScopedJavaLocalRef<jobject> content_view_core_obj; | 1673 base::android::ScopedJavaLocalRef<jobject> content_view_core_obj; |
| 1638 if (for_root_frame && host_ && content_view_core_) | 1674 if (for_root_frame && host_ && content_view_core_) |
| 1639 content_view_core_obj = content_view_core_->GetJavaObject(); | 1675 content_view_core_obj = content_view_core_->GetJavaObject(); |
| 1640 return new BrowserAccessibilityManagerAndroid( | 1676 return new BrowserAccessibilityManagerAndroid( |
| 1641 content_view_core_obj, | 1677 content_view_core_obj, |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1800 if (content_view_core_) | 1836 if (content_view_core_) |
| 1801 obj = content_view_core_->GetJavaObject(); | 1837 obj = content_view_core_->GetJavaObject(); |
| 1802 manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); | 1838 manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); |
| 1803 } | 1839 } |
| 1804 | 1840 |
| 1805 if (!content_view_core_) { | 1841 if (!content_view_core_) { |
| 1806 sync_compositor_.reset(); | 1842 sync_compositor_.reset(); |
| 1807 return; | 1843 return; |
| 1808 } | 1844 } |
| 1809 | 1845 |
| 1810 if (is_showing_) | 1846 if (is_showing_ && view_.GetWindowAndroid()) |
| 1811 StartObservingRootWindow(); | 1847 StartObservingRootWindow(); |
| 1812 | 1848 |
| 1813 if (resize) | 1849 if (resize) |
| 1814 WasResized(); | 1850 WasResized(); |
| 1815 | 1851 |
| 1816 if (!selection_controller_) | 1852 if (!selection_controller_) |
| 1817 selection_controller_ = CreateSelectionController(this, content_view_core_); | 1853 selection_controller_ = CreateSelectionController(this, content_view_core_); |
| 1818 | 1854 |
| 1819 if (!overscroll_controller_ && | 1855 if (!overscroll_controller_ && |
| 1820 view_.GetWindowAndroid()->GetCompositor()) { | 1856 view_.GetWindowAndroid()->GetCompositor()) { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1880 void RenderWidgetHostViewAndroid::OnDetachedFromWindow() { | 1916 void RenderWidgetHostViewAndroid::OnDetachedFromWindow() { |
| 1881 StopObservingRootWindow(); | 1917 StopObservingRootWindow(); |
| 1882 OnDetachCompositor(); | 1918 OnDetachCompositor(); |
| 1883 } | 1919 } |
| 1884 | 1920 |
| 1885 void RenderWidgetHostViewAndroid::OnAttachCompositor() { | 1921 void RenderWidgetHostViewAndroid::OnAttachCompositor() { |
| 1886 DCHECK(content_view_core_); | 1922 DCHECK(content_view_core_); |
| 1887 if (!overscroll_controller_) | 1923 if (!overscroll_controller_) |
| 1888 overscroll_controller_ = CreateOverscrollController( | 1924 overscroll_controller_ = CreateOverscrollController( |
| 1889 content_view_core_, ui::GetScaleFactorForNativeView(GetNativeView())); | 1925 content_view_core_, ui::GetScaleFactorForNativeView(GetNativeView())); |
| 1890 ui::WindowAndroidCompositor* compositor = | 1926 if (observing_root_window_) { |
| 1891 view_.GetWindowAndroid()->GetCompositor(); | 1927 ui::WindowAndroidCompositor* compositor = |
| 1892 delegated_frame_host_->RegisterFrameSinkHierarchy( | 1928 view_.GetWindowAndroid()->GetCompositor(); |
| 1893 compositor->GetFrameSinkId()); | 1929 delegated_frame_host_->RegisterFrameSinkHierarchy( |
| 1930 compositor->GetFrameSinkId()); |
| 1931 } |
| 1894 } | 1932 } |
| 1895 | 1933 |
| 1896 void RenderWidgetHostViewAndroid::OnDetachCompositor() { | 1934 void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
| 1897 DCHECK(content_view_core_); | 1935 DCHECK(content_view_core_); |
| 1898 DCHECK(using_browser_compositor_); | 1936 DCHECK(using_browser_compositor_); |
| 1899 RunAckCallbacks(); | 1937 RunAckCallbacks(); |
| 1900 overscroll_controller_.reset(); | 1938 overscroll_controller_.reset(); |
| 1901 delegated_frame_host_->UnregisterFrameSinkHierarchy(); | 1939 delegated_frame_host_->UnregisterFrameSinkHierarchy(); |
| 1902 } | 1940 } |
| 1903 | 1941 |
| 1904 void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time, | 1942 void RenderWidgetHostViewAndroid::OnBeginFrame(const cc::BeginFrameArgs& args) { |
| 1905 base::TimeDelta vsync_period) { | 1943 TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnBeginFrame"); |
| 1906 TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnVSync"); | |
| 1907 if (!host_) | 1944 if (!host_) |
| 1908 return; | 1945 return; |
| 1909 | 1946 |
| 1910 if (outstanding_vsync_requests_ & FLUSH_INPUT) { | 1947 // In sync mode, we disregard missed frame args to ensure that |
| 1911 outstanding_vsync_requests_ &= ~FLUSH_INPUT; | 1948 // SynchronousCompositorBrowserFilter::SyncStateAfterVSync will be called |
| 1949 // during an OnVSync() observer iteration. |
| 1950 if (sync_compositor_ && args.type == cc::BeginFrameArgs::MISSED) |
| 1951 return; |
| 1952 |
| 1953 if (outstanding_begin_frame_requests_ & FLUSH_INPUT) { |
| 1954 ClearBeginFrameRequest(FLUSH_INPUT); |
| 1912 host_->FlushInput(); | 1955 host_->FlushInput(); |
| 1913 } | 1956 } |
| 1914 | 1957 |
| 1915 if (outstanding_vsync_requests_ & BEGIN_FRAME || | 1958 if ((outstanding_begin_frame_requests_ & BEGIN_FRAME) || |
| 1916 outstanding_vsync_requests_ & PERSISTENT_BEGIN_FRAME) { | 1959 (outstanding_begin_frame_requests_ & PERSISTENT_BEGIN_FRAME)) { |
| 1917 outstanding_vsync_requests_ &= ~BEGIN_FRAME; | 1960 ClearBeginFrameRequest(BEGIN_FRAME); |
| 1918 SendBeginFrame(frame_time, vsync_period); | 1961 SendBeginFrame(args); |
| 1919 } | 1962 } |
| 1920 | 1963 |
| 1921 // This allows for SendBeginFrame and FlushInput to modify | 1964 last_begin_frame_args_ = args; |
| 1922 // outstanding_vsync_requests. | 1965 } |
| 1923 uint32_t outstanding_vsync_requests = outstanding_vsync_requests_; | 1966 |
| 1924 outstanding_vsync_requests_ = 0; | 1967 const cc::BeginFrameArgs& RenderWidgetHostViewAndroid::LastUsedBeginFrameArgs() |
| 1925 RequestVSyncUpdate(outstanding_vsync_requests); | 1968 const { |
| 1969 return last_begin_frame_args_; |
| 1970 } |
| 1971 |
| 1972 void RenderWidgetHostViewAndroid::OnBeginFrameSourcePausedChanged(bool paused) { |
| 1973 // The BeginFrameSources we listen to don't use this. For WebView, we signal |
| 1974 // the "paused" state to the RenderWidget when our window attaches/detaches, |
| 1975 // see |StartObservingRootWindow()| and |StopObservingRootWindow()|. |
| 1976 DCHECK(!paused); |
| 1926 } | 1977 } |
| 1927 | 1978 |
| 1928 void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) { | 1979 void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) { |
| 1929 if (Animate(begin_frame_time)) | 1980 if (Animate(begin_frame_time)) |
| 1930 SetNeedsAnimate(); | 1981 SetNeedsAnimate(); |
| 1931 } | 1982 } |
| 1932 | 1983 |
| 1933 void RenderWidgetHostViewAndroid::OnActivityStopped() { | 1984 void RenderWidgetHostViewAndroid::OnActivityStopped() { |
| 1934 TRACE_EVENT0("browser", "RenderWidgetHostViewAndroid::OnActivityStopped"); | 1985 TRACE_EVENT0("browser", "RenderWidgetHostViewAndroid::OnActivityStopped"); |
| 1935 DCHECK(observing_root_window_); | 1986 DCHECK(observing_root_window_); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1994 case ui::MotionEvent::ACTION_UP: | 2045 case ui::MotionEvent::ACTION_UP: |
| 1995 case ui::MotionEvent::ACTION_POINTER_UP: | 2046 case ui::MotionEvent::ACTION_POINTER_UP: |
| 1996 UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED", | 2047 UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED", |
| 1997 delta.InMicroseconds(), 1, 1000000, 50); | 2048 delta.InMicroseconds(), 1, 1000000, 50); |
| 1998 default: | 2049 default: |
| 1999 return; | 2050 return; |
| 2000 } | 2051 } |
| 2001 } | 2052 } |
| 2002 | 2053 |
| 2003 } // namespace content | 2054 } // namespace content |
| OLD | NEW |