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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
70 #include "content/public/common/content_switches.h" | 70 #include "content/public/common/content_switches.h" |
71 #include "gpu/command_buffer/client/gles2_implementation.h" | 71 #include "gpu/command_buffer/client/gles2_implementation.h" |
72 #include "gpu/command_buffer/client/gles2_interface.h" | 72 #include "gpu/command_buffer/client/gles2_interface.h" |
73 #include "gpu/config/gpu_driver_bug_workaround_type.h" | 73 #include "gpu/config/gpu_driver_bug_workaround_type.h" |
74 #include "ipc/ipc_message_macros.h" | 74 #include "ipc/ipc_message_macros.h" |
75 #include "ipc/ipc_message_start.h" | 75 #include "ipc/ipc_message_start.h" |
76 #include "skia/ext/image_operations.h" | 76 #include "skia/ext/image_operations.h" |
77 #include "third_party/khronos/GLES2/gl2.h" | 77 #include "third_party/khronos/GLES2/gl2.h" |
78 #include "third_party/khronos/GLES2/gl2ext.h" | 78 #include "third_party/khronos/GLES2/gl2ext.h" |
79 #include "third_party/skia/include/core/SkCanvas.h" | 79 #include "third_party/skia/include/core/SkCanvas.h" |
80 #include "ui/android/delegated_frame_host_android.h" | |
81 #include "ui/android/window_android.h" | 80 #include "ui/android/window_android.h" |
82 #include "ui/android/window_android_compositor.h" | 81 #include "ui/android/window_android_compositor.h" |
83 #include "ui/base/layout.h" | 82 #include "ui/base/layout.h" |
84 #include "ui/display/display.h" | 83 #include "ui/display/display.h" |
85 #include "ui/display/screen.h" | 84 #include "ui/display/screen.h" |
86 #include "ui/events/base_event_utils.h" | 85 #include "ui/events/base_event_utils.h" |
87 #include "ui/events/blink/blink_event_util.h" | 86 #include "ui/events/blink/blink_event_util.h" |
88 #include "ui/events/blink/did_overscroll_params.h" | 87 #include "ui/events/blink/did_overscroll_params.h" |
89 #include "ui/events/blink/web_input_event_traits.h" | 88 #include "ui/events/blink/web_input_event_traits.h" |
90 #include "ui/events/gesture_detection/gesture_provider_config_helper.h" | 89 #include "ui/events/gesture_detection/gesture_provider_config_helper.h" |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
425 static_cast<RenderWidgetHostViewAndroid*>(widget->GetView()) | 424 static_cast<RenderWidgetHostViewAndroid*>(widget->GetView()) |
426 ->OnLostResources(); | 425 ->OnLostResources(); |
427 } | 426 } |
428 } | 427 } |
429 } | 428 } |
430 | 429 |
431 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( | 430 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
432 RenderWidgetHostImpl* widget_host, | 431 RenderWidgetHostImpl* widget_host, |
433 ContentViewCoreImpl* content_view_core) | 432 ContentViewCoreImpl* content_view_core) |
434 : host_(widget_host), | 433 : host_(widget_host), |
435 outstanding_vsync_requests_(0), | 434 begin_frame_source_(nullptr), |
435 outstanding_begin_frame_requests_(0), | |
436 is_showing_(!widget_host->is_hidden()), | 436 is_showing_(!widget_host->is_hidden()), |
437 is_window_visible_(true), | 437 is_window_visible_(true), |
438 is_window_activity_started_(true), | 438 is_window_activity_started_(true), |
439 is_showing_overscroll_glow_(true), | 439 is_showing_overscroll_glow_(true), |
440 content_view_core_(nullptr), | 440 content_view_core_(nullptr), |
441 ime_adapter_android_(this), | 441 ime_adapter_android_(this), |
442 cached_background_color_(SK_ColorWHITE), | 442 cached_background_color_(SK_ColorWHITE), |
443 last_compositor_frame_sink_id_(kUndefinedCompositorFrameSinkId), | 443 last_compositor_frame_sink_id_(kUndefinedCompositorFrameSinkId), |
444 gesture_provider_(ui::GetGestureProviderConfig( | 444 gesture_provider_(ui::GetGestureProviderConfig( |
445 ui::GestureProviderConfigType::CURRENT_PLATFORM), | 445 ui::GestureProviderConfigType::CURRENT_PLATFORM), |
446 this), | 446 this), |
447 stylus_text_selector_(this), | 447 stylus_text_selector_(this), |
448 using_browser_compositor_(CompositorImpl::IsInitialized()), | 448 using_browser_compositor_(CompositorImpl::IsInitialized()), |
449 synchronous_compositor_client_(nullptr), | 449 synchronous_compositor_client_(nullptr), |
450 frame_evictor_(new DelegatedFrameEvictor(this)), | 450 frame_evictor_(new DelegatedFrameEvictor(this)), |
451 locks_on_frame_count_(0), | 451 locks_on_frame_count_(0), |
452 observing_root_window_(false), | 452 observing_root_window_(false), |
453 weak_ptr_factory_(this) { | 453 weak_ptr_factory_(this) { |
454 // Set the layer which will hold the content layer for this view. The content | 454 // Set the layer which will hold the content layer for this view. The content |
455 // layer is managed by the DelegatedFrameHost. | 455 // layer is managed by the DelegatedFrameHost. |
456 view_.SetLayer(cc::Layer::Create()); | 456 view_.SetLayer(cc::Layer::Create()); |
457 if (using_browser_compositor_) { | 457 if (using_browser_compositor_) { |
458 delegated_frame_host_.reset(new ui::DelegatedFrameHostAndroid( | 458 delegated_frame_host_.reset(new ui::DelegatedFrameHostAndroid( |
459 &view_, cached_background_color_, | 459 &view_, cached_background_color_, this)); |
460 base::Bind(&RenderWidgetHostViewAndroid::ReturnResources, | |
461 weak_ptr_factory_.GetWeakPtr()))); | |
462 } | 460 } |
463 | 461 |
464 host_->SetView(this); | 462 host_->SetView(this); |
465 SetContentViewCore(content_view_core); | 463 SetContentViewCore(content_view_core); |
466 | 464 |
467 CreateOverscrollControllerIfPossible(); | 465 CreateOverscrollControllerIfPossible(); |
468 | 466 |
469 if (GetTextInputManager()) | 467 if (GetTextInputManager()) |
470 GetTextInputManager()->AddObserver(this); | 468 GetTextInputManager()->AddObserver(this); |
471 } | 469 } |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
791 delegated_frame_host_->UpdateBackgroundColor(color); | 789 delegated_frame_host_->UpdateBackgroundColor(color); |
792 | 790 |
793 if (content_view_core_) | 791 if (content_view_core_) |
794 content_view_core_->OnBackgroundColorChanged(color); | 792 content_view_core_->OnBackgroundColorChanged(color); |
795 } | 793 } |
796 | 794 |
797 void RenderWidgetHostViewAndroid::SetNeedsBeginFrames(bool needs_begin_frames) { | 795 void RenderWidgetHostViewAndroid::SetNeedsBeginFrames(bool needs_begin_frames) { |
798 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SetNeedsBeginFrames", | 796 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SetNeedsBeginFrames", |
799 "needs_begin_frames", needs_begin_frames); | 797 "needs_begin_frames", needs_begin_frames); |
800 if (needs_begin_frames) | 798 if (needs_begin_frames) |
801 RequestVSyncUpdate(PERSISTENT_BEGIN_FRAME); | 799 AddBeginFrameRequest(PERSISTENT_BEGIN_FRAME); |
802 else | 800 else |
803 outstanding_vsync_requests_ &= ~PERSISTENT_BEGIN_FRAME; | 801 ClearBeginFrameRequest(PERSISTENT_BEGIN_FRAME); |
804 } | 802 } |
805 | 803 |
806 void RenderWidgetHostViewAndroid::OnStartContentIntent( | 804 void RenderWidgetHostViewAndroid::OnStartContentIntent( |
807 const GURL& content_url, bool is_main_frame) { | 805 const GURL& content_url, bool is_main_frame) { |
808 if (content_view_core_) | 806 if (content_view_core_) |
809 content_view_core_->StartContentIntent(content_url, is_main_frame); | 807 content_view_core_->StartContentIntent(content_url, is_main_frame); |
810 } | 808 } |
811 | 809 |
812 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted( | 810 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted( |
813 const base::string16& text, | 811 const base::string16& text, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
847 event, result.moved_beyond_slop_region); | 845 event, result.moved_beyond_slop_region); |
848 ui::LatencyInfo latency_info(ui::SourceEventType::TOUCH); | 846 ui::LatencyInfo latency_info(ui::SourceEventType::TOUCH); |
849 latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); | 847 latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); |
850 host_->ForwardTouchEventWithLatencyInfo(web_event, latency_info); | 848 host_->ForwardTouchEventWithLatencyInfo(web_event, latency_info); |
851 | 849 |
852 // Send a proactive BeginFrame for this vsync to reduce scroll latency for | 850 // Send a proactive BeginFrame for this vsync to reduce scroll latency for |
853 // scroll-inducing touch events. Note that Android's Choreographer ensures | 851 // scroll-inducing touch events. Note that Android's Choreographer ensures |
854 // that BeginFrame requests made during ACTION_MOVE dispatch will be honored | 852 // that BeginFrame requests made during ACTION_MOVE dispatch will be honored |
855 // in the same vsync phase. | 853 // in the same vsync phase. |
856 if (observing_root_window_ && result.moved_beyond_slop_region) | 854 if (observing_root_window_ && result.moved_beyond_slop_region) |
857 RequestVSyncUpdate(BEGIN_FRAME); | 855 AddBeginFrameRequest(BEGIN_FRAME); |
858 | 856 |
859 return true; | 857 return true; |
860 } | 858 } |
861 | 859 |
862 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( | 860 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( |
863 const ui::MotionEvent& event) { | 861 const ui::MotionEvent& event) { |
864 return selection_controller_ && | 862 return selection_controller_ && |
865 selection_controller_->WillHandleTouchEvent(event); | 863 selection_controller_->WillHandleTouchEvent(event); |
866 } | 864 } |
867 | 865 |
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1378 | 1376 |
1379 view_.GetLayer()->SetHideLayerAndSubtree(false); | 1377 view_.GetLayer()->SetHideLayerAndSubtree(false); |
1380 | 1378 |
1381 frame_evictor_->SetVisible(true); | 1379 frame_evictor_->SetVisible(true); |
1382 | 1380 |
1383 if (overscroll_controller_) | 1381 if (overscroll_controller_) |
1384 overscroll_controller_->Enable(); | 1382 overscroll_controller_->Enable(); |
1385 | 1383 |
1386 host_->WasShown(ui::LatencyInfo()); | 1384 host_->WasShown(ui::LatencyInfo()); |
1387 | 1385 |
1388 if (content_view_core_) { | 1386 if (content_view_core_ && view_.GetWindowAndroid()) { |
1389 StartObservingRootWindow(); | 1387 StartObservingRootWindow(); |
1390 RequestVSyncUpdate(BEGIN_FRAME); | 1388 AddBeginFrameRequest(BEGIN_FRAME); |
1391 } | 1389 } |
1392 } | 1390 } |
1393 | 1391 |
1394 void RenderWidgetHostViewAndroid::HideInternal() { | 1392 void RenderWidgetHostViewAndroid::HideInternal() { |
1395 DCHECK(!is_showing_ || !is_window_activity_started_ || !is_window_visible_) | 1393 DCHECK(!is_showing_ || !is_window_activity_started_ || !is_window_visible_) |
1396 << "Hide called when the widget should be shown."; | 1394 << "Hide called when the widget should be shown."; |
1397 | 1395 |
1398 // Only preserve the frontbuffer if the activity was stopped while the | 1396 // Only preserve the frontbuffer if the activity was stopped while the |
1399 // window is still visible. This avoids visual artificts when transitioning | 1397 // window is still visible. This avoids visual artificts when transitioning |
1400 // between activities. | 1398 // between activities. |
(...skipping 22 matching lines...) Expand all Loading... | |
1423 if (overscroll_controller_) | 1421 if (overscroll_controller_) |
1424 overscroll_controller_->Disable(); | 1422 overscroll_controller_->Disable(); |
1425 | 1423 |
1426 RunAckCallbacks(); | 1424 RunAckCallbacks(); |
1427 | 1425 |
1428 // Inform the renderer that we are being hidden so it can reduce its resource | 1426 // Inform the renderer that we are being hidden so it can reduce its resource |
1429 // utilization. | 1427 // utilization. |
1430 host_->WasHidden(); | 1428 host_->WasHidden(); |
1431 } | 1429 } |
1432 | 1430 |
1433 void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32_t requests) { | 1431 void RenderWidgetHostViewAndroid::SetBeginFrameSource( |
1434 bool should_request_vsync = !outstanding_vsync_requests_ && requests; | 1432 cc::BeginFrameSource* begin_frame_source) { |
1435 outstanding_vsync_requests_ |= requests; | 1433 if (begin_frame_source_ == begin_frame_source) |
1434 return; | |
1436 | 1435 |
1437 // Note that if we're not currently observing the root window, outstanding | 1436 if (begin_frame_source_ && outstanding_begin_frame_requests_) |
1438 // vsync requests will be pushed if/when we resume observing in | 1437 begin_frame_source_->RemoveObserver(this); |
1439 // |StartObservingRootWindow()|. | 1438 begin_frame_source_ = begin_frame_source; |
1440 if (observing_root_window_ && should_request_vsync) { | 1439 if (begin_frame_source_ && outstanding_begin_frame_requests_) |
1441 ui::WindowAndroid* windowAndroid = view_.GetWindowAndroid(); | 1440 begin_frame_source_->AddObserver(this); |
1442 DCHECK(windowAndroid); | 1441 } |
1443 // TODO(boliu): This check should be redundant with | 1442 |
1444 // |observing_root_window_| check above. However we are receiving trickle | 1443 void RenderWidgetHostViewAndroid::AddBeginFrameRequest( |
1445 // of crash reports (crbug.com/639868) with no root cause. Should | 1444 BeginFrameRequestType request) { |
1446 // investigate more when time allows what corner case is missed. | 1445 uint32_t prior_requests = outstanding_begin_frame_requests_; |
1447 if (windowAndroid) | 1446 outstanding_begin_frame_requests_ = prior_requests | request; |
1448 windowAndroid->RequestVSyncUpdate(); | 1447 |
1449 } | 1448 // Note that if we don't currently have a BeginFrameSource, outstanding begin |
1449 // frame requests will be pushed if/when we get one during | |
1450 // |StartObservingRootWindow()| or when the DelegatedFrameHostAndroid sets it. | |
1451 cc::BeginFrameSource* source = begin_frame_source_; | |
1452 if (source && outstanding_begin_frame_requests_ && !prior_requests) | |
1453 source->AddObserver(this); | |
1454 } | |
1455 | |
1456 void RenderWidgetHostViewAndroid::ClearBeginFrameRequest( | |
1457 BeginFrameRequestType request) { | |
1458 uint32_t prior_requests = outstanding_begin_frame_requests_; | |
1459 outstanding_begin_frame_requests_ = prior_requests & ~request; | |
1460 | |
1461 cc::BeginFrameSource* source = begin_frame_source_; | |
1462 if (source && !outstanding_begin_frame_requests_ && prior_requests) | |
1463 source->RemoveObserver(this); | |
1450 } | 1464 } |
1451 | 1465 |
1452 void RenderWidgetHostViewAndroid::StartObservingRootWindow() { | 1466 void RenderWidgetHostViewAndroid::StartObservingRootWindow() { |
1453 DCHECK(content_view_core_); | 1467 DCHECK(content_view_core_); |
1454 // TODO(yusufo): This will need to have a better fallback for cases where | |
1455 // setContentViewCore is called with a valid ContentViewCore without a window. | |
1456 DCHECK(view_.GetWindowAndroid()); | 1468 DCHECK(view_.GetWindowAndroid()); |
1457 DCHECK(is_showing_); | 1469 DCHECK(is_showing_); |
1458 if (observing_root_window_) | 1470 if (observing_root_window_) |
1459 return; | 1471 return; |
1460 | 1472 |
1461 observing_root_window_ = true; | 1473 observing_root_window_ = true; |
1462 if (host_) | 1474 if (host_) |
1463 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), false)); | 1475 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), false)); |
1464 view_.GetWindowAndroid()->AddObserver(this); | 1476 view_.GetWindowAndroid()->AddObserver(this); |
1465 | 1477 // When using browser compositor, DelegatedFrameHostAndroid provides the BFS. |
1466 // Clear existing vsync requests to allow a request to the new window. | 1478 if (!using_browser_compositor_) |
1467 uint32_t outstanding_vsync_requests = outstanding_vsync_requests_; | 1479 SetBeginFrameSource(view_.GetWindowAndroid()->GetBeginFrameSource()); |
1468 outstanding_vsync_requests_ = 0; | |
1469 RequestVSyncUpdate(outstanding_vsync_requests); | |
1470 | 1480 |
1471 ui::WindowAndroidCompositor* compositor = | 1481 ui::WindowAndroidCompositor* compositor = |
1472 view_.GetWindowAndroid()->GetCompositor(); | 1482 view_.GetWindowAndroid()->GetCompositor(); |
1473 if (compositor) { | 1483 if (compositor) { |
1474 delegated_frame_host_->RegisterFrameSinkHierarchy( | 1484 delegated_frame_host_->RegisterFrameSinkHierarchy( |
1475 compositor->GetFrameSinkId()); | 1485 compositor->GetFrameSinkId()); |
1476 } | 1486 } |
1477 } | 1487 } |
1478 | 1488 |
1479 void RenderWidgetHostViewAndroid::StopObservingRootWindow() { | 1489 void RenderWidgetHostViewAndroid::StopObservingRootWindow() { |
1480 if (!(view_.GetWindowAndroid())) { | 1490 if (!(view_.GetWindowAndroid())) { |
1481 DCHECK(!observing_root_window_); | 1491 DCHECK(!observing_root_window_); |
1482 return; | 1492 return; |
1483 } | 1493 } |
1484 | 1494 |
1485 if (!observing_root_window_) | 1495 if (!observing_root_window_) |
1486 return; | 1496 return; |
1487 | 1497 |
1488 // Reset window state variables to their defaults. | 1498 // Reset window state variables to their defaults. |
1489 is_window_activity_started_ = true; | 1499 is_window_activity_started_ = true; |
1490 is_window_visible_ = true; | 1500 is_window_visible_ = true; |
1491 observing_root_window_ = false; | 1501 observing_root_window_ = false; |
1492 if (host_) | 1502 if (host_) |
1493 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), true)); | 1503 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), true)); |
1494 view_.GetWindowAndroid()->RemoveObserver(this); | 1504 view_.GetWindowAndroid()->RemoveObserver(this); |
1505 if (!using_browser_compositor_) | |
1506 SetBeginFrameSource(nullptr); | |
1495 // If the DFH has already been destroyed, it will have cleaned itself up. | 1507 // If the DFH has already been destroyed, it will have cleaned itself up. |
1496 // This happens in some WebView cases. | 1508 // This happens in some WebView cases. |
1497 if (delegated_frame_host_) | 1509 if (delegated_frame_host_) |
1498 delegated_frame_host_->UnregisterFrameSinkHierarchy(); | 1510 delegated_frame_host_->UnregisterFrameSinkHierarchy(); |
1511 DCHECK(!begin_frame_source_); | |
1499 } | 1512 } |
1500 | 1513 |
1501 void RenderWidgetHostViewAndroid::SendBeginFrame(base::TimeTicks frame_time, | 1514 void RenderWidgetHostViewAndroid::SendBeginFrame(cc::BeginFrameArgs args) { |
1502 base::TimeDelta vsync_period) { | |
1503 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SendBeginFrame", | 1515 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SendBeginFrame", |
1504 "frame_time_us", frame_time.ToInternalValue()); | 1516 "frame_time_us", args.frame_time.ToInternalValue()); |
1505 | 1517 |
1506 // Synchronous compositor does not use deadline-based scheduling. | 1518 // Synchronous compositor does not use deadline-based scheduling. |
1507 // TODO(brianderson): Replace this hardcoded deadline after Android | 1519 // TODO(brianderson): Replace this hardcoded deadline after Android |
1508 // switches to Surfaces and the Browser's commit isn't in the critcal path. | 1520 // switches to Surfaces and the Browser's commit isn't in the critical path. |
1509 base::TimeTicks deadline = | 1521 args.deadline = sync_compositor_ ? base::TimeTicks() |
1510 sync_compositor_ ? base::TimeTicks() : frame_time + (vsync_period * 0.6); | 1522 : args.frame_time + (args.interval * 0.6); |
1511 host_->Send(new ViewMsg_BeginFrame( | 1523 host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args)); |
1512 host_->GetRoutingID(), | |
1513 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, | |
1514 vsync_period, cc::BeginFrameArgs::NORMAL))); | |
1515 if (sync_compositor_) | 1524 if (sync_compositor_) |
1516 sync_compositor_->DidSendBeginFrame(view_.GetWindowAndroid()); | 1525 sync_compositor_->DidSendBeginFrame(view_.GetWindowAndroid()); |
1517 } | 1526 } |
1518 | 1527 |
1519 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { | 1528 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { |
1520 bool needs_animate = false; | 1529 bool needs_animate = false; |
1521 if (overscroll_controller_ && is_showing_overscroll_glow_) { | 1530 if (overscroll_controller_ && is_showing_overscroll_glow_) { |
1522 needs_animate |= overscroll_controller_->Animate( | 1531 needs_animate |= overscroll_controller_->Animate( |
1523 frame_time, content_view_core_->GetViewAndroid()->GetLayer()); | 1532 frame_time, content_view_core_->GetViewAndroid()->GetLayer()); |
1524 } | 1533 } |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1618 if (shim && gpu_data && | 1627 if (shim && gpu_data && |
1619 gpu_data->IsDriverBugWorkaroundActive(gpu::WAKE_UP_GPU_BEFORE_DRAWING)) | 1628 gpu_data->IsDriverBugWorkaroundActive(gpu::WAKE_UP_GPU_BEFORE_DRAWING)) |
1620 shim->Send(new GpuMsg_WakeUpGpu); | 1629 shim->Send(new GpuMsg_WakeUpGpu); |
1621 } | 1630 } |
1622 | 1631 |
1623 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; | 1632 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; |
1624 } | 1633 } |
1625 | 1634 |
1626 void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { | 1635 void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { |
1627 TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput"); | 1636 TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput"); |
1628 RequestVSyncUpdate(FLUSH_INPUT); | 1637 AddBeginFrameRequest(FLUSH_INPUT); |
1629 } | 1638 } |
1630 | 1639 |
1631 BrowserAccessibilityManager* | 1640 BrowserAccessibilityManager* |
1632 RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManager( | 1641 RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManager( |
1633 BrowserAccessibilityDelegate* delegate, bool for_root_frame) { | 1642 BrowserAccessibilityDelegate* delegate, bool for_root_frame) { |
1634 base::android::ScopedJavaLocalRef<jobject> content_view_core_obj; | 1643 base::android::ScopedJavaLocalRef<jobject> content_view_core_obj; |
1635 if (for_root_frame && host_ && content_view_core_) | 1644 if (for_root_frame && host_ && content_view_core_) |
1636 content_view_core_obj = content_view_core_->GetJavaObject(); | 1645 content_view_core_obj = content_view_core_->GetJavaObject(); |
1637 return new BrowserAccessibilityManagerAndroid( | 1646 return new BrowserAccessibilityManagerAndroid( |
1638 content_view_core_obj, | 1647 content_view_core_obj, |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1800 if (content_view_core_) | 1809 if (content_view_core_) |
1801 obj = content_view_core_->GetJavaObject(); | 1810 obj = content_view_core_->GetJavaObject(); |
1802 manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); | 1811 manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); |
1803 } | 1812 } |
1804 | 1813 |
1805 if (!content_view_core_) { | 1814 if (!content_view_core_) { |
1806 sync_compositor_.reset(); | 1815 sync_compositor_.reset(); |
1807 return; | 1816 return; |
1808 } | 1817 } |
1809 | 1818 |
1810 if (is_showing_) | 1819 if (is_showing_ && view_.GetWindowAndroid()) |
1811 StartObservingRootWindow(); | 1820 StartObservingRootWindow(); |
1812 | 1821 |
1813 if (resize) | 1822 if (resize) |
1814 WasResized(); | 1823 WasResized(); |
1815 | 1824 |
1816 if (!selection_controller_) | 1825 if (!selection_controller_) |
1817 selection_controller_ = CreateSelectionController(this, content_view_core_); | 1826 selection_controller_ = CreateSelectionController(this, content_view_core_); |
1818 | 1827 |
1819 if (content_view_core_) | 1828 if (content_view_core_) |
1820 CreateOverscrollControllerIfPossible(); | 1829 CreateOverscrollControllerIfPossible(); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1876 } | 1885 } |
1877 | 1886 |
1878 void RenderWidgetHostViewAndroid::OnDetachedFromWindow() { | 1887 void RenderWidgetHostViewAndroid::OnDetachedFromWindow() { |
1879 StopObservingRootWindow(); | 1888 StopObservingRootWindow(); |
1880 OnDetachCompositor(); | 1889 OnDetachCompositor(); |
1881 } | 1890 } |
1882 | 1891 |
1883 void RenderWidgetHostViewAndroid::OnAttachCompositor() { | 1892 void RenderWidgetHostViewAndroid::OnAttachCompositor() { |
1884 DCHECK(content_view_core_); | 1893 DCHECK(content_view_core_); |
1885 CreateOverscrollControllerIfPossible(); | 1894 CreateOverscrollControllerIfPossible(); |
1886 ui::WindowAndroidCompositor* compositor = | 1895 if (observing_root_window_) { |
1887 view_.GetWindowAndroid()->GetCompositor(); | 1896 ui::WindowAndroidCompositor* compositor = |
1888 delegated_frame_host_->RegisterFrameSinkHierarchy( | 1897 view_.GetWindowAndroid()->GetCompositor(); |
1889 compositor->GetFrameSinkId()); | 1898 delegated_frame_host_->RegisterFrameSinkHierarchy( |
1899 compositor->GetFrameSinkId()); | |
1900 } | |
1890 } | 1901 } |
1891 | 1902 |
1892 void RenderWidgetHostViewAndroid::OnDetachCompositor() { | 1903 void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
1893 DCHECK(content_view_core_); | 1904 DCHECK(content_view_core_); |
1894 DCHECK(using_browser_compositor_); | 1905 DCHECK(using_browser_compositor_); |
1895 RunAckCallbacks(); | 1906 RunAckCallbacks(); |
1896 overscroll_controller_.reset(); | 1907 overscroll_controller_.reset(); |
1897 delegated_frame_host_->UnregisterFrameSinkHierarchy(); | 1908 delegated_frame_host_->UnregisterFrameSinkHierarchy(); |
1898 } | 1909 } |
1899 | 1910 |
1900 void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time, | 1911 void RenderWidgetHostViewAndroid::OnBeginFrame(const cc::BeginFrameArgs& args) { |
1901 base::TimeDelta vsync_period) { | 1912 TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnBeginFrame"); |
1902 TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnVSync"); | |
1903 if (!host_) | 1913 if (!host_) |
1904 return; | 1914 return; |
1905 | 1915 |
1906 if (outstanding_vsync_requests_ & FLUSH_INPUT) { | 1916 // In sync mode, we disregard missed frame args to ensure that |
1907 outstanding_vsync_requests_ &= ~FLUSH_INPUT; | 1917 // SynchronousCompositorBrowserFilter::SyncStateAfterVSync will be called |
1918 // during WindowAndroid::WindowBeginFrameSource::OnVSync() observer iteration. | |
1919 if (sync_compositor_ && args.type == cc::BeginFrameArgs::MISSED) | |
1920 return; | |
1921 | |
1922 // crbug.com/675289: Update |last_begin_frame_args_| before handling | |
1923 // |outstanding_begin_frame_requests_| to prevent the BeginFrameSource from | |
1924 // sending the same MISSED args in an infinite loop. This may otherwise happen | |
1925 // if |host_->FlushInput()| causes a synchronous OnSetNeedsFlushInput(), which | |
1926 // can lead to |begin_frame_source_->AddObserver()| and OnBeginFrame(). | |
boliu
2016/12/20 16:13:50
how does moving last_begin_frame_args_ up fix this
Eric Seckler
2016/12/20 16:35:07
It prevents the BeginFrameSource from sending us t
boliu
2016/12/20 16:56:09
oh, then do say that in the comment, that updating
| |
1927 last_begin_frame_args_ = args; | |
1928 | |
1929 if (outstanding_begin_frame_requests_ & FLUSH_INPUT) { | |
1930 ClearBeginFrameRequest(FLUSH_INPUT); | |
1908 host_->FlushInput(); | 1931 host_->FlushInput(); |
1909 } | 1932 } |
1910 | 1933 |
1911 if (outstanding_vsync_requests_ & BEGIN_FRAME || | 1934 if ((outstanding_begin_frame_requests_ & BEGIN_FRAME) || |
1912 outstanding_vsync_requests_ & PERSISTENT_BEGIN_FRAME) { | 1935 (outstanding_begin_frame_requests_ & PERSISTENT_BEGIN_FRAME)) { |
1913 outstanding_vsync_requests_ &= ~BEGIN_FRAME; | 1936 ClearBeginFrameRequest(BEGIN_FRAME); |
1914 SendBeginFrame(frame_time, vsync_period); | 1937 SendBeginFrame(args); |
1915 } | 1938 } |
1939 } | |
1916 | 1940 |
1917 // This allows for SendBeginFrame and FlushInput to modify | 1941 const cc::BeginFrameArgs& RenderWidgetHostViewAndroid::LastUsedBeginFrameArgs() |
1918 // outstanding_vsync_requests. | 1942 const { |
1919 uint32_t outstanding_vsync_requests = outstanding_vsync_requests_; | 1943 return last_begin_frame_args_; |
1920 outstanding_vsync_requests_ = 0; | 1944 } |
1921 RequestVSyncUpdate(outstanding_vsync_requests); | 1945 |
1946 void RenderWidgetHostViewAndroid::OnBeginFrameSourcePausedChanged(bool paused) { | |
1947 // The BeginFrameSources we listen to don't use this. For WebView, we signal | |
1948 // the "paused" state to the RenderWidget when our window attaches/detaches, | |
1949 // see |StartObservingRootWindow()| and |StopObservingRootWindow()|. | |
1950 DCHECK(!paused); | |
1922 } | 1951 } |
1923 | 1952 |
1924 void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) { | 1953 void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) { |
1925 if (Animate(begin_frame_time)) | 1954 if (Animate(begin_frame_time)) |
1926 SetNeedsAnimate(); | 1955 SetNeedsAnimate(); |
1927 } | 1956 } |
1928 | 1957 |
1929 void RenderWidgetHostViewAndroid::OnActivityStopped() { | 1958 void RenderWidgetHostViewAndroid::OnActivityStopped() { |
1930 TRACE_EVENT0("browser", "RenderWidgetHostViewAndroid::OnActivityStopped"); | 1959 TRACE_EVENT0("browser", "RenderWidgetHostViewAndroid::OnActivityStopped"); |
1931 DCHECK(observing_root_window_); | 1960 DCHECK(observing_root_window_); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2033 if (!compositor) | 2062 if (!compositor) |
2034 return; | 2063 return; |
2035 | 2064 |
2036 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( | 2065 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( |
2037 overscroll_refresh_handler, compositor, | 2066 overscroll_refresh_handler, compositor, |
2038 ui::GetScaleFactorForNativeView(GetNativeView())); | 2067 ui::GetScaleFactorForNativeView(GetNativeView())); |
2039 is_showing_overscroll_glow_ = true; | 2068 is_showing_overscroll_glow_ = true; |
2040 } | 2069 } |
2041 | 2070 |
2042 } // namespace content | 2071 } // namespace content |
OLD | NEW |