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 2cfc5a5fc38da6082136dbe889193d01dd6f3f48..da1328702c0ad73dcd810ea46a58b818e03242d6 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -48,6 +48,7 @@ |
#include "content/browser/gpu/gpu_process_host_ui_shim.h" |
#include "content/browser/media/android/media_web_contents_observer_android.h" |
#include "content/browser/renderer_host/compositor_impl_android.h" |
+#include "content/browser/renderer_host/delegated_frame_host_android.h" |
#include "content/browser/renderer_host/dip_util.h" |
#include "content/browser/renderer_host/frame_metadata_util.h" |
#include "content/browser/renderer_host/input/synthetic_gesture_target_android.h" |
@@ -95,24 +96,6 @@ namespace content { |
namespace { |
-void SatisfyCallback(cc::SurfaceManager* manager, |
- const cc::SurfaceSequence& sequence) { |
- std::vector<uint32_t> sequences; |
- sequences.push_back(sequence.sequence); |
- manager->DidSatisfySequences(sequence.client_id, &sequences); |
-} |
- |
-void RequireCallback(cc::SurfaceManager* manager, |
- const cc::SurfaceId& id, |
- const cc::SurfaceSequence& sequence) { |
- cc::Surface* surface = manager->GetSurfaceForId(id); |
- if (!surface) { |
- LOG(ERROR) << "Attempting to require callback on nonexistent surface"; |
- return; |
- } |
- surface->AddDestructionDependency(sequence); |
-} |
- |
const int kUndefinedOutputSurfaceId = -1; |
static const char kAsyncReadBackString[] = "Compositing.CopyFromSurfaceTime"; |
@@ -286,24 +269,6 @@ gfx::RectF GetSelectionRect(const ui::TouchSelectionController& controller) { |
return rect; |
} |
-scoped_refptr<cc::SurfaceLayer> CreateSurfaceLayer( |
- const cc::SurfaceId& surface_id, |
- const gfx::Size& size) { |
- DCHECK(!surface_id.is_null()); |
- cc::SurfaceManager* manager = CompositorImpl::GetSurfaceManager(); |
- DCHECK(manager); |
- // manager must outlive compositors using it. |
- scoped_refptr<cc::SurfaceLayer> surface_layer = cc::SurfaceLayer::Create( |
- base::Bind(&SatisfyCallback, base::Unretained(manager)), |
- base::Bind(&RequireCallback, base::Unretained(manager))); |
- surface_layer->SetSurfaceId(surface_id, 1.f, size); |
- surface_layer->SetBounds(size); |
- surface_layer->SetIsDrawable(true); |
- surface_layer->SetContentsOpaque(true); |
- |
- return surface_layer; |
-} |
- |
} // anonymous namespace |
RenderWidgetHostViewAndroid::LastFrameInfo::LastFrameInfo( |
@@ -345,10 +310,15 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
locks_on_frame_count_(0), |
observing_root_window_(false), |
weak_ptr_factory_(this) { |
- id_allocator_.reset( |
- new cc::SurfaceIdAllocator(CompositorImpl::AllocateSurfaceClientId())); |
- CompositorImpl::GetSurfaceManager()->RegisterSurfaceClientId( |
- id_allocator_->client_id()); |
+ // Set the layer which will hold the content layer for this view. The content |
+ // layer is managed by the DelegatedFrameHost. |
+ view_.SetLayer(cc::Layer::Create()); |
+ |
+ delegated_frame_host_.reset(new DelegatedFrameHostAndroid( |
+ &view_, cached_background_color_, |
+ base::Bind(&RenderWidgetHostViewAndroid::ReturnResources, |
+ weak_ptr_factory_.GetWeakPtr()))); |
+ |
host_->SetView(this); |
SetContentViewCore(content_view_core); |
} |
@@ -358,8 +328,7 @@ RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
content_view_core_->RemoveObserver(this); |
SetContentViewCore(NULL); |
DCHECK(ack_callbacks_.empty()); |
- DCHECK(!surface_factory_); |
- DCHECK(surface_id_.is_null()); |
+ DCHECK(!delegated_frame_host_); |
} |
void RenderWidgetHostViewAndroid::Blur() { |
@@ -413,6 +382,7 @@ RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { |
} |
void RenderWidgetHostViewAndroid::WasResized() { |
+ delegated_frame_host_->UpdateSize(GetViewSize()); |
host_->WasResized(); |
} |
@@ -435,7 +405,7 @@ void RenderWidgetHostViewAndroid::GetScaledContentBitmap( |
result_callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); |
return; |
} |
- gfx::Size bounds = view_.GetLayer()->bounds(); |
+ gfx::Size bounds = delegated_frame_host_->GetContentLayer()->bounds(); |
if (src_subrect.IsEmpty()) |
src_subrect = gfx::Rect(bounds); |
DCHECK_LE(src_subrect.width() + src_subrect.x(), bounds.width()); |
@@ -455,7 +425,7 @@ void RenderWidgetHostViewAndroid::GetScaledContentBitmap( |
bool RenderWidgetHostViewAndroid::HasValidFrame() const { |
if (!content_view_core_) |
return false; |
- if (!view_.GetLayer()) |
+ if (!delegated_frame_host_->GetContentLayer()) |
return false; |
if (texture_size_in_layer_.IsEmpty()) |
@@ -552,8 +522,8 @@ void RenderWidgetHostViewAndroid::UnlockCompositingSurface() { |
last_frame_info_.reset(); |
} |
- if (!is_showing_ && view_.GetLayer()) |
- view_.GetLayer()->SetHideLayerAndSubtree(true); |
+ if (!is_showing_ && delegated_frame_host_->GetContentLayer()) |
+ delegated_frame_host_->GetContentLayer()->SetHideLayerAndSubtree(true); |
} |
} |
@@ -581,14 +551,7 @@ void RenderWidgetHostViewAndroid::ReleaseLocksOnSurface() { |
} |
gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { |
- if (!content_view_core_) |
- return gfx::Rect(default_size_); |
- |
- if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableOSKOverscroll)) |
- return gfx::Rect(content_view_core_->GetViewSizeWithOSKHidden()); |
- |
- return gfx::Rect(content_view_core_->GetViewSize()); |
+ return gfx::Rect(GetViewSize()); |
} |
gfx::Size RenderWidgetHostViewAndroid::GetVisibleViewportSize() const { |
@@ -656,6 +619,7 @@ void RenderWidgetHostViewAndroid::UpdateBackgroundColor(SkColor color) { |
return; |
cached_background_color_ = color; |
+ delegated_frame_host_->UpdateBackgroundColor(color); |
if (content_view_core_) |
content_view_core_->OnBackgroundColorChanged(color); |
} |
@@ -788,17 +752,8 @@ void RenderWidgetHostViewAndroid::RenderProcessGone( |
void RenderWidgetHostViewAndroid::Destroy() { |
host_->ViewDestroyed(); |
- RemoveLayers(); |
SetContentViewCore(NULL); |
- |
- if (!surface_id_.is_null()) { |
- DCHECK(surface_factory_.get()); |
- surface_factory_->Destroy(surface_id_); |
- surface_id_ = cc::SurfaceId(); |
- } |
- surface_factory_.reset(); |
- CompositorImpl::GetSurfaceManager()->InvalidateSurfaceClientId( |
- id_allocator_->client_id()); |
+ delegated_frame_host_.reset(); |
// The RenderWidgetHost's destruction led here, so don't call it. |
host_ = NULL; |
@@ -884,7 +839,7 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
ui::WindowAndroidCompositor* compositor = |
content_view_core_->GetWindowAndroid()->GetCompositor(); |
DCHECK(compositor); |
- DCHECK(!surface_id_.is_null()); |
+ DCHECK(delegated_frame_host_->GetContentLayer()); |
std::unique_ptr<cc::CopyOutputRequest> request = |
cc::CopyOutputRequest::CreateRequest(base::Bind( |
&PrepareTextureCopyOutputResult, weak_ptr_factory_.GetWeakPtr(), |
@@ -893,7 +848,8 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
request->set_area(src_subrect_in_pixel); |
// Make sure the layer doesn't get deleted until we fulfill the request. |
LockCompositingSurface(); |
- view_.GetLayer()->RequestCopyOfOutput(std::move(request)); |
+ delegated_frame_host_->GetContentLayer()->RequestCopyOfOutput( |
+ std::move(request)); |
} |
void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( |
@@ -944,27 +900,12 @@ void RenderWidgetHostViewAndroid::ReturnResources( |
false /* is_swap_ack */); |
} |
-void RenderWidgetHostViewAndroid::SetBeginFrameSource( |
- cc::BeginFrameSource* begin_frame_source) { |
- // TODO(tansell): Hook this up. |
-} |
- |
-void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
- RemoveLayers(); |
- if (!surface_id_.is_null()) { |
- DCHECK(surface_factory_.get()); |
- surface_factory_->Destroy(surface_id_); |
- surface_id_ = cc::SurfaceId(); |
- } |
- view_.SetLayer(nullptr); |
-} |
- |
void RenderWidgetHostViewAndroid::CheckOutputSurfaceChanged( |
uint32_t output_surface_id) { |
if (output_surface_id == last_output_surface_id_) |
return; |
- DestroyDelegatedContent(); |
- surface_factory_.reset(); |
+ delegated_frame_host_->OutputSurfaceChanged(); |
+ |
if (!surface_returned_resources_.empty()) |
SendReclaimCompositorResources(last_output_surface_id_, |
false /* is_swap_ack */); |
@@ -972,46 +913,12 @@ void RenderWidgetHostViewAndroid::CheckOutputSurfaceChanged( |
last_output_surface_id_ = output_surface_id; |
} |
-void RenderWidgetHostViewAndroid::SubmitCompositorFrame( |
- cc::CompositorFrame frame) { |
- cc::SurfaceManager* manager = CompositorImpl::GetSurfaceManager(); |
- if (!surface_factory_) { |
- surface_factory_ = base::WrapUnique(new cc::SurfaceFactory(manager, this)); |
- } |
- if (surface_id_.is_null() || |
- texture_size_in_layer_ != current_surface_size_ || |
- location_bar_content_translation_ != |
- frame.metadata.location_bar_content_translation || |
- current_viewport_selection_ != frame.metadata.selection) { |
- RemoveLayers(); |
- if (!surface_id_.is_null()) |
- surface_factory_->Destroy(surface_id_); |
- surface_id_ = id_allocator_->GenerateId(); |
- surface_factory_->Create(surface_id_); |
- view_.SetLayer(CreateSurfaceLayer(surface_id_, texture_size_in_layer_)); |
- |
- DCHECK(view_.GetLayer()); |
- |
- current_surface_size_ = texture_size_in_layer_; |
- location_bar_content_translation_ = |
- frame.metadata.location_bar_content_translation; |
- current_viewport_selection_ = frame.metadata.selection; |
- AttachLayers(); |
- } |
- |
- cc::SurfaceFactory::DrawCallback ack_callback = |
- base::Bind(&RenderWidgetHostViewAndroid::RunAckCallbacks, |
- weak_ptr_factory_.GetWeakPtr()); |
- surface_factory_->SubmitCompositorFrame(surface_id_, std::move(frame), |
- ack_callback); |
-} |
- |
void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame( |
uint32_t output_surface_id, |
cc::CompositorFrame frame) { |
last_scroll_offset_ = frame.metadata.root_scroll_offset; |
DCHECK(frame.delegated_frame_data); |
- DCHECK(CompositorImpl::GetSurfaceManager()); |
+ DCHECK(delegated_frame_host_); |
if (locks_on_frame_count_ > 0) { |
DCHECK(HasValidFrame()); |
@@ -1038,12 +945,13 @@ void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame( |
ack_callbacks_.push(ack_callback); |
if (!has_content) { |
- DestroyDelegatedContent(); |
+ delegated_frame_host_->DestroyDelegatedContent(); |
} else { |
- SubmitCompositorFrame(std::move(frame)); |
- view_.GetLayer()->SetIsDrawable(true); |
- view_.GetLayer()->SetContentsOpaque(true); |
- view_.GetLayer()->SetBounds(texture_size_in_layer_); |
+ cc::SurfaceFactory::DrawCallback ack_callback = |
+ base::Bind(&RenderWidgetHostViewAndroid::RunAckCallbacks, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ delegated_frame_host_->SubmitCompositorFrame(std::move(frame), |
+ ack_callback); |
} |
if (host_->is_hidden()) |
@@ -1062,7 +970,7 @@ void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
} |
void RenderWidgetHostViewAndroid::ClearCompositorFrame() { |
- DestroyDelegatedContent(); |
+ delegated_frame_host_->DestroyDelegatedContent(); |
} |
void RenderWidgetHostViewAndroid::RetainFrame(uint32_t output_surface_id, |
@@ -1111,8 +1019,8 @@ void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( |
} |
void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) { |
- if (view_.GetLayer()) |
- view_.GetLayer()->SetContentsOpaque(!enabled); |
+ if (delegated_frame_host_->GetContentLayer()) |
+ delegated_frame_host_->GetContentLayer()->SetContentsOpaque(!enabled); |
} |
bool RenderWidgetHostViewAndroid::SupportsAnimation() const { |
@@ -1268,6 +1176,17 @@ void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated( |
#endif // defined(VIDEO_HOLE) |
} |
+gfx::Size RenderWidgetHostViewAndroid::GetViewSize() const { |
+ if (!content_view_core_) |
+ return default_size_; |
+ |
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnableOSKOverscroll)) |
+ return content_view_core_->GetViewSizeWithOSKHidden(); |
+ |
+ return content_view_core_->GetViewSize(); |
+} |
+ |
void RenderWidgetHostViewAndroid::ShowInternal() { |
bool show = is_showing_ && is_window_activity_started_ && is_window_visible_; |
if (!show) |
@@ -1276,8 +1195,8 @@ void RenderWidgetHostViewAndroid::ShowInternal() { |
if (!host_ || !host_->is_hidden()) |
return; |
- if (view_.GetLayer()) |
- view_.GetLayer()->SetHideLayerAndSubtree(false); |
+ if (delegated_frame_host_->GetContentLayer()) |
+ delegated_frame_host_->GetContentLayer()->SetHideLayerAndSubtree(false); |
frame_evictor_->SetVisible(true); |
@@ -1307,8 +1226,8 @@ void RenderWidgetHostViewAndroid::HideInternal() { |
bool stop_observing_root_window = !is_showing_ && hide_frontbuffer; |
if (hide_frontbuffer) { |
- if (view_.GetLayer() && locks_on_frame_count_ == 0) |
- view_.GetLayer()->SetHideLayerAndSubtree(true); |
+ if (delegated_frame_host_->GetContentLayer() && locks_on_frame_count_ == 0) |
+ delegated_frame_host_->GetContentLayer()->SetHideLayerAndSubtree(true); |
frame_evictor_->SetVisible(false); |
} |
@@ -1331,26 +1250,6 @@ void RenderWidgetHostViewAndroid::HideInternal() { |
host_->WasHidden(); |
} |
-void RenderWidgetHostViewAndroid::AttachLayers() { |
- if (!content_view_core_) |
- return; |
- if (!view_.GetLayer()) |
- return; |
- |
- content_view_core_->AttachLayer(view_.GetLayer()); |
- view_.GetLayer()->SetHideLayerAndSubtree(!is_showing_); |
-} |
- |
-void RenderWidgetHostViewAndroid::RemoveLayers() { |
- if (!content_view_core_) |
- return; |
- |
- if (!view_.GetLayer()) |
- return; |
- |
- content_view_core_->RemoveLayer(view_.GetLayer()); |
-} |
- |
void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32_t requests) { |
bool should_request_vsync = !outstanding_vsync_requests_ && requests; |
outstanding_vsync_requests_ |= requests; |
@@ -1437,8 +1336,7 @@ void RenderWidgetHostViewAndroid::RequestDisallowInterceptTouchEvent() { |
void RenderWidgetHostViewAndroid::EvictDelegatedFrame() { |
DCHECK_EQ(locks_on_frame_count_, 0u); |
frame_evictor_->DiscardedFrame(); |
- if (view_.GetLayer()) |
- DestroyDelegatedContent(); |
+ delegated_frame_host_->DestroyDelegatedContent(); |
} |
bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( |
@@ -1648,7 +1546,8 @@ void RenderWidgetHostViewAndroid::DidOverscroll( |
if (sync_compositor_) |
sync_compositor_->DidOverscroll(params); |
- if (!content_view_core_ || !view_.GetLayer() || !is_showing_) |
+ if (!content_view_core_ || !delegated_frame_host_->GetContentLayer() || |
+ !is_showing_) |
return; |
if (overscroll_controller_) |
@@ -1661,16 +1560,16 @@ void RenderWidgetHostViewAndroid::DidStopFlinging() { |
} |
uint32_t RenderWidgetHostViewAndroid::GetSurfaceClientId() { |
- if (id_allocator_) |
- return id_allocator_->client_id(); |
- return 0; |
+ if (!delegated_frame_host_) |
+ return 0; |
+ |
+ return delegated_frame_host_->GetSurfaceClientId(); |
} |
void RenderWidgetHostViewAndroid::SetContentViewCore( |
ContentViewCoreImpl* content_view_core) { |
DCHECK(!content_view_core || !content_view_core_ || |
(content_view_core_ == content_view_core)); |
- RemoveLayers(); |
StopObservingRootWindow(); |
bool resize = false; |
@@ -1688,10 +1587,13 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
if (content_view_core_) { |
content_view_core_->RemoveObserver(this); |
view_.RemoveFromParent(); |
+ view_.GetLayer()->RemoveFromParent(); |
} |
if (content_view_core) { |
content_view_core->AddObserver(this); |
- content_view_core->GetViewAndroid()->AddChild(&view_); |
+ ui::ViewAndroid* parent_view = content_view_core->GetViewAndroid(); |
+ parent_view->AddChild(&view_); |
+ parent_view->GetLayer()->AddChild(view_.GetLayer()); |
} |
content_view_core_ = content_view_core; |
} |
@@ -1706,7 +1608,6 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); |
} |
- AttachLayers(); |
if (!content_view_core_) { |
sync_compositor_.reset(); |
return; |
@@ -1851,8 +1752,7 @@ void RenderWidgetHostViewAndroid::OnActivityStarted() { |
void RenderWidgetHostViewAndroid::OnLostResources() { |
ReleaseLocksOnSurface(); |
- if (view_.GetLayer()) |
- DestroyDelegatedContent(); |
+ delegated_frame_host_->DestroyDelegatedContent(); |
DCHECK(ack_callbacks_.empty()); |
} |