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

Unified Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 2810813004: Hide fullscreen rotation jank (Closed)
Patch Set: Refactor jank logic. Make RWHVA a WebContentsObserver to observe fullscreen state Created 3 years, 6 months 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_widget_host_view_android.cc
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index b9898a869d9c3e42e0e206cce3d8230a93d8aee9..abfc895af972fb5d73236415ff73899b636922c4 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -562,6 +562,21 @@ void RenderWidgetHostViewAndroid::WasResized() {
host_->WasResized();
}
+void RenderWidgetHostViewAndroid::DidToggleFullscreenModeForTab(
+ bool entered_fullscreen,
+ bool will_cause_resize) {
+ if (!fullscreen_transitioning_) {
+ fullscreen_transitioning_ = true;
Khushal 2017/06/07 05:36:01 The reason why I suggested the enum was so its eas
liberato (no reviews please) 2017/06/13 22:06:42 +1. it took me several reads to notice that |fulls
steimel 2017/06/13 23:15:44 Done.
+ // TODO(steimel): Do we always want to await a resize? Danger of getting
+ // stuck with a black screen if we await one that's not going to occur.
+ // However, even when |will_cause_resize| == false, I still see a resize
+ // occurring, which means that even if there are cases in which we don't
+ // want to await a resize, we won't be able to tell from that parameter.
+ awaiting_resize_ = true;
+ }
+ HideFullscreenTransitionJank();
+}
+
void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) {
// Ignore the given size as only the Java code has the power to
// resize the view on Android.
@@ -1181,6 +1196,35 @@ void RenderWidgetHostViewAndroid::DidCreateNewRendererCompositorFrameSink(
surface_returned_resources_.clear();
}
+bool RenderWidgetHostViewAndroid::HasFullscreenTransitionJank(
+ const cc::CompositorFrame& frame) const {
+ // We only check for fullscreen jank during a fullscreen transition.
+ if (fullscreen_transitioning_) {
liberato (no reviews please) 2017/06/13 22:06:42 if (!fullscreen_transitioning_) return false; o
steimel 2017/06/13 23:15:44 This has been completely refactored now :)
+ gfx::Size frame_size = frame.render_pass_list.back()->output_rect.size();
+ bool mismatched_layer_sizes = view_.GetPhysicalBackingSize() != frame_size;
+
+ bool mismatched_fullscreen_states =
+ content_view_core_ &&
+ (content_view_core_->GetWebContents()->IsFullscreen() !=
+ frame.metadata.is_fullscreen);
+
+ return mismatched_fullscreen_states || mismatched_layer_sizes ||
+ awaiting_resize_;
Khushal 2017/06/07 05:36:01 When do we hit this case? Where layer sizes and fu
steimel 2017/06/13 23:15:44 Discussed offline
+ }
+
+ return false;
+}
+
+void RenderWidgetHostViewAndroid::HideFullscreenTransitionJank() {
+ EvictDelegatedFrame();
+ UpdateBackgroundColor(SK_ColorBLACK);
+}
+
+void RenderWidgetHostViewAndroid::EndFullscreenTransition() {
+ fullscreen_transitioning_ = false;
+ awaiting_resize_ = false;
+}
+
void RenderWidgetHostViewAndroid::SubmitCompositorFrame(
const cc::LocalSurfaceId& local_surface_id,
cc::CompositorFrame frame) {
@@ -1189,6 +1233,8 @@ void RenderWidgetHostViewAndroid::SubmitCompositorFrame(
return;
}
+ bool has_jank = HasFullscreenTransitionJank(frame);
+
last_scroll_offset_ = frame.metadata.root_scroll_offset;
DCHECK(!frame.render_pass_list.empty());
@@ -1225,6 +1271,12 @@ void RenderWidgetHostViewAndroid::SubmitCompositorFrame(
// As the metadata update may trigger view invalidation, always call it after
// any potential compositor scheduling.
OnFrameMetadataUpdated(std::move(metadata), is_transparent);
+
+ if (has_jank) {
+ HideFullscreenTransitionJank();
+ } else if (fullscreen_transitioning_) {
+ EndFullscreenTransition();
+ }
}
void RenderWidgetHostViewAndroid::DestroyDelegatedContent() {
@@ -1240,6 +1292,7 @@ void RenderWidgetHostViewAndroid::DestroyDelegatedContent() {
frame_evictor_->DiscardedFrame();
delegated_frame_host_->DestroyDelegatedContent();
+ current_surface_size_.SetSize(0, 0);
}
void RenderWidgetHostViewAndroid::OnDidNotProduceFrame(
@@ -1938,9 +1991,13 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
}
if (content_view_core) {
content_view_core->AddObserver(this);
+ content::WebContentsObserver::Observe(
+ content_view_core->GetWebContents());
ui::ViewAndroid* parent_view = content_view_core->GetViewAndroid();
parent_view->AddChild(&view_);
parent_view->GetLayer()->AddChild(view_.GetLayer());
+ } else {
+ content::WebContentsObserver::Observe(NULL);
}
content_view_core_ = content_view_core;
}
@@ -2021,6 +2078,16 @@ void RenderWidgetHostViewAndroid::OnGestureEvent(
}
void RenderWidgetHostViewAndroid::OnPhysicalBackingSizeChanged() {
+ // If we're entering a fullscreen transition, show black until the transition
+ // is completed.
+ if (content_view_core_) {
+ bool is_fullscreen = content_view_core_->GetWebContents()->IsFullscreen();
Khushal 2017/06/07 05:36:01 Shouldn't be able to include WebContents here but
steimel 2017/06/13 23:15:44 Refactored to store what we get when WebContents t
+ if (is_fullscreen || fullscreen_transitioning_) {
+ fullscreen_transitioning_ = true;
+ awaiting_resize_ = false;
+ HideFullscreenTransitionJank();
+ }
+ }
WasResized();
}

Powered by Google App Engine
This is Rietveld 408576698