Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(653)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 2564403002: [android] Make RWHVAndroid a BeginFrameObserver. (Closed)
Patch Set: fix crbug.com/675289 Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | ui/android/DEPS » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | ui/android/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698