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

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

Issue 2810813004: Hide fullscreen rotation jank (Closed)
Patch Set: Clear thumbnail cache instead of hiding static layer. Break out results of changing fullscreen stat… 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 unified diff | Download patch
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 547 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 558
559 RenderWidgetHost* 559 RenderWidgetHost*
560 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { 560 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const {
561 return host_; 561 return host_;
562 } 562 }
563 563
564 void RenderWidgetHostViewAndroid::WasResized() { 564 void RenderWidgetHostViewAndroid::WasResized() {
565 host_->WasResized(); 565 host_->WasResized();
566 } 566 }
567 567
568 void RenderWidgetHostViewAndroid::OnFullscreenStateChanged(
569 bool entered_fullscreen) {
570 web_contents_is_fullscreen_ = entered_fullscreen;
571 UpdateFullscreenStateAndEvictFrameIfNeeded();
572 }
573
568 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { 574 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) {
569 // Ignore the given size as only the Java code has the power to 575 // Ignore the given size as only the Java code has the power to
570 // resize the view on Android. 576 // resize the view on Android.
571 default_bounds_ = gfx::Rect(default_bounds_.origin(), size); 577 default_bounds_ = gfx::Rect(default_bounds_.origin(), size);
572 } 578 }
573 579
574 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { 580 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) {
575 default_bounds_ = rect; 581 default_bounds_ = rect;
576 } 582 }
577 583
(...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after
1177 bad_message::RWH_BAD_FRAME_SINK_REQUEST); 1183 bad_message::RWH_BAD_FRAME_SINK_REQUEST);
1178 return; 1184 return;
1179 } 1185 }
1180 delegated_frame_host_->CompositorFrameSinkChanged(); 1186 delegated_frame_host_->CompositorFrameSinkChanged();
1181 renderer_compositor_frame_sink_ = renderer_compositor_frame_sink; 1187 renderer_compositor_frame_sink_ = renderer_compositor_frame_sink;
1182 // Accumulated resources belong to the old RendererCompositorFrameSink and 1188 // Accumulated resources belong to the old RendererCompositorFrameSink and
1183 // should not be returned. 1189 // should not be returned.
1184 surface_returned_resources_.clear(); 1190 surface_returned_resources_.clear();
1185 } 1191 }
1186 1192
1193 void RenderWidgetHostViewAndroid::UpdateFullscreenStateAndEvictFrameIfNeeded() {
1194 UpdateFullscreenState();
1195 if (IsInFullscreenTransition()) {
1196 // When we're in a fullscreen transition, we don't want to show a frame
1197 // since it will look janky, so instead we show black.
1198 EvictDelegatedFrame();
1199 UpdateBackgroundColor(SK_ColorBLACK);
1200 ClearThumbnailPlaceholder();
1201 }
1202 }
1203
1204 void RenderWidgetHostViewAndroid::UpdateFullscreenState() {
1205 bool mismatched_fullscreen_states =
1206 web_contents_is_fullscreen_ != current_frame_is_fullscreen_;
1207 bool mismatched_sizes =
1208 view_.GetPhysicalBackingSize() != current_surface_size_;
1209
1210 switch (fullscreen_state_) {
1211 // From kNotFullscreen, we transition to kEnteringFullscreen whenever the
1212 // fullscreen state changes.
1213 case FullscreenState::kNotFullscreen:
1214 if (mismatched_fullscreen_states) {
1215 DCHECK(web_contents_is_fullscreen_);
1216 fullscreen_state_ = FullscreenState::kEnteringFullscreen;
1217 fullscreen_transition_awaiting_resize_ = true;
1218 }
1219 break;
1220 // From kFullscreen, we transition to kExitingFullscreen on a fullscreen
1221 // state change, or to kFullscreenRotation if we get a new size.
1222 case FullscreenState::kFullscreen:
1223 if (mismatched_fullscreen_states) {
1224 DCHECK(!web_contents_is_fullscreen_);
1225 fullscreen_state_ = FullscreenState::kExitingFullscreen;
1226 fullscreen_transition_awaiting_resize_ = true;
1227 } else if (mismatched_sizes) {
1228 fullscreen_state_ = FullscreenState::kFullscreenRotation;
1229 }
1230 break;
1231 // From any transition state, once we receive a "good" frame we transition
1232 // to the proper "good" state.
1233 case FullscreenState::kExitingFullscreen:
1234 case FullscreenState::kEnteringFullscreen:
1235 case FullscreenState::kFullscreenRotation:
1236 if (!mismatched_fullscreen_states && !mismatched_sizes &&
1237 !fullscreen_transition_awaiting_resize_) {
1238 fullscreen_state_ = web_contents_is_fullscreen_
1239 ? FullscreenState::kFullscreen
1240 : FullscreenState::kNotFullscreen;
1241 }
1242 break;
1243 }
1244 }
1245
1246 bool RenderWidgetHostViewAndroid::IsInFullscreenTransition() const {
1247 return (fullscreen_state_ == FullscreenState::kEnteringFullscreen ||
1248 fullscreen_state_ == FullscreenState::kExitingFullscreen ||
1249 fullscreen_state_ == FullscreenState::kFullscreenRotation);
1250 }
1251
1187 void RenderWidgetHostViewAndroid::SubmitCompositorFrame( 1252 void RenderWidgetHostViewAndroid::SubmitCompositorFrame(
1188 const cc::LocalSurfaceId& local_surface_id, 1253 const cc::LocalSurfaceId& local_surface_id,
1189 cc::CompositorFrame frame) { 1254 cc::CompositorFrame frame) {
1190 if (!delegated_frame_host_) { 1255 if (!delegated_frame_host_) {
1191 DCHECK(!using_browser_compositor_); 1256 DCHECK(!using_browser_compositor_);
1192 return; 1257 return;
1193 } 1258 }
1194 1259
1195 last_scroll_offset_ = frame.metadata.root_scroll_offset; 1260 last_scroll_offset_ = frame.metadata.root_scroll_offset;
1196 DCHECK(!frame.render_pass_list.empty()); 1261 DCHECK(!frame.render_pass_list.empty());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1236 frame_evictor_->HasFrame()); 1301 frame_evictor_->HasFrame());
1237 1302
1238 if (!delegated_frame_host_) 1303 if (!delegated_frame_host_)
1239 return; 1304 return;
1240 1305
1241 if (!delegated_frame_host_->HasDelegatedContent()) 1306 if (!delegated_frame_host_->HasDelegatedContent())
1242 return; 1307 return;
1243 1308
1244 frame_evictor_->DiscardedFrame(); 1309 frame_evictor_->DiscardedFrame();
1245 delegated_frame_host_->DestroyDelegatedContent(); 1310 delegated_frame_host_->DestroyDelegatedContent();
1311 current_surface_size_.SetSize(0, 0);
1246 } 1312 }
1247 1313
1248 void RenderWidgetHostViewAndroid::OnDidNotProduceFrame( 1314 void RenderWidgetHostViewAndroid::OnDidNotProduceFrame(
1249 const cc::BeginFrameAck& ack) { 1315 const cc::BeginFrameAck& ack) {
1250 if (!delegated_frame_host_) { 1316 if (!delegated_frame_host_) {
1251 // We are not using the browser compositor and there's no DisplayScheduler 1317 // We are not using the browser compositor and there's no DisplayScheduler
1252 // that needs to be notified about the BeginFrameAck, so we can drop it. 1318 // that needs to be notified about the BeginFrameAck, so we can drop it.
1253 DCHECK(!using_browser_compositor_); 1319 DCHECK(!using_browser_compositor_);
1254 return; 1320 return;
1255 } 1321 }
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
1448 1514
1449 // Set parameters for adaptive handle orientation. 1515 // Set parameters for adaptive handle orientation.
1450 gfx::SizeF viewport_size(frame_metadata.scrollable_viewport_size); 1516 gfx::SizeF viewport_size(frame_metadata.scrollable_viewport_size);
1451 viewport_size.Scale(frame_metadata.page_scale_factor); 1517 viewport_size.Scale(frame_metadata.page_scale_factor);
1452 gfx::RectF viewport_rect(0.0f, frame_metadata.top_controls_height * 1518 gfx::RectF viewport_rect(0.0f, frame_metadata.top_controls_height *
1453 frame_metadata.top_controls_shown_ratio, 1519 frame_metadata.top_controls_shown_ratio,
1454 viewport_size.width(), viewport_size.height()); 1520 viewport_size.width(), viewport_size.height());
1455 touch_selection_controller_->OnViewportChanged(viewport_rect); 1521 touch_selection_controller_->OnViewportChanged(viewport_rect);
1456 } 1522 }
1457 1523
1524 current_frame_is_fullscreen_ = frame_metadata.is_fullscreen;
1458 UpdateBackgroundColor(is_transparent ? SK_ColorTRANSPARENT 1525 UpdateBackgroundColor(is_transparent ? SK_ColorTRANSPARENT
1459 : frame_metadata.root_background_color); 1526 : frame_metadata.root_background_color);
1460 1527
1461 view_.set_content_offset(gfx::Vector2dF(0.0f, 1528 view_.set_content_offset(gfx::Vector2dF(0.0f,
1462 frame_metadata.top_controls_height * 1529 frame_metadata.top_controls_height *
1463 frame_metadata.top_controls_shown_ratio)); 1530 frame_metadata.top_controls_shown_ratio));
1464 1531
1465 bool top_changed = !FloatEquals(top_shown_pix, prev_top_shown_pix_); 1532 bool top_changed = !FloatEquals(top_shown_pix, prev_top_shown_pix_);
1466 if (top_changed) { 1533 if (top_changed) {
1467 float translate = top_shown_pix - top_controls_pix; 1534 float translate = top_shown_pix - top_controls_pix;
(...skipping 13 matching lines...) Expand all
1481 1548
1482 // All offsets and sizes are in CSS pixels. 1549 // All offsets and sizes are in CSS pixels.
1483 content_view_core_->UpdateFrameInfo( 1550 content_view_core_->UpdateFrameInfo(
1484 frame_metadata.root_scroll_offset, frame_metadata.page_scale_factor, 1551 frame_metadata.root_scroll_offset, frame_metadata.page_scale_factor,
1485 gfx::Vector2dF(frame_metadata.min_page_scale_factor, 1552 gfx::Vector2dF(frame_metadata.min_page_scale_factor,
1486 frame_metadata.max_page_scale_factor), 1553 frame_metadata.max_page_scale_factor),
1487 frame_metadata.root_layer_size, frame_metadata.scrollable_viewport_size, 1554 frame_metadata.root_layer_size, frame_metadata.scrollable_viewport_size,
1488 frame_metadata.top_controls_height * 1555 frame_metadata.top_controls_height *
1489 frame_metadata.top_controls_shown_ratio, 1556 frame_metadata.top_controls_shown_ratio,
1490 top_shown_pix, top_changed, is_mobile_optimized); 1557 top_shown_pix, top_changed, is_mobile_optimized);
1558
1559 UpdateFullscreenStateAndEvictFrameIfNeeded();
1491 } 1560 }
1492 1561
1493 void RenderWidgetHostViewAndroid::ShowInternal() { 1562 void RenderWidgetHostViewAndroid::ShowInternal() {
1494 bool show = is_showing_ && is_window_activity_started_ && is_window_visible_; 1563 bool show = is_showing_ && is_window_activity_started_ && is_window_visible_;
1495 if (!show) 1564 if (!show)
1496 return; 1565 return;
1497 1566
1498 if (!host_ || !host_->is_hidden()) 1567 if (!host_ || !host_->is_hidden())
1499 return; 1568 return;
1500 1569
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after
1923 1992
1924 void RenderWidgetHostViewAndroid::SetTextHandlesTemporarilyHidden(bool hidden) { 1993 void RenderWidgetHostViewAndroid::SetTextHandlesTemporarilyHidden(bool hidden) {
1925 if (touch_selection_controller_) 1994 if (touch_selection_controller_)
1926 touch_selection_controller_->SetTemporarilyHidden(hidden); 1995 touch_selection_controller_->SetTemporarilyHidden(hidden);
1927 } 1996 }
1928 1997
1929 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { 1998 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const {
1930 return cached_background_color_; 1999 return cached_background_color_;
1931 } 2000 }
1932 2001
2002 void RenderWidgetHostViewAndroid::ClearThumbnailPlaceholder() {
2003 view_.ClearThumbnailPlaceholder();
2004 }
2005
1933 void RenderWidgetHostViewAndroid::SetIsInVR(bool is_in_vr) { 2006 void RenderWidgetHostViewAndroid::SetIsInVR(bool is_in_vr) {
1934 is_in_vr_ = is_in_vr; 2007 is_in_vr_ = is_in_vr;
1935 } 2008 }
1936 2009
1937 bool RenderWidgetHostViewAndroid::IsInVR() const { 2010 bool RenderWidgetHostViewAndroid::IsInVR() const {
1938 return is_in_vr_; 2011 return is_in_vr_;
1939 } 2012 }
1940 2013
1941 void RenderWidgetHostViewAndroid::DidOverscroll( 2014 void RenderWidgetHostViewAndroid::DidOverscroll(
1942 const ui::DidOverscrollParams& params) { 2015 const ui::DidOverscrollParams& params) {
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
2052 // unintended shift+click interpretation of all accessibility clicks. 2125 // unintended shift+click interpretation of all accessibility clicks.
2053 // See crbug.com/443247. 2126 // See crbug.com/443247.
2054 if (web_gesture.GetType() == blink::WebInputEvent::kGestureTap && 2127 if (web_gesture.GetType() == blink::WebInputEvent::kGestureTap &&
2055 web_gesture.GetModifiers() == blink::WebInputEvent::kShiftKey) { 2128 web_gesture.GetModifiers() == blink::WebInputEvent::kShiftKey) {
2056 web_gesture.SetModifiers(blink::WebInputEvent::kNoModifiers); 2129 web_gesture.SetModifiers(blink::WebInputEvent::kNoModifiers);
2057 } 2130 }
2058 SendGestureEvent(web_gesture); 2131 SendGestureEvent(web_gesture);
2059 } 2132 }
2060 2133
2061 void RenderWidgetHostViewAndroid::OnPhysicalBackingSizeChanged() { 2134 void RenderWidgetHostViewAndroid::OnPhysicalBackingSizeChanged() {
2135 fullscreen_transition_awaiting_resize_ = false;
2136 UpdateFullscreenStateAndEvictFrameIfNeeded();
2062 WasResized(); 2137 WasResized();
2063 } 2138 }
2064 2139
2065 void RenderWidgetHostViewAndroid::OnContentViewCoreDestroyed() { 2140 void RenderWidgetHostViewAndroid::OnContentViewCoreDestroyed() {
2066 SetContentViewCore(NULL); 2141 SetContentViewCore(NULL);
2067 overscroll_controller_.reset(); 2142 overscroll_controller_.reset();
2068 } 2143 }
2069 2144
2070 void RenderWidgetHostViewAndroid::OnRootWindowVisibilityChanged(bool visible) { 2145 void RenderWidgetHostViewAndroid::OnRootWindowVisibilityChanged(bool visible) {
2071 TRACE_EVENT1("browser", 2146 TRACE_EVENT1("browser",
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
2280 2355
2281 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); 2356 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor();
2282 if (!compositor) 2357 if (!compositor)
2283 return; 2358 return;
2284 2359
2285 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( 2360 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>(
2286 overscroll_refresh_handler, compositor, view_.GetDipScale()); 2361 overscroll_refresh_handler, compositor, view_.GetDipScale());
2287 } 2362 }
2288 2363
2289 } // namespace content 2364 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698