summaryrefslogtreecommitdiffstats
path: root/content/browser
diff options
context:
space:
mode:
authorjbauman <jbauman@chromium.org>2015-06-03 16:38:59 -0700
committerCommit bot <commit-bot@chromium.org>2015-06-03 23:39:41 +0000
commitdfb4996ac036faf3318090eef1bf48d02cd4fe07 (patch)
treef737ee88f3d5ee7f33f86e3814cdfa767aad67a1 /content/browser
parent0b08cdaeab9210611012014b9ba7ac93d7efb5c7 (diff)
downloadchromium_src-dfb4996ac036faf3318090eef1bf48d02cd4fe07.zip
chromium_src-dfb4996ac036faf3318090eef1bf48d02cd4fe07.tar.gz
chromium_src-dfb4996ac036faf3318090eef1bf48d02cd4fe07.tar.bz2
Support out-of-process iframes with Surfaces on Android.
Create a surface_utils.h to abstract out the details of getting a SurfaceManager and SurfaceIdAllocator on android vs. other chrome. Review URL: https://codereview.chromium.org/1148003006 Cr-Commit-Position: refs/heads/master@{#332725}
Diffstat (limited to 'content/browser')
-rw-r--r--content/browser/BUILD.gn7
-rw-r--r--content/browser/compositor/surface_utils.cc36
-rw-r--r--content/browser/compositor/surface_utils.h23
-rw-r--r--content/browser/frame_host/cross_process_frame_connector.cc11
-rw-r--r--content/browser/frame_host/render_widget_host_view_child_frame.cc20
-rw-r--r--content/browser/renderer_host/compositor_impl_android.cc10
-rw-r--r--content/browser/renderer_host/render_widget_host_view_android.cc9
-rw-r--r--content/browser/renderer_host/render_widget_host_view_android.h1
8 files changed, 92 insertions, 25 deletions
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 59c64c5..71083b9 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -438,6 +438,13 @@ source_set("browser") {
deps += [ "//ui/compositor" ]
}
+ if (!is_ios) {
+ sources += [
+ "compositor/surface_utils.cc",
+ "compositor/surface_utils.h",
+ ]
+ }
+
if (enable_web_speech) {
deps += [
"//third_party/flac",
diff --git a/content/browser/compositor/surface_utils.cc b/content/browser/compositor/surface_utils.cc
new file mode 100644
index 0000000..78f63a0
--- /dev/null
+++ b/content/browser/compositor/surface_utils.cc
@@ -0,0 +1,36 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/compositor/surface_utils.h"
+
+#include "cc/surfaces/surface_id_allocator.h"
+
+#if defined(OS_ANDROID)
+#include "content/browser/renderer_host/compositor_impl_android.h"
+#else
+#include "content/browser/compositor/image_transport_factory.h"
+#include "ui/compositor/compositor.h"
+#endif
+
+namespace content {
+
+scoped_ptr<cc::SurfaceIdAllocator> CreateSurfaceIdAllocator() {
+#if defined(OS_ANDROID)
+ return CompositorImpl::CreateSurfaceIdAllocator();
+#else
+ ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
+ return factory->GetContextFactory()->CreateSurfaceIdAllocator();
+#endif
+}
+
+cc::SurfaceManager* GetSurfaceManager() {
+#if defined(OS_ANDROID)
+ return CompositorImpl::GetSurfaceManager();
+#else
+ ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
+ return factory->GetSurfaceManager();
+#endif
+}
+
+} // namespace content
diff --git a/content/browser/compositor/surface_utils.h b/content/browser/compositor/surface_utils.h
new file mode 100644
index 0000000..b56fef2
--- /dev/null
+++ b/content/browser/compositor/surface_utils.h
@@ -0,0 +1,23 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_COMPOSITOR_SURFACE_UTILS_H_
+#define CONTENT_BROWSER_COMPOSITOR_SURFACE_UTILS_H_
+
+#include "base/memory/scoped_ptr.h"
+
+namespace cc {
+class SurfaceIdAllocator;
+class SurfaceManager;
+} // namespace cc
+
+namespace content {
+
+scoped_ptr<cc::SurfaceIdAllocator> CreateSurfaceIdAllocator();
+
+cc::SurfaceManager* GetSurfaceManager();
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_COMPOSITOR_SURFACE_UTILS_H_
diff --git a/content/browser/frame_host/cross_process_frame_connector.cc b/content/browser/frame_host/cross_process_frame_connector.cc
index b116792..dbc4128 100644
--- a/content/browser/frame_host/cross_process_frame_connector.cc
+++ b/content/browser/frame_host/cross_process_frame_connector.cc
@@ -6,6 +6,7 @@
#include "cc/surfaces/surface.h"
#include "cc/surfaces/surface_manager.h"
+#include "content/browser/compositor/surface_utils.h"
#include "content/browser/frame_host/render_frame_proxy_host.h"
#include "content/browser/frame_host/render_widget_host_view_child_frame.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
@@ -94,28 +95,22 @@ void CrossProcessFrameConnector::SetChildFrameSurface(
void CrossProcessFrameConnector::OnSatisfySequence(
const cc::SurfaceSequence& sequence) {
-#if !defined(OS_ANDROID)
std::vector<uint32_t> sequences;
sequences.push_back(sequence.sequence);
- cc::SurfaceManager* manager =
- ImageTransportFactory::GetInstance()->GetSurfaceManager();
+ cc::SurfaceManager* manager = GetSurfaceManager();
manager->DidSatisfySequences(sequence.id_namespace, &sequences);
-#endif
}
void CrossProcessFrameConnector::OnRequireSequence(
const cc::SurfaceId& id,
const cc::SurfaceSequence& sequence) {
-#if !defined(OS_ANDROID)
- cc::SurfaceManager* manager =
- ImageTransportFactory::GetInstance()->GetSurfaceManager();
+ cc::SurfaceManager* manager = GetSurfaceManager();
cc::Surface* surface = manager->GetSurfaceForId(id);
if (!surface) {
LOG(ERROR) << "Attempting to require callback on nonexistent surface";
return;
}
surface->AddDestructionDependency(sequence);
-#endif
}
void CrossProcessFrameConnector::OnCompositorFrameSwappedACK(
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc
index e4ced72..5b17009 100644
--- a/content/browser/frame_host/render_widget_host_view_child_frame.cc
+++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc
@@ -9,6 +9,7 @@
#include "cc/surfaces/surface_manager.h"
#include "cc/surfaces/surface_sequence.h"
#include "content/browser/accessibility/browser_accessibility_manager.h"
+#include "content/browser/compositor/surface_utils.h"
#include "content/browser/frame_host/cross_process_frame_connector.h"
#include "content/browser/gpu/compositor_util.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
@@ -28,12 +29,8 @@ RenderWidgetHostViewChildFrame::RenderWidgetHostViewChildFrame(
ack_pending_count_(0),
frame_connector_(NULL),
weak_factory_(this) {
-#if !defined(OS_ANDROID)
- if (use_surfaces_) {
- ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
- id_allocator_ = factory->GetContextFactory()->CreateSurfaceIdAllocator();
- }
-#endif // !defined(OS_ANDROID)
+ if (use_surfaces_)
+ id_allocator_ = CreateSurfaceIdAllocator();
host_->SetView(this);
}
@@ -238,7 +235,6 @@ void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame(
return;
}
-#if !defined(OS_ANDROID)
cc::RenderPass* root_pass =
frame->delegated_frame_data->render_pass_list.back();
@@ -263,8 +259,7 @@ void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame(
}
if (!surface_factory_) {
- ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
- cc::SurfaceManager* manager = factory->GetSurfaceManager();
+ cc::SurfaceManager* manager = GetSurfaceManager();
surface_factory_ = make_scoped_ptr(new cc::SurfaceFactory(manager, this));
}
@@ -272,14 +267,12 @@ void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame(
surface_id_ = id_allocator_->GenerateId();
surface_factory_->Create(surface_id_);
- ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
cc::SurfaceSequence sequence = cc::SurfaceSequence(
id_allocator_->id_namespace(), next_surface_sequence_++);
// The renderer process will satisfy this dependency when it creates a
// SurfaceLayer.
- factory->GetSurfaceManager()
- ->GetSurfaceForId(surface_id_)
- ->AddDestructionDependency(sequence);
+ cc::SurfaceManager* manager = GetSurfaceManager();
+ manager->GetSurfaceForId(surface_id_)->AddDestructionDependency(sequence);
frame_connector_->SetChildFrameSurface(surface_id_, frame_size,
scale_factor, sequence);
}
@@ -291,7 +284,6 @@ void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame(
// If this value grows very large, something is going wrong.
DCHECK(ack_pending_count_ < 1000);
surface_factory_->SubmitFrame(surface_id_, frame.Pass(), ack_callback);
-#endif // !defined(OS_ANDROID)
}
void RenderWidgetHostViewChildFrame::GetScreenInfo(
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index efc04f2..ce153f5 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -210,14 +210,20 @@ cc::SurfaceManager* CompositorImpl::GetSurfaceManager() {
// static
scoped_ptr<cc::SurfaceIdAllocator> CompositorImpl::CreateSurfaceIdAllocator() {
- return make_scoped_ptr(new cc::SurfaceIdAllocator(++g_surface_id_namespace));
+ scoped_ptr<cc::SurfaceIdAllocator> allocator(
+ new cc::SurfaceIdAllocator(++g_surface_id_namespace));
+ cc::SurfaceManager* manager = GetSurfaceManager();
+ DCHECK(manager);
+ allocator->RegisterSurfaceIdNamespace(manager);
+ return allocator.Pass();
}
CompositorImpl::CompositorImpl(CompositorClient* client,
gfx::NativeWindow root_window)
: root_layer_(cc::Layer::Create(Compositor::LayerSettings())),
resource_manager_(&ui_resource_provider_),
- surface_id_allocator_(CreateSurfaceIdAllocator()),
+ surface_id_allocator_(GetSurfaceManager() ? CreateSurfaceIdAllocator()
+ : nullptr),
has_transparent_background_(false),
device_scale_factor_(1),
window_(NULL),
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 7b1b23b..59f2b32 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -343,6 +343,8 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
locks_on_frame_count_(0),
observing_root_window_(false),
weak_ptr_factory_(this) {
+ if (CompositorImpl::GetSurfaceManager())
+ id_allocator_ = CompositorImpl::CreateSurfaceIdAllocator();
host_->SetView(this);
SetContentViewCore(content_view_core);
}
@@ -1037,7 +1039,6 @@ void RenderWidgetHostViewAndroid::SubmitFrame(
cc::SurfaceManager* manager = CompositorImpl::GetSurfaceManager();
if (manager) {
if (!surface_factory_) {
- id_allocator_ = CompositorImpl::CreateSurfaceIdAllocator();
surface_factory_ = make_scoped_ptr(new cc::SurfaceFactory(manager, this));
}
if (surface_id_.is_null() ||
@@ -1759,6 +1760,12 @@ void RenderWidgetHostViewAndroid::DidStopFlinging() {
content_view_core_->DidStopFlinging();
}
+uint32_t RenderWidgetHostViewAndroid::GetSurfaceIdNamespace() {
+ if (id_allocator_)
+ return id_allocator_->id_namespace();
+ return 0;
+}
+
void RenderWidgetHostViewAndroid::SetContentViewCore(
ContentViewCoreImpl* content_view_core) {
RemoveLayers();
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index fc8decb..f1ac987 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -154,6 +154,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
scoped_ptr<cc::CompositorFrame> frame) override;
void DidOverscroll(const DidOverscrollParams& params) override;
void DidStopFlinging() override;
+ uint32_t GetSurfaceIdNamespace() override;
void ShowDisambiguationPopup(const gfx::Rect& rect_pixels,
const SkBitmap& zoomed_bitmap) override;
scoped_ptr<SyntheticGestureTarget> CreateSyntheticGestureTarget() override;