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 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |