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 "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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |