Convert offscreen canvas to use FrameSinkManagerHost.
This CL switches the content/browser/ part of offscreen canvas to use
FrameSinkManagerHost instead of directly accessing SurfaceMananger.
OffscreenCanvasProvider(Impl) exists for the renderer to request other
interfaces from the browser. The renderer uses it create both a
OffscreenCanvasSurface and MojoCompositorFrameSink. This is a
simplification of OffscreenCanvasCompositorFrameSinkProvider and
OffscreenCanvasSurfaceFactory interfaces.
RenderProcessHostImpl creates a single OffscreenCanvasProviderImpl on
demand and uses it for all offscreen canvas requests from the renderer.
The renderer will first request a OffscreenCanvasSurface and specify the
FrameSinkId. This always happens from the main renderer thread. A
OffscreenCanvasSurfaceImpl will be created for the browser side of this
connection.
The renderer will then likely request MojoCompositorFrameSink for the
FrameSinkId, from either the main thread or a worker thread. This
request is forwarded to MojoFrameSinkManager. This sets up two
connections. There is a MojoCompositorFrameSink from
MojoFrameSinkManager to the renderer. This is used to submit
CompositorFrames. There is MojoCompositorFrameSinkPrivate from
OffscreenCanvasSurfaceImpl to MojoFrameSinkManager. This gives the
browser control over the CompositorFrameSink created in
MojoFrameSinkManager.
The render can close the OffscreenCanvasSurface and
MojoCompositorFrameSink connections in any order. The assumption is they
will both be closed at approximately the same time.
The remaining direct access to SurfaceManager by offscreen canvas code
is blocked on other features being completed.
BUG=664547,686861
CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_site_isolation
Review-Url: https://codereview.chromium.org/2789753002
Cr-Commit-Position: refs/heads/master@{#464381}
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 731f573..ef4dfc9 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1196,14 +1196,10 @@
"renderer_host/media/video_capture_provider.h",
"renderer_host/native_web_keyboard_event_aura.cc",
"renderer_host/native_web_keyboard_event_mac.mm",
- "renderer_host/offscreen_canvas_compositor_frame_sink.cc",
- "renderer_host/offscreen_canvas_compositor_frame_sink.h",
"renderer_host/offscreen_canvas_compositor_frame_sink_manager.cc",
"renderer_host/offscreen_canvas_compositor_frame_sink_manager.h",
- "renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.cc",
- "renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.h",
- "renderer_host/offscreen_canvas_surface_factory_impl.cc",
- "renderer_host/offscreen_canvas_surface_factory_impl.h",
+ "renderer_host/offscreen_canvas_provider_impl.cc",
+ "renderer_host/offscreen_canvas_provider_impl.h",
"renderer_host/offscreen_canvas_surface_impl.cc",
"renderer_host/offscreen_canvas_surface_impl.h",
"renderer_host/overscroll_configuration.cc",
diff --git a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.cc b/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.cc
deleted file mode 100644
index 97f1fcf..0000000
--- a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2016 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/renderer_host/offscreen_canvas_compositor_frame_sink.h"
-
-#include "base/memory/ptr_util.h"
-#include "cc/surfaces/surface.h"
-#include "cc/surfaces/surface_manager.h"
-#include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-
-namespace content {
-
-OffscreenCanvasCompositorFrameSink::OffscreenCanvasCompositorFrameSink(
- OffscreenCanvasCompositorFrameSinkProviderImpl* provider,
- const cc::FrameSinkId& frame_sink_id,
- cc::mojom::MojoCompositorFrameSinkRequest request,
- cc::mojom::MojoCompositorFrameSinkClientPtr client)
- : provider_(provider),
- support_(cc::CompositorFrameSinkSupport::Create(
- this,
- provider->GetSurfaceManager(),
- frame_sink_id,
- false /* is_root */,
- true /* handles_frame_sink_id_invalidation */,
- true /* needs_sync_points */)),
- client_(std::move(client)),
- binding_(this, std::move(request)) {
- binding_.set_connection_error_handler(
- base::Bind(&OffscreenCanvasCompositorFrameSink::OnClientConnectionLost,
- base::Unretained(this)));
-}
-
-OffscreenCanvasCompositorFrameSink::~OffscreenCanvasCompositorFrameSink() {
- provider_->OnCompositorFrameSinkClientDestroyed(support_->frame_sink_id());
-}
-
-void OffscreenCanvasCompositorFrameSink::SetNeedsBeginFrame(
- bool needs_begin_frame) {
- support_->SetNeedsBeginFrame(needs_begin_frame);
-}
-
-void OffscreenCanvasCompositorFrameSink::SubmitCompositorFrame(
- const cc::LocalSurfaceId& local_surface_id,
- cc::CompositorFrame frame) {
- // TODO(samans): This will need to do something similar to
- // GpuCompositorFrameSink.
- support_->SubmitCompositorFrame(local_surface_id, std::move(frame));
-}
-
-void OffscreenCanvasCompositorFrameSink::BeginFrameDidNotSwap(
- const cc::BeginFrameAck& begin_frame_ack) {
- support_->BeginFrameDidNotSwap(begin_frame_ack);
-}
-
-void OffscreenCanvasCompositorFrameSink::EvictFrame() {
- support_->EvictFrame();
-}
-
-void OffscreenCanvasCompositorFrameSink::DidReceiveCompositorFrameAck(
- const cc::ReturnedResourceArray& resources) {
- if (client_)
- client_->DidReceiveCompositorFrameAck(resources);
-}
-
-void OffscreenCanvasCompositorFrameSink::OnBeginFrame(
- const cc::BeginFrameArgs& args) {
- if (client_)
- client_->OnBeginFrame(args);
-}
-
-void OffscreenCanvasCompositorFrameSink::ReclaimResources(
- const cc::ReturnedResourceArray& resources) {
- if (client_)
- client_->ReclaimResources(resources);
-}
-
-void OffscreenCanvasCompositorFrameSink::WillDrawSurface(
- const cc::LocalSurfaceId& local_surface_id,
- const gfx::Rect& damage_rect) {}
-
-void OffscreenCanvasCompositorFrameSink::OnClientConnectionLost() {
- provider_->OnCompositorFrameSinkClientConnectionLost(
- support_->frame_sink_id());
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.h b/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.h
deleted file mode 100644
index 3110b32b..0000000
--- a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2016 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_RENDERER_HOST_OFFSCREEN_CANVAS_COMPOSITOR_FRAME_SINK_H_
-#define CONTENT_BROWSER_RENDERER_HOST_OFFSCREEN_CANVAS_COMPOSITOR_FRAME_SINK_H_
-
-#include "cc/ipc/compositor_frame.mojom.h"
-#include "cc/ipc/mojo_compositor_frame_sink.mojom.h"
-#include "cc/resources/transferable_resource.h"
-#include "cc/surfaces/compositor_frame_sink_support.h"
-#include "cc/surfaces/compositor_frame_sink_support_client.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-
-namespace content {
-
-class OffscreenCanvasCompositorFrameSinkProviderImpl;
-
-class OffscreenCanvasCompositorFrameSink
- : public cc::CompositorFrameSinkSupportClient,
- public cc::mojom::MojoCompositorFrameSink {
- public:
- OffscreenCanvasCompositorFrameSink(
- OffscreenCanvasCompositorFrameSinkProviderImpl* provider,
- const cc::FrameSinkId& frame_sink_id,
- cc::mojom::MojoCompositorFrameSinkRequest request,
- cc::mojom::MojoCompositorFrameSinkClientPtr client);
-
- ~OffscreenCanvasCompositorFrameSink() override;
-
- // Overridden from cc::mojom::MojoCompositorFrameSink:
- void SetNeedsBeginFrame(bool needs_begin_frame) override;
- void SubmitCompositorFrame(const cc::LocalSurfaceId& local_surface_id,
- cc::CompositorFrame frame) override;
- void BeginFrameDidNotSwap(const cc::BeginFrameAck& begin_frame_ack) override;
- void EvictFrame() override;
-
- // Overridden from cc::CompositorFrameSinkSupportClient:
- void DidReceiveCompositorFrameAck(
- const cc::ReturnedResourceArray& resources) override;
- void OnBeginFrame(const cc::BeginFrameArgs& args) override;
- void ReclaimResources(const cc::ReturnedResourceArray& resources) override;
- void WillDrawSurface(const cc::LocalSurfaceId& local_surface_id,
- const gfx::Rect& damage_rect) override;
-
- private:
- void OnClientConnectionLost();
-
- OffscreenCanvasCompositorFrameSinkProviderImpl* const provider_;
-
- std::unique_ptr<cc::CompositorFrameSinkSupport> support_;
- cc::mojom::MojoCompositorFrameSinkClientPtr client_;
- cc::ReturnedResourceArray surface_returned_resources_;
- mojo::Binding<cc::mojom::MojoCompositorFrameSink> binding_;
-
- DISALLOW_COPY_AND_ASSIGN(OffscreenCanvasCompositorFrameSink);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_RENDERER_HOST_OFFSCREEN_CANVAS_COMPOSITOR_FRAME_SINK_H_
diff --git a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.cc b/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.cc
index ef4cbcd..4a87ca3 100644
--- a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.cc
+++ b/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.cc
@@ -31,38 +31,14 @@
return g_manager.Pointer();
}
-void OffscreenCanvasCompositorFrameSinkManager::RegisterFrameSinkToParent(
- const cc::FrameSinkId& child_frame_sink_id) {
- auto surface_iter = registered_surface_instances_.find(child_frame_sink_id);
- if (surface_iter == registered_surface_instances_.end())
- return;
- OffscreenCanvasSurfaceImpl* surfaceImpl = surface_iter->second;
- if (surfaceImpl->parent_frame_sink_id().is_valid()) {
- GetSurfaceManager()->RegisterFrameSinkHierarchy(
- surfaceImpl->parent_frame_sink_id(), child_frame_sink_id);
- }
-}
-
-void OffscreenCanvasCompositorFrameSinkManager::UnregisterFrameSinkFromParent(
- const cc::FrameSinkId& child_frame_sink_id) {
- auto surface_iter = registered_surface_instances_.find(child_frame_sink_id);
- if (surface_iter == registered_surface_instances_.end())
- return;
- OffscreenCanvasSurfaceImpl* surfaceImpl = surface_iter->second;
- if (surfaceImpl->parent_frame_sink_id().is_valid()) {
- GetSurfaceManager()->UnregisterFrameSinkHierarchy(
- surfaceImpl->parent_frame_sink_id(), child_frame_sink_id);
- }
-}
-
void OffscreenCanvasCompositorFrameSinkManager::OnSurfaceCreated(
const cc::SurfaceInfo& surface_info) {
auto surface_iter =
registered_surface_instances_.find(surface_info.id().frame_sink_id());
if (surface_iter == registered_surface_instances_.end())
return;
- OffscreenCanvasSurfaceImpl* surfaceImpl = surface_iter->second;
- surfaceImpl->OnSurfaceCreated(surface_info);
+ OffscreenCanvasSurfaceImpl* surface_impl = surface_iter->second;
+ surface_impl->OnSurfaceCreated(surface_info);
}
void OffscreenCanvasCompositorFrameSinkManager::
diff --git a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.h b/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.h
index 7cd9ea8..2d3a2599 100644
--- a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.h
+++ b/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.h
@@ -20,12 +20,6 @@
static OffscreenCanvasCompositorFrameSinkManager* GetInstance();
- // Registration of the frame sink with the given frame sink id to its parent
- // frame sink (if it has one), so that parent frame is able to send signals
- // to it on begin frame.
- void RegisterFrameSinkToParent(const cc::FrameSinkId& frame_sink_id);
- void UnregisterFrameSinkFromParent(const cc::FrameSinkId& frame_sink_id);
-
void RegisterOffscreenCanvasSurfaceInstance(
const cc::FrameSinkId& frame_sink_id,
OffscreenCanvasSurfaceImpl* offscreen_canvas_surface);
diff --git a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.cc b/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.cc
deleted file mode 100644
index adef5ba..0000000
--- a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2016 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/renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.h"
-
-#include "base/memory/ptr_util.h"
-#include "content/browser/compositor/surface_utils.h"
-#include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.h"
-#include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-
-namespace content {
-
-OffscreenCanvasCompositorFrameSinkProviderImpl::
- OffscreenCanvasCompositorFrameSinkProviderImpl() {}
-
-OffscreenCanvasCompositorFrameSinkProviderImpl::
- ~OffscreenCanvasCompositorFrameSinkProviderImpl() {}
-
-void OffscreenCanvasCompositorFrameSinkProviderImpl::Add(
- blink::mojom::OffscreenCanvasCompositorFrameSinkProviderRequest request) {
- bindings_.AddBinding(this, std::move(request));
-}
-
-void OffscreenCanvasCompositorFrameSinkProviderImpl::CreateCompositorFrameSink(
- const cc::FrameSinkId& frame_sink_id,
- cc::mojom::MojoCompositorFrameSinkClientPtr client,
- cc::mojom::MojoCompositorFrameSinkRequest request) {
- compositor_frame_sinks_[frame_sink_id] =
- base::MakeUnique<OffscreenCanvasCompositorFrameSink>(
- this, frame_sink_id, std::move(request), std::move(client));
-
- OffscreenCanvasCompositorFrameSinkManager::GetInstance()
- ->RegisterFrameSinkToParent(frame_sink_id);
-}
-
-cc::SurfaceManager*
-OffscreenCanvasCompositorFrameSinkProviderImpl::GetSurfaceManager() {
- return content::GetSurfaceManager();
-}
-
-void OffscreenCanvasCompositorFrameSinkProviderImpl::
- OnCompositorFrameSinkClientConnectionLost(
- const cc::FrameSinkId& frame_sink_id) {
- // TODO(fsamuel, xlai): Investigate why this function is not fired when user
- // close down the window that has OffscreenCanvas commit().
- compositor_frame_sinks_.erase(frame_sink_id);
-}
-
-void OffscreenCanvasCompositorFrameSinkProviderImpl::
- OnCompositorFrameSinkClientDestroyed(const cc::FrameSinkId& frame_sink_id) {
- OffscreenCanvasCompositorFrameSinkManager::GetInstance()
- ->UnregisterFrameSinkFromParent(frame_sink_id);
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.h b/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.h
deleted file mode 100644
index 5da4335..0000000
--- a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2016 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_RENDERER_HOST_OFFSCREEN_CANVAS_COMPOSITOR_FRAME_SINK_PROVIDER_IMPL_H_
-#define CONTENT_BROWSER_RENDERER_HOST_OFFSCREEN_CANVAS_COMPOSITOR_FRAME_SINK_PROVIDER_IMPL_H_
-
-#include <unordered_map>
-
-#include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "third_party/WebKit/public/platform/modules/offscreencanvas/offscreen_canvas_surface.mojom.h"
-
-namespace content {
-
-// TODO(fsamuel): This should be replaced with the FrameSinkManager interface.
-class OffscreenCanvasCompositorFrameSinkProviderImpl
- : public blink::mojom::OffscreenCanvasCompositorFrameSinkProvider {
- public:
- OffscreenCanvasCompositorFrameSinkProviderImpl();
- ~OffscreenCanvasCompositorFrameSinkProviderImpl() override;
-
- void Add(
- blink::mojom::OffscreenCanvasCompositorFrameSinkProviderRequest request);
-
- // blink::mojom::OffscreenCanvasCompositorFrameSinkProvider implementation.
- void CreateCompositorFrameSink(
- const cc::FrameSinkId& frame_sink_id,
- cc::mojom::MojoCompositorFrameSinkClientPtr client,
- cc::mojom::MojoCompositorFrameSinkRequest request) override;
-
- cc::SurfaceManager* GetSurfaceManager();
-
- void OnCompositorFrameSinkClientConnectionLost(
- const cc::FrameSinkId& frame_sink_id);
- void OnCompositorFrameSinkClientDestroyed(
- const cc::FrameSinkId& frame_sink_id);
-
- private:
- std::unordered_map<cc::FrameSinkId,
- std::unique_ptr<OffscreenCanvasCompositorFrameSink>,
- cc::FrameSinkIdHash>
- compositor_frame_sinks_;
-
- mojo::BindingSet<blink::mojom::OffscreenCanvasCompositorFrameSinkProvider>
- bindings_;
-
- DISALLOW_COPY_AND_ASSIGN(OffscreenCanvasCompositorFrameSinkProviderImpl);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_RENDERER_HOST_OFFSCREEN_CANVAS_COMPOSITOR_FRAME_SINK_PROVIDER_IMPL_H_
diff --git a/content/browser/renderer_host/offscreen_canvas_provider_impl.cc b/content/browser/renderer_host/offscreen_canvas_provider_impl.cc
new file mode 100644
index 0000000..9d578ad
--- /dev/null
+++ b/content/browser/renderer_host/offscreen_canvas_provider_impl.cc
@@ -0,0 +1,47 @@
+// Copyright 2016 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/renderer_host/offscreen_canvas_provider_impl.h"
+
+#include "content/browser/compositor/surface_utils.h"
+#include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.h"
+#include "content/browser/renderer_host/offscreen_canvas_surface_impl.h"
+
+namespace content {
+
+OffscreenCanvasProviderImpl::OffscreenCanvasProviderImpl() = default;
+
+OffscreenCanvasProviderImpl::~OffscreenCanvasProviderImpl() = default;
+
+void OffscreenCanvasProviderImpl::Add(
+ blink::mojom::OffscreenCanvasProviderRequest request) {
+ bindings_.AddBinding(this, std::move(request));
+}
+
+void OffscreenCanvasProviderImpl::CreateOffscreenCanvasSurface(
+ const cc::FrameSinkId& parent_frame_sink_id,
+ const cc::FrameSinkId& frame_sink_id,
+ cc::mojom::FrameSinkManagerClientPtr client,
+ blink::mojom::OffscreenCanvasSurfaceRequest request) {
+ OffscreenCanvasSurfaceImpl::Create(parent_frame_sink_id, frame_sink_id,
+ std::move(client), std::move(request));
+}
+
+void OffscreenCanvasProviderImpl::CreateCompositorFrameSink(
+ const cc::FrameSinkId& frame_sink_id,
+ cc::mojom::MojoCompositorFrameSinkClientPtr client,
+ cc::mojom::MojoCompositorFrameSinkRequest request) {
+ // TODO(kylechar): Add test for bad |frame_sink_id|.
+ auto* manager = OffscreenCanvasCompositorFrameSinkManager::GetInstance();
+ auto* surface_impl = manager->GetSurfaceInstance(frame_sink_id);
+ if (!surface_impl) {
+ DLOG(ERROR) << "No OffscreenCanvasSurfaceImpl for " << frame_sink_id;
+ return;
+ }
+
+ surface_impl->CreateCompositorFrameSink(std::move(client),
+ std::move(request));
+}
+
+} // namespace content
diff --git a/content/browser/renderer_host/offscreen_canvas_provider_impl.h b/content/browser/renderer_host/offscreen_canvas_provider_impl.h
new file mode 100644
index 0000000..be2c52c
--- /dev/null
+++ b/content/browser/renderer_host/offscreen_canvas_provider_impl.h
@@ -0,0 +1,42 @@
+// Copyright 2016 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_RENDERER_HOST_OFFSCREEN_CANVAS_PROVIDER_IMPL_H_
+#define CONTENT_BROWSER_RENDERER_HOST_OFFSCREEN_CANVAS_PROVIDER_IMPL_H_
+
+#include "cc/surfaces/frame_sink_id.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "third_party/WebKit/public/platform/modules/offscreencanvas/offscreen_canvas_surface.mojom.h"
+
+namespace content {
+
+// Creates OffscreenCanvasSurfaces and MojoCompositorFrameSinks for a renderer.
+class OffscreenCanvasProviderImpl
+ : public blink::mojom::OffscreenCanvasProvider {
+ public:
+ OffscreenCanvasProviderImpl();
+ ~OffscreenCanvasProviderImpl() override;
+
+ void Add(blink::mojom::OffscreenCanvasProviderRequest request);
+
+ // blink::mojom::OffscreenCanvasProvider implementation.
+ void CreateOffscreenCanvasSurface(
+ const cc::FrameSinkId& parent_frame_sink_id,
+ const cc::FrameSinkId& frame_sink_id,
+ cc::mojom::FrameSinkManagerClientPtr client,
+ blink::mojom::OffscreenCanvasSurfaceRequest request) override;
+ void CreateCompositorFrameSink(
+ const cc::FrameSinkId& frame_sink_id,
+ cc::mojom::MojoCompositorFrameSinkClientPtr client,
+ cc::mojom::MojoCompositorFrameSinkRequest request) override;
+
+ private:
+ mojo::BindingSet<blink::mojom::OffscreenCanvasProvider> bindings_;
+
+ DISALLOW_COPY_AND_ASSIGN(OffscreenCanvasProviderImpl);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_RENDERER_HOST_OFFSCREEN_CANVAS_PROVIDER_IMPL_H_
diff --git a/content/browser/renderer_host/offscreen_canvas_surface_factory_impl.cc b/content/browser/renderer_host/offscreen_canvas_surface_factory_impl.cc
deleted file mode 100644
index 8d101f1..0000000
--- a/content/browser/renderer_host/offscreen_canvas_surface_factory_impl.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2016 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/renderer_host/offscreen_canvas_surface_factory_impl.h"
-
-#include "base/memory/ptr_util.h"
-#include "cc/surfaces/frame_sink_id.h"
-#include "content/browser/renderer_host/offscreen_canvas_surface_impl.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-
-namespace content {
-
-// static
-void OffscreenCanvasSurfaceFactoryImpl::Create(
- blink::mojom::OffscreenCanvasSurfaceFactoryRequest request) {
- mojo::MakeStrongBinding(base::MakeUnique<OffscreenCanvasSurfaceFactoryImpl>(),
- std::move(request));
-}
-
-void OffscreenCanvasSurfaceFactoryImpl::CreateOffscreenCanvasSurface(
- const cc::FrameSinkId& parent_frame_sink_id,
- const cc::FrameSinkId& frame_sink_id,
- cc::mojom::FrameSinkManagerClientPtr client,
- blink::mojom::OffscreenCanvasSurfaceRequest request) {
- OffscreenCanvasSurfaceImpl::Create(parent_frame_sink_id, frame_sink_id,
- std::move(client), std::move(request));
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/offscreen_canvas_surface_factory_impl.h b/content/browser/renderer_host/offscreen_canvas_surface_factory_impl.h
deleted file mode 100644
index 879e001..0000000
--- a/content/browser/renderer_host/offscreen_canvas_surface_factory_impl.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 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_RENDERER_HOST_OFFSCREEN_CANVAS_SURFACE_FACTORY_IMPL_H_
-#define CONTENT_BROWSER_RENDERER_HOST_OFFSCREEN_CANVAS_SURFACE_FACTORY_IMPL_H_
-
-#include "cc/ipc/frame_sink_manager.mojom.h"
-#include "third_party/WebKit/public/platform/modules/offscreencanvas/offscreen_canvas_surface.mojom.h"
-
-namespace content {
-
-class OffscreenCanvasSurfaceFactoryImpl
- : public blink::mojom::OffscreenCanvasSurfaceFactory {
- public:
- OffscreenCanvasSurfaceFactoryImpl() {}
- ~OffscreenCanvasSurfaceFactoryImpl() override {}
-
- static void Create(
- blink::mojom::OffscreenCanvasSurfaceFactoryRequest request);
-
- // blink::mojom::OffscreenCanvasSurfaceFactory implementation.
- void CreateOffscreenCanvasSurface(
- const cc::FrameSinkId& parent_frame_sink_id,
- const cc::FrameSinkId& frame_sink_id,
- cc::mojom::FrameSinkManagerClientPtr client,
- blink::mojom::OffscreenCanvasSurfaceRequest request) override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(OffscreenCanvasSurfaceFactoryImpl);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_RENDERER_HOST_OFFSCREEN_CANVAS_SURFACE_FACTORY_IMPL_H_
diff --git a/content/browser/renderer_host/offscreen_canvas_surface_impl.cc b/content/browser/renderer_host/offscreen_canvas_surface_impl.cc
index dd9218c..48ea6864 100644
--- a/content/browser/renderer_host/offscreen_canvas_surface_impl.cc
+++ b/content/browser/renderer_host/offscreen_canvas_surface_impl.cc
@@ -8,11 +8,10 @@
#include "base/bind_helpers.h"
#include "base/memory/ptr_util.h"
-#include "cc/surfaces/surface.h"
#include "cc/surfaces/surface_manager.h"
+#include "content/browser/compositor/frame_sink_manager_host.h"
#include "content/browser/compositor/surface_utils.h"
#include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_manager.h"
-#include "content/public/browser/browser_thread.h"
namespace content {
@@ -28,10 +27,12 @@
}
OffscreenCanvasSurfaceImpl::~OffscreenCanvasSurfaceImpl() {
- if (frame_sink_id_.is_valid()) {
- OffscreenCanvasCompositorFrameSinkManager::GetInstance()
- ->UnregisterOffscreenCanvasSurfaceInstance(frame_sink_id_);
+ if (has_created_compositor_frame_sink_) {
+ GetFrameSinkManagerHost()->UnregisterFrameSinkHierarchy(
+ parent_frame_sink_id_, frame_sink_id_);
}
+ OffscreenCanvasCompositorFrameSinkManager::GetInstance()
+ ->UnregisterOffscreenCanvasSurfaceInstance(frame_sink_id_);
}
// static
@@ -48,6 +49,23 @@
mojo::MakeStrongBinding(std::move(impl), std::move(request));
}
+void OffscreenCanvasSurfaceImpl::CreateCompositorFrameSink(
+ cc::mojom::MojoCompositorFrameSinkClientPtr client,
+ cc::mojom::MojoCompositorFrameSinkRequest request) {
+ if (has_created_compositor_frame_sink_) {
+ DLOG(ERROR) << "CreateCompositorFrameSink() called more than once.";
+ return;
+ }
+
+ GetFrameSinkManagerHost()->CreateCompositorFrameSink(
+ frame_sink_id_, std::move(request),
+ mojo::MakeRequest(&compositor_frame_sink_private_), std::move(client));
+
+ GetFrameSinkManagerHost()->RegisterFrameSinkHierarchy(parent_frame_sink_id_,
+ frame_sink_id_);
+ has_created_compositor_frame_sink_ = true;
+}
+
void OffscreenCanvasSurfaceImpl::OnSurfaceCreated(
const cc::SurfaceInfo& surface_info) {
DCHECK_EQ(surface_info.id().frame_sink_id(), frame_sink_id_);
diff --git a/content/browser/renderer_host/offscreen_canvas_surface_impl.h b/content/browser/renderer_host/offscreen_canvas_surface_impl.h
index ab3bcb2..3f76a2b 100644
--- a/content/browser/renderer_host/offscreen_canvas_surface_impl.h
+++ b/content/browser/renderer_host/offscreen_canvas_surface_impl.h
@@ -7,12 +7,13 @@
#include "cc/ipc/frame_sink_manager.mojom.h"
#include "cc/surfaces/surface_id.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "third_party/WebKit/public/platform/modules/offscreencanvas/offscreen_canvas_surface.mojom.h"
namespace content {
+// The browser owned object for an offscreen canvas connection. Holds
+// connections to both the renderer and frame sink manager.
class CONTENT_EXPORT OffscreenCanvasSurfaceImpl
: public blink::mojom::OffscreenCanvasSurface {
public:
@@ -26,6 +27,14 @@
cc::mojom::FrameSinkManagerClientPtr client,
blink::mojom::OffscreenCanvasSurfaceRequest request);
+ // Creates a MojoCompositorFrameSink connection to FrameSinkManager for an
+ // offscreen canvas client. The corresponding private interface will be owned
+ // here to control CompositorFrameSink lifetime. This should only ever be
+ // called once.
+ void CreateCompositorFrameSink(
+ cc::mojom::MojoCompositorFrameSinkClientPtr client,
+ cc::mojom::MojoCompositorFrameSinkRequest request);
+
void OnSurfaceCreated(const cc::SurfaceInfo& surface_info);
// blink::mojom::OffscreenCanvasSurface implementation.
@@ -47,11 +56,18 @@
cc::mojom::FrameSinkManagerClientPtr client_;
mojo::StrongBindingPtr<blink::mojom::OffscreenCanvasSurface> binding_;
+ // Private connection for the CompositorFrameSink. The CompositorFrameSink
+ // will not be destroyed until both private and offscreen canvas client
+ // connections are closed.
+ cc::mojom::MojoCompositorFrameSinkPrivatePtr compositor_frame_sink_private_;
+
// Surface-related state
const cc::FrameSinkId frame_sink_id_;
cc::LocalSurfaceId current_local_surface_id_;
const cc::FrameSinkId parent_frame_sink_id_;
+ bool has_created_compositor_frame_sink_ = false;
+
DISALLOW_COPY_AND_ASSIGN(OffscreenCanvasSurfaceImpl);
};
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 05f7cfe..9986ff6 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -109,8 +109,7 @@
#include "content/browser/renderer_host/media/media_stream_dispatcher_host.h"
#include "content/browser/renderer_host/media/peer_connection_tracker_host.h"
#include "content/browser/renderer_host/media/video_capture_host.h"
-#include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.h"
-#include "content/browser/renderer_host/offscreen_canvas_surface_factory_impl.h"
+#include "content/browser/renderer_host/offscreen_canvas_provider_impl.h"
#include "content/browser/renderer_host/pepper/pepper_message_filter.h"
#include "content/browser/renderer_host/pepper/pepper_renderer_connection.h"
#include "content/browser/renderer_host/render_message_filter.h"
@@ -1238,16 +1237,13 @@
AddUIThreadInterface(
registry.get(),
- base::Bind(&RenderProcessHostImpl::
- CreateOffscreenCanvasCompositorFrameSinkProvider,
+ base::Bind(&RenderProcessHostImpl::CreateOffscreenCanvasProvider,
base::Unretained(this)));
AddUIThreadInterface(registry.get(),
base::Bind(&RenderProcessHostImpl::BindFrameSinkProvider,
base::Unretained(this)));
- AddUIThreadInterface(registry.get(),
- base::Bind(&OffscreenCanvasSurfaceFactoryImpl::Create));
AddUIThreadInterface(
registry.get(),
base::Bind(&BackgroundSyncContext::CreateService,
@@ -1363,12 +1359,12 @@
gpu_client_->Add(std::move(request));
}
-void RenderProcessHostImpl::CreateOffscreenCanvasCompositorFrameSinkProvider(
- blink::mojom::OffscreenCanvasCompositorFrameSinkProviderRequest request) {
+void RenderProcessHostImpl::CreateOffscreenCanvasProvider(
+ blink::mojom::OffscreenCanvasProviderRequest request) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!offscreen_canvas_provider_) {
- offscreen_canvas_provider_.reset(
- new OffscreenCanvasCompositorFrameSinkProviderImpl());
+ offscreen_canvas_provider_ =
+ base::MakeUnique<OffscreenCanvasProviderImpl>();
}
offscreen_canvas_provider_->Add(std::move(request));
}
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index 7ef0f6a..aa6898d 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -24,7 +24,7 @@
#include "content/browser/child_process_launcher.h"
#include "content/browser/dom_storage/session_storage_namespace_impl.h"
#include "content/browser/renderer_host/frame_sink_provider_impl.h"
-#include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink_provider_impl.h"
+#include "content/browser/renderer_host/offscreen_canvas_provider_impl.h"
#include "content/browser/webrtc/webrtc_eventlog_host.h"
#include "content/common/associated_interfaces.mojom.h"
#include "content/common/content_export.h"
@@ -347,8 +347,8 @@
mojom::AssociatedInterfaceAssociatedRequest request) override;
void CreateMusGpuRequest(ui::mojom::GpuRequest request);
- void CreateOffscreenCanvasCompositorFrameSinkProvider(
- blink::mojom::OffscreenCanvasCompositorFrameSinkProviderRequest request);
+ void CreateOffscreenCanvasProvider(
+ blink::mojom::OffscreenCanvasProviderRequest request);
void BindFrameSinkProvider(mojom::FrameSinkProviderRequest request);
void CreateStoragePartitionService(
mojo::InterfaceRequest<mojom::StoragePartitionService> request);
@@ -606,8 +606,7 @@
std::unique_ptr<PushMessagingManager, BrowserThread::DeleteOnIOThread>
push_messaging_manager_;
- std::unique_ptr<OffscreenCanvasCompositorFrameSinkProviderImpl>
- offscreen_canvas_provider_;
+ std::unique_ptr<OffscreenCanvasProviderImpl> offscreen_canvas_provider_;
mojom::RouteProviderAssociatedPtr remote_route_provider_;
mojom::RendererAssociatedPtr renderer_interface_;
diff --git a/content/public/app/mojo/content_browser_manifest.json b/content/public/app/mojo/content_browser_manifest.json
index 0fedcfd..8100d6d 100644
--- a/content/public/app/mojo/content_browser_manifest.json
+++ b/content/public/app/mojo/content_browser_manifest.json
@@ -21,8 +21,7 @@
"blink::mojom::Hyphenation",
"blink::mojom::MimeRegistry",
"blink::mojom::NotificationService",
- "blink::mojom::OffscreenCanvasCompositorFrameSinkProvider",
- "blink::mojom::OffscreenCanvasSurfaceFactory",
+ "blink::mojom::OffscreenCanvasProvider",
"blink::mojom::PermissionService",
"blink::mojom::WebSocket",
"content::mojom::FieldTrialRecorder",
diff --git a/third_party/WebKit/Source/platform/graphics/CanvasSurfaceLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/CanvasSurfaceLayerBridge.cpp
index 8630a777..02c63f86 100644
--- a/third_party/WebKit/Source/platform/graphics/CanvasSurfaceLayerBridge.cpp
+++ b/third_party/WebKit/Source/platform/graphics/CanvasSurfaceLayerBridge.cpp
@@ -67,15 +67,15 @@
new OffscreenCanvasSurfaceReferenceFactory(weak_factory_.GetWeakPtr());
DCHECK(!service_.is_bound());
- mojom::blink::OffscreenCanvasSurfaceFactoryPtr service_factory;
+ mojom::blink::OffscreenCanvasProviderPtr provider;
Platform::Current()->GetInterfaceProvider()->GetInterface(
- mojo::MakeRequest(&service_factory));
+ mojo::MakeRequest(&provider));
// TODO(xlai): Ensure OffscreenCanvas commit() is still functional when a
// frame-less HTML canvas's document is reparenting under another frame.
// See crbug.com/683172.
- service_factory->CreateOffscreenCanvasSurface(
- parent_frame_sink_id_, frame_sink_id_,
- binding_.CreateInterfacePtrAndBind(), mojo::MakeRequest(&service_));
+ provider->CreateOffscreenCanvasSurface(parent_frame_sink_id_, frame_sink_id_,
+ binding_.CreateInterfacePtrAndBind(),
+ mojo::MakeRequest(&service_));
}
CanvasSurfaceLayerBridge::~CanvasSurfaceLayerBridge() {
diff --git a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
index 29d8a5e7..9e849684 100644
--- a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
+++ b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
@@ -48,7 +48,7 @@
// mojo channel for this special case.
current_local_surface_id_ = local_surface_id_allocator_.GenerateId();
DCHECK(!sink_.is_bound());
- mojom::blink::OffscreenCanvasCompositorFrameSinkProviderPtr provider;
+ mojom::blink::OffscreenCanvasProviderPtr provider;
Platform::Current()->GetInterfaceProvider()->GetInterface(
mojo::MakeRequest(&provider));
provider->CreateCompositorFrameSink(frame_sink_id_,
diff --git a/third_party/WebKit/public/platform/modules/offscreencanvas/offscreen_canvas_surface.mojom b/third_party/WebKit/public/platform/modules/offscreencanvas/offscreen_canvas_surface.mojom
index 9626b9d..d17270b 100644
--- a/third_party/WebKit/public/platform/modules/offscreencanvas/offscreen_canvas_surface.mojom
+++ b/third_party/WebKit/public/platform/modules/offscreencanvas/offscreen_canvas_surface.mojom
@@ -4,7 +4,6 @@
module blink.mojom;
-import "cc/ipc/compositor_frame.mojom";
import "cc/ipc/frame_sink_id.mojom";
import "cc/ipc/frame_sink_manager.mojom";
import "cc/ipc/mojo_compositor_frame_sink.mojom";
@@ -16,17 +15,20 @@
Satisfy(cc.mojom.SurfaceSequence sequence);
};
-interface OffscreenCanvasSurfaceFactory {
+// Creates OffscreenCanvasSurface and MojoCompositorFrameSink instances for use
+// with offscreen canvas.
+interface OffscreenCanvasProvider {
+ // TODO(kylechar): Observer interface shouldn't be FrameSinkManagerClient.
+ // Create an OffscreenCanvasSurface for |frame_sink_id|. |client| will observe
+ // any changes to the SurfaceId associated with |frame_sink_id|.
CreateOffscreenCanvasSurface(cc.mojom.FrameSinkId parent_frame_sink_id,
cc.mojom.FrameSinkId frame_sink_id,
cc.mojom.FrameSinkManagerClient client,
- OffscreenCanvasSurface& service);
-};
+ OffscreenCanvasSurface& surface);
-interface OffscreenCanvasCompositorFrameSinkProvider {
- // TODO(fsamuel, xlai): Replace this with FrameSinkManager
+ // Create an MojoCompositorFrameSink for |frame_sink_id|. This must happen
+ // after creating an OffsreenCanvasSurface for |frame_sink_id|.
CreateCompositorFrameSink(cc.mojom.FrameSinkId frame_sink_id,
cc.mojom.MojoCompositorFrameSinkClient client,
cc.mojom.MojoCompositorFrameSink& sink);
-};
-
+};
\ No newline at end of file