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

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

Issue 1103213003: [Android] Avoid using ContentViewCore when detaching from RWHVAndroid (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Proper build Created 5 years, 7 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 "base/android/build_info.h" 9 #include "base/android/build_info.h"
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 } 345 }
346 } 346 }
347 } 347 }
348 348
349 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( 349 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
350 RenderWidgetHostImpl* widget_host, 350 RenderWidgetHostImpl* widget_host,
351 ContentViewCoreImpl* content_view_core) 351 ContentViewCoreImpl* content_view_core)
352 : host_(widget_host), 352 : host_(widget_host),
353 outstanding_vsync_requests_(0), 353 outstanding_vsync_requests_(0),
354 is_showing_(!widget_host->is_hidden()), 354 is_showing_(!widget_host->is_hidden()),
355 content_view_core_(NULL), 355 content_view_core_(nullptr),
356 content_view_core_window_android_(nullptr),
356 ime_adapter_android_(this), 357 ime_adapter_android_(this),
357 cached_background_color_(SK_ColorWHITE), 358 cached_background_color_(SK_ColorWHITE),
358 last_output_surface_id_(kUndefinedOutputSurfaceId), 359 last_output_surface_id_(kUndefinedOutputSurfaceId),
359 gesture_provider_(CreateGestureProviderConfig(), this), 360 gesture_provider_(CreateGestureProviderConfig(), this),
360 stylus_text_selector_(this), 361 stylus_text_selector_(this),
361 accelerated_surface_route_id_(0), 362 accelerated_surface_route_id_(0),
362 using_browser_compositor_(CompositorImpl::IsInitialized()), 363 using_browser_compositor_(CompositorImpl::IsInitialized()),
363 frame_evictor_(new DelegatedFrameEvictor(this)), 364 frame_evictor_(new DelegatedFrameEvictor(this)),
364 locks_on_frame_count_(0), 365 locks_on_frame_count_(0),
365 observing_root_window_(false), 366 observing_root_window_(false),
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
939 if (!using_browser_compositor_) { 940 if (!using_browser_compositor_) {
940 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, 941 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback,
941 color_type); 942 color_type);
942 UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", 943 UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous",
943 base::TimeTicks::Now() - start_time); 944 base::TimeTicks::Now() - start_time);
944 return; 945 return;
945 } 946 }
946 947
947 scoped_ptr<cc::CopyOutputRequest> request; 948 scoped_ptr<cc::CopyOutputRequest> request;
948 scoped_refptr<cc::Layer> readback_layer; 949 scoped_refptr<cc::Layer> readback_layer;
949 DCHECK(content_view_core_); 950 DCHECK(content_view_core_window_android_);
950 DCHECK(content_view_core_->GetWindowAndroid());
951 ui::WindowAndroidCompositor* compositor = 951 ui::WindowAndroidCompositor* compositor =
952 content_view_core_->GetWindowAndroid()->GetCompositor(); 952 content_view_core_window_android_->GetCompositor();
953 DCHECK(compositor); 953 DCHECK(compositor);
954 DCHECK(frame_provider_.get() || !surface_id_.is_null()); 954 DCHECK(frame_provider_.get() || !surface_id_.is_null());
955 scoped_refptr<cc::Layer> layer = CreateDelegatedLayer(); 955 scoped_refptr<cc::Layer> layer = CreateDelegatedLayer();
956 DCHECK(layer); 956 DCHECK(layer);
957 layer->SetHideLayerAndSubtree(true); 957 layer->SetHideLayerAndSubtree(true);
958 compositor->AttachLayerForReadback(layer); 958 compositor->AttachLayerForReadback(layer);
959 959
960 readback_layer = layer; 960 readback_layer = layer;
961 request = cc::CopyOutputRequest::CreateRequest( 961 request = cc::CopyOutputRequest::CreateRequest(
962 base::Bind(&RenderWidgetHostViewAndroid:: 962 base::Bind(&RenderWidgetHostViewAndroid::
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
1264 layer_->SetContentsOpaque(!enabled); 1264 layer_->SetContentsOpaque(!enabled);
1265 } 1265 }
1266 1266
1267 bool RenderWidgetHostViewAndroid::SupportsAnimation() const { 1267 bool RenderWidgetHostViewAndroid::SupportsAnimation() const {
1268 // The synchronous (WebView) compositor does not have a proper browser 1268 // The synchronous (WebView) compositor does not have a proper browser
1269 // compositor with which to drive animations. 1269 // compositor with which to drive animations.
1270 return using_browser_compositor_; 1270 return using_browser_compositor_;
1271 } 1271 }
1272 1272
1273 void RenderWidgetHostViewAndroid::SetNeedsAnimate() { 1273 void RenderWidgetHostViewAndroid::SetNeedsAnimate() {
1274 DCHECK(content_view_core_); 1274 DCHECK(content_view_core_window_android_);
1275 DCHECK(using_browser_compositor_); 1275 DCHECK(using_browser_compositor_);
1276 content_view_core_->GetWindowAndroid()->SetNeedsAnimate(); 1276 content_view_core_window_android_->SetNeedsAnimate();
1277 } 1277 }
1278 1278
1279 void RenderWidgetHostViewAndroid::MoveCaret(const gfx::PointF& position) { 1279 void RenderWidgetHostViewAndroid::MoveCaret(const gfx::PointF& position) {
1280 MoveCaret(gfx::Point(position.x(), position.y())); 1280 MoveCaret(gfx::Point(position.x(), position.y()));
1281 } 1281 }
1282 1282
1283 void RenderWidgetHostViewAndroid::MoveRangeSelectionExtent( 1283 void RenderWidgetHostViewAndroid::MoveRangeSelectionExtent(
1284 const gfx::PointF& extent) { 1284 const gfx::PointF& extent) {
1285 DCHECK(content_view_core_); 1285 DCHECK(content_view_core_);
1286 content_view_core_->MoveRangeSelectionExtent(extent); 1286 content_view_core_->MoveRangeSelectionExtent(extent);
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1423 layer_->SetHideLayerAndSubtree(!is_showing_); 1423 layer_->SetHideLayerAndSubtree(!is_showing_);
1424 } 1424 }
1425 1425
1426 void RenderWidgetHostViewAndroid::RemoveLayers() { 1426 void RenderWidgetHostViewAndroid::RemoveLayers() {
1427 if (!content_view_core_) 1427 if (!content_view_core_)
1428 return; 1428 return;
1429 1429
1430 if (!layer_.get()) 1430 if (!layer_.get())
1431 return; 1431 return;
1432 1432
1433 content_view_core_->RemoveLayer(layer_); 1433 layer_->RemoveFromParent();
1434 if (overscroll_controller_) 1434 if (overscroll_controller_)
1435 overscroll_controller_->Disable(); 1435 overscroll_controller_->Disable();
1436 } 1436 }
1437 1437
1438 void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32 requests) { 1438 void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32 requests) {
1439 bool should_request_vsync = !outstanding_vsync_requests_ && requests; 1439 bool should_request_vsync = !outstanding_vsync_requests_ && requests;
1440 outstanding_vsync_requests_ |= requests; 1440 outstanding_vsync_requests_ |= requests;
1441 // Note that if we're not currently observing the root window, outstanding 1441 // Note that if we're not currently observing the root window, outstanding
1442 // vsync requests will be pushed if/when we resume observing in 1442 // vsync requests will be pushed if/when we resume observing in
1443 // |StartObservingRootWindow()|. 1443 // |StartObservingRootWindow()|.
1444 if (observing_root_window_ && should_request_vsync) 1444 if (observing_root_window_ && should_request_vsync)
1445 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); 1445 content_view_core_window_android_->RequestVSyncUpdate();
1446 } 1446 }
1447 1447
1448 void RenderWidgetHostViewAndroid::StartObservingRootWindow() { 1448 void RenderWidgetHostViewAndroid::StartObservingRootWindow() {
1449 DCHECK(content_view_core_); 1449 DCHECK(content_view_core_window_android_);
1450 if (observing_root_window_) 1450 if (observing_root_window_)
1451 return; 1451 return;
1452 1452
1453 observing_root_window_ = true; 1453 observing_root_window_ = true;
1454 content_view_core_->GetWindowAndroid()->AddObserver(this); 1454 content_view_core_window_android_->AddObserver(this);
1455 1455
1456 // Clear existing vsync requests to allow a request to the new window. 1456 // Clear existing vsync requests to allow a request to the new window.
1457 uint32 outstanding_vsync_requests = outstanding_vsync_requests_; 1457 uint32 outstanding_vsync_requests = outstanding_vsync_requests_;
1458 outstanding_vsync_requests_ = 0; 1458 outstanding_vsync_requests_ = 0;
1459 RequestVSyncUpdate(outstanding_vsync_requests); 1459 RequestVSyncUpdate(outstanding_vsync_requests);
1460 } 1460 }
1461 1461
1462 void RenderWidgetHostViewAndroid::StopObservingRootWindow() { 1462 void RenderWidgetHostViewAndroid::StopObservingRootWindow() {
1463 if (!content_view_core_) { 1463 if (!content_view_core_window_android_) {
1464 DCHECK(!observing_root_window_); 1464 DCHECK(!observing_root_window_);
1465 return; 1465 return;
1466 } 1466 }
1467 1467
1468 if (!observing_root_window_) 1468 if (!observing_root_window_)
1469 return; 1469 return;
1470 1470
1471 observing_root_window_ = false; 1471 observing_root_window_ = false;
1472 content_view_core_->GetWindowAndroid()->RemoveObserver(this); 1472 content_view_core_window_android_->RemoveObserver(this);
1473 } 1473 }
1474 1474
1475 void RenderWidgetHostViewAndroid::SendBeginFrame(base::TimeTicks frame_time, 1475 void RenderWidgetHostViewAndroid::SendBeginFrame(base::TimeTicks frame_time,
1476 base::TimeDelta vsync_period) { 1476 base::TimeDelta vsync_period) {
1477 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SendBeginFrame", 1477 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SendBeginFrame",
1478 "frame_time_us", frame_time.ToInternalValue()); 1478 "frame_time_us", frame_time.ToInternalValue());
1479 1479
1480 if (using_browser_compositor_) { 1480 if (using_browser_compositor_) {
1481 base::TimeTicks display_time = frame_time + vsync_period; 1481 base::TimeTicks display_time = frame_time + vsync_period;
1482 1482
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
1737 1737
1738 bool resize = false; 1738 bool resize = false;
1739 if (content_view_core != content_view_core_) { 1739 if (content_view_core != content_view_core_) {
1740 overscroll_controller_.reset(); 1740 overscroll_controller_.reset();
1741 selection_controller_.reset(); 1741 selection_controller_.reset();
1742 ReleaseLocksOnSurface(); 1742 ReleaseLocksOnSurface();
1743 resize = true; 1743 resize = true;
1744 } 1744 }
1745 1745
1746 content_view_core_ = content_view_core; 1746 content_view_core_ = content_view_core;
1747 content_view_core_window_android_ =
1748 content_view_core_ ? content_view_core_->GetWindowAndroid() : nullptr;
1749 DCHECK_EQ(!!content_view_core_, !!content_view_core_window_android_);
1747 1750
1748 BrowserAccessibilityManager* manager = NULL; 1751 BrowserAccessibilityManager* manager = NULL;
1749 if (host_) 1752 if (host_)
1750 manager = host_->GetRootBrowserAccessibilityManager(); 1753 manager = host_->GetRootBrowserAccessibilityManager();
1751 if (manager) { 1754 if (manager) {
1752 base::android::ScopedJavaLocalRef<jobject> obj; 1755 base::android::ScopedJavaLocalRef<jobject> obj;
1753 if (content_view_core_) 1756 if (content_view_core_)
1754 obj = content_view_core_->GetJavaObject(); 1757 obj = content_view_core_->GetJavaObject();
1755 manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); 1758 manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj);
1756 } 1759 }
1757 1760
1758 AttachLayers(); 1761 AttachLayers();
1759 1762
1760 if (!content_view_core_) 1763 if (!content_view_core_)
1761 return; 1764 return;
1762 1765
1763 StartObservingRootWindow(); 1766 StartObservingRootWindow();
1764 1767
1765 if (resize) 1768 if (resize)
1766 WasResized(); 1769 WasResized();
1767 1770
1768 if (!selection_controller_) 1771 if (!selection_controller_)
1769 selection_controller_ = CreateSelectionController(this, content_view_core_); 1772 selection_controller_ = CreateSelectionController(this, content_view_core_);
1770 1773
1771 if (!overscroll_controller_ && 1774 if (!overscroll_controller_ &&
1772 content_view_core_->GetWindowAndroid()->GetCompositor()) { 1775 content_view_core_window_android_->GetCompositor()) {
1773 overscroll_controller_ = CreateOverscrollController(content_view_core_); 1776 overscroll_controller_ = CreateOverscrollController(content_view_core_);
1774 } 1777 }
1775 } 1778 }
1776 1779
1777 void RenderWidgetHostViewAndroid::RunAckCallbacks( 1780 void RenderWidgetHostViewAndroid::RunAckCallbacks(
1778 cc::SurfaceDrawStatus status) { 1781 cc::SurfaceDrawStatus status) {
1779 while (!ack_callbacks_.empty()) { 1782 while (!ack_callbacks_.empty()) {
1780 ack_callbacks_.front().Run(); 1783 ack_callbacks_.front().Run();
1781 ack_callbacks_.pop(); 1784 ack_callbacks_.pop();
1782 } 1785 }
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1968 results->orientationAngle = display.RotationAsDegree(); 1971 results->orientationAngle = display.RotationAsDegree();
1969 results->orientationType = 1972 results->orientationType =
1970 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); 1973 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display);
1971 gfx::DeviceDisplayInfo info; 1974 gfx::DeviceDisplayInfo info;
1972 results->depth = info.GetBitsPerPixel(); 1975 results->depth = info.GetBitsPerPixel();
1973 results->depthPerComponent = info.GetBitsPerComponent(); 1976 results->depthPerComponent = info.GetBitsPerComponent();
1974 results->isMonochrome = (results->depthPerComponent == 0); 1977 results->isMonochrome = (results->depthPerComponent == 0);
1975 } 1978 }
1976 1979
1977 } // namespace content 1980 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698