[ios] Create a standalone external view embedder on iOS (#21798)
diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter
index 2553764..db2650a 100755
--- a/ci/licenses_golden/licenses_flutter
+++ b/ci/licenses_golden/licenses_flutter
@@ -1003,6 +1003,8 @@
FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_texture_gl.mm
FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_texture_metal.h
FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_texture_metal.mm
+FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_view_embedder.h
+FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_view_embedder.mm
FILE: ../../../flutter/shell/platform/darwin/ios/ios_render_target_gl.h
FILE: ../../../flutter/shell/platform/darwin/ios/ios_render_target_gl.mm
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface.h
diff --git a/shell/platform/darwin/ios/BUILD.gn b/shell/platform/darwin/ios/BUILD.gn
index fb0a845..793c97b 100644
--- a/shell/platform/darwin/ios/BUILD.gn
+++ b/shell/platform/darwin/ios/BUILD.gn
@@ -93,6 +93,8 @@
"ios_context_software.mm",
"ios_external_texture_gl.h",
"ios_external_texture_gl.mm",
+ "ios_external_view_embedder.h",
+ "ios_external_view_embedder.mm",
"ios_render_target_gl.h",
"ios_render_target_gl.mm",
"ios_surface.h",
diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h
new file mode 100644
index 0000000..e717c2e
--- /dev/null
+++ b/shell/platform/darwin/ios/ios_external_view_embedder.h
@@ -0,0 +1,71 @@
+// Copyright 2013 The Flutter 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 FLUTTER_SHELL_PLATFORM_DARWIN_IOS_IOS_EXTERNAL_VIEW_EMBEDDER_H_
+#define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_IOS_EXTERNAL_VIEW_EMBEDDER_H_
+
+#include "flutter/flow/embedded_views.h"
+#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h"
+
+namespace flutter {
+
+class IOSExternalViewEmbedder : public ExternalViewEmbedder {
+ public:
+ IOSExternalViewEmbedder(
+ FlutterPlatformViewsController* platform_views_controller,
+ std::shared_ptr<IOSContext> context);
+
+ // |ExternalViewEmbedder|
+ virtual ~IOSExternalViewEmbedder() override;
+
+ private:
+ FlutterPlatformViewsController* platform_views_controller_;
+ std::shared_ptr<IOSContext> ios_context_;
+
+ // |ExternalViewEmbedder|
+ SkCanvas* GetRootCanvas() override;
+
+ // |ExternalViewEmbedder|
+ void CancelFrame() override;
+
+ // |ExternalViewEmbedder|
+ void BeginFrame(
+ SkISize frame_size,
+ GrDirectContext* context,
+ double device_pixel_ratio,
+ fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override;
+
+ // |ExternalViewEmbedder|
+ void PrerollCompositeEmbeddedView(
+ int view_id,
+ std::unique_ptr<flutter::EmbeddedViewParams> params) override;
+
+ // |ExternalViewEmbedder|
+ PostPrerollResult PostPrerollAction(
+ fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override;
+
+ // |ExternalViewEmbedder|
+ std::vector<SkCanvas*> GetCurrentCanvases() override;
+
+ // |ExternalViewEmbedder|
+ SkCanvas* CompositeEmbeddedView(int view_id) override;
+
+ // |ExternalViewEmbedder|
+ void SubmitFrame(GrDirectContext* context,
+ std::unique_ptr<SurfaceFrame> frame) override;
+
+ // |ExternalViewEmbedder|
+ void EndFrame(
+ bool should_resubmit_frame,
+ fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override;
+
+ // |ExternalViewEmbedder|
+ bool SupportsDynamicThreadMerging() override;
+
+ FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder);
+};
+
+} // namespace flutter
+
+#endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_IOS_EXTERNAL_VIEW_EMBEDDER_H_
diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm
new file mode 100644
index 0000000..8939b49
--- /dev/null
+++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm
@@ -0,0 +1,96 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "flutter/shell/platform/darwin/ios/ios_external_view_embedder.h"
+
+namespace flutter {
+
+IOSExternalViewEmbedder::IOSExternalViewEmbedder(
+ FlutterPlatformViewsController* platform_views_controller,
+ std::shared_ptr<IOSContext> context)
+ : platform_views_controller_(platform_views_controller), ios_context_(context) {
+ FML_CHECK(ios_context_);
+}
+
+IOSExternalViewEmbedder::~IOSExternalViewEmbedder() = default;
+
+// |ExternalViewEmbedder|
+SkCanvas* IOSExternalViewEmbedder::GetRootCanvas() {
+ // On iOS, the root surface is created from the on-screen render target. Only the surfaces for the
+ // various overlays are controlled by this class.
+ return nullptr;
+}
+
+// |ExternalViewEmbedder|
+void IOSExternalViewEmbedder::CancelFrame() {
+ TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::CancelFrame");
+ FML_CHECK(platform_views_controller_);
+ platform_views_controller_->CancelFrame();
+}
+
+// |ExternalViewEmbedder|
+void IOSExternalViewEmbedder::BeginFrame(
+ SkISize frame_size,
+ GrDirectContext* context,
+ double device_pixel_ratio,
+ fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
+ TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::BeginFrame");
+ FML_CHECK(platform_views_controller_);
+ platform_views_controller_->SetFrameSize(frame_size);
+}
+
+// |ExternalViewEmbedder|
+void IOSExternalViewEmbedder::PrerollCompositeEmbeddedView(
+ int view_id,
+ std::unique_ptr<EmbeddedViewParams> params) {
+ TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::PrerollCompositeEmbeddedView");
+ FML_CHECK(platform_views_controller_);
+ platform_views_controller_->PrerollCompositeEmbeddedView(view_id, std::move(params));
+}
+
+// |ExternalViewEmbedder|
+PostPrerollResult IOSExternalViewEmbedder::PostPrerollAction(
+ fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
+ TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::PostPrerollAction");
+ FML_CHECK(platform_views_controller_);
+ PostPrerollResult result = platform_views_controller_->PostPrerollAction(raster_thread_merger);
+ return result;
+}
+
+// |ExternalViewEmbedder|
+std::vector<SkCanvas*> IOSExternalViewEmbedder::GetCurrentCanvases() {
+ FML_CHECK(platform_views_controller_);
+ return platform_views_controller_->GetCurrentCanvases();
+}
+
+// |ExternalViewEmbedder|
+SkCanvas* IOSExternalViewEmbedder::CompositeEmbeddedView(int view_id) {
+ TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::CompositeEmbeddedView");
+ FML_CHECK(platform_views_controller_);
+ return platform_views_controller_->CompositeEmbeddedView(view_id);
+}
+
+// |ExternalViewEmbedder|
+void IOSExternalViewEmbedder::SubmitFrame(GrDirectContext* context,
+ std::unique_ptr<SurfaceFrame> frame) {
+ TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::SubmitFrame");
+ FML_CHECK(platform_views_controller_);
+ platform_views_controller_->SubmitFrame(std::move(context), ios_context_, std::move(frame));
+ TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::DidSubmitFrame");
+}
+
+// |ExternalViewEmbedder|
+void IOSExternalViewEmbedder::EndFrame(bool should_resubmit_frame,
+ fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
+ TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::EndFrame");
+ FML_CHECK(platform_views_controller_);
+ return platform_views_controller_->EndFrame(should_resubmit_frame, raster_thread_merger);
+}
+
+// |ExternalViewEmbedder|
+bool IOSExternalViewEmbedder::SupportsDynamicThreadMerging() {
+ return true;
+}
+
+} // namespace flutter
diff --git a/shell/platform/darwin/ios/ios_surface.h b/shell/platform/darwin/ios/ios_surface.h
index a01f9f1..8935b75 100644
--- a/shell/platform/darwin/ios/ios_surface.h
+++ b/shell/platform/darwin/ios/ios_surface.h
@@ -6,6 +6,7 @@
#define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_IOS_SURFACE_H_
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h"
+#import "flutter/shell/platform/darwin/ios/ios_external_view_embedder.h"
#include <memory>
@@ -22,18 +23,19 @@
// mechanism which is still in a release preview.
bool IsIosEmbeddedViewsPreviewEnabled();
-class IOSSurface : public ExternalViewEmbedder {
+class IOSSurface {
public:
static std::unique_ptr<IOSSurface> Create(
std::shared_ptr<IOSContext> context,
fml::scoped_nsobject<CALayer> layer,
FlutterPlatformViewsController* platform_views_controller);
- // |ExternalViewEmbedder|
- virtual ~IOSSurface();
-
std::shared_ptr<IOSContext> GetContext() const;
+ std::shared_ptr<IOSExternalViewEmbedder> GetSurfaceExternalViewEmbedder() const;
+
+ virtual ~IOSSurface();
+
virtual bool IsValid() const = 0;
virtual void UpdateStorageSizeIfNecessary() = 0;
@@ -51,45 +53,8 @@
private:
std::shared_ptr<IOSContext> ios_context_;
- FlutterPlatformViewsController* platform_views_controller_;
+ std::shared_ptr<IOSExternalViewEmbedder> external_view_embedder_;
- // |ExternalViewEmbedder|
- SkCanvas* GetRootCanvas() override;
-
- // |ExternalViewEmbedder|
- void CancelFrame() override;
-
- // |ExternalViewEmbedder|
- void BeginFrame(SkISize frame_size,
- GrDirectContext* context,
- double device_pixel_ratio,
- fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override;
-
- // |ExternalViewEmbedder|
- void PrerollCompositeEmbeddedView(int view_id,
- std::unique_ptr<flutter::EmbeddedViewParams> params) override;
-
- // |ExternalViewEmbedder|
- PostPrerollResult PostPrerollAction(
- fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override;
-
- // |ExternalViewEmbedder|
- std::vector<SkCanvas*> GetCurrentCanvases() override;
-
- // |ExternalViewEmbedder|
- SkCanvas* CompositeEmbeddedView(int view_id) override;
-
- // |ExternalViewEmbedder|
- void SubmitFrame(GrDirectContext* context, std::unique_ptr<SurfaceFrame> frame) override;
-
- // |ExternalViewEmbedder|
- void EndFrame(bool should_resubmit_frame,
- fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override;
-
- // |ExternalViewEmbedder|
- bool SupportsDynamicThreadMerging() override;
-
- public:
FML_DISALLOW_COPY_AND_ASSIGN(IOSSurface);
};
diff --git a/shell/platform/darwin/ios/ios_surface.mm b/shell/platform/darwin/ios/ios_surface.mm
index 331cbeb..49b418a 100644
--- a/shell/platform/darwin/ios/ios_surface.mm
+++ b/shell/platform/darwin/ios/ios_surface.mm
@@ -53,8 +53,10 @@
IOSSurface::IOSSurface(std::shared_ptr<IOSContext> ios_context,
FlutterPlatformViewsController* platform_views_controller)
- : ios_context_(std::move(ios_context)), platform_views_controller_(platform_views_controller) {
+ : ios_context_(std::move(ios_context)) {
FML_DCHECK(ios_context_);
+ external_view_embedder_ =
+ std::make_shared<IOSExternalViewEmbedder>(platform_views_controller, ios_context_);
}
IOSSurface::~IOSSurface() = default;
@@ -63,80 +65,8 @@
return ios_context_;
}
-// |ExternalViewEmbedder|
-SkCanvas* IOSSurface::GetRootCanvas() {
- // On iOS, the root surface is created from the on-screen render target. Only the surfaces for the
- // various overlays are controlled by this class.
- return nullptr;
-}
-
-// |ExternalViewEmbedder|
-void IOSSurface::CancelFrame() {
- TRACE_EVENT0("flutter", "IOSSurface::CancelFrame");
- FML_CHECK(platform_views_controller_ != nullptr);
- platform_views_controller_->CancelFrame();
-}
-
-// |ExternalViewEmbedder|
-void IOSSurface::BeginFrame(SkISize frame_size,
- GrDirectContext* context,
- double device_pixel_ratio,
- fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
- TRACE_EVENT0("flutter", "IOSSurface::BeginFrame");
- FML_CHECK(platform_views_controller_ != nullptr);
- platform_views_controller_->SetFrameSize(frame_size);
-}
-
-// |ExternalViewEmbedder|
-void IOSSurface::PrerollCompositeEmbeddedView(int view_id,
- std::unique_ptr<EmbeddedViewParams> params) {
- TRACE_EVENT0("flutter", "IOSSurface::PrerollCompositeEmbeddedView");
-
- FML_CHECK(platform_views_controller_ != nullptr);
- platform_views_controller_->PrerollCompositeEmbeddedView(view_id, std::move(params));
-}
-
-// |ExternalViewEmbedder|
-PostPrerollResult IOSSurface::PostPrerollAction(
- fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
- TRACE_EVENT0("flutter", "IOSSurface::PostPrerollAction");
- FML_CHECK(platform_views_controller_ != nullptr);
- PostPrerollResult result = platform_views_controller_->PostPrerollAction(raster_thread_merger);
- return result;
-}
-
-// |ExternalViewEmbedder|
-std::vector<SkCanvas*> IOSSurface::GetCurrentCanvases() {
- FML_CHECK(platform_views_controller_ != nullptr);
- return platform_views_controller_->GetCurrentCanvases();
-}
-
-// |ExternalViewEmbedder|
-SkCanvas* IOSSurface::CompositeEmbeddedView(int view_id) {
- TRACE_EVENT0("flutter", "IOSSurface::CompositeEmbeddedView");
- FML_CHECK(platform_views_controller_ != nullptr);
- return platform_views_controller_->CompositeEmbeddedView(view_id);
-}
-
-// |ExternalViewEmbedder|
-void IOSSurface::SubmitFrame(GrDirectContext* context, std::unique_ptr<SurfaceFrame> frame) {
- TRACE_EVENT0("flutter", "IOSSurface::SubmitFrame");
- FML_CHECK(platform_views_controller_ != nullptr);
- platform_views_controller_->SubmitFrame(std::move(context), ios_context_, std::move(frame));
- TRACE_EVENT0("flutter", "IOSSurface::DidSubmitFrame");
-}
-
-// |ExternalViewEmbedder|
-void IOSSurface::EndFrame(bool should_resubmit_frame,
- fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
- TRACE_EVENT0("flutter", "IOSSurface::EndFrame");
- FML_CHECK(platform_views_controller_ != nullptr);
- return platform_views_controller_->EndFrame(should_resubmit_frame, raster_thread_merger);
-}
-
-// |ExternalViewEmbedder|
-bool IOSSurface::SupportsDynamicThreadMerging() {
- return true;
+std::shared_ptr<IOSExternalViewEmbedder> IOSSurface::GetSurfaceExternalViewEmbedder() const {
+ return external_view_embedder_;
}
} // namespace flutter
diff --git a/shell/platform/darwin/ios/ios_surface_gl.mm b/shell/platform/darwin/ios/ios_surface_gl.mm
index 3565365..e114d5e 100644
--- a/shell/platform/darwin/ios/ios_surface_gl.mm
+++ b/shell/platform/darwin/ios/ios_surface_gl.mm
@@ -84,7 +84,7 @@
// |GPUSurfaceGLDelegate|
ExternalViewEmbedder* IOSSurfaceGL::GetExternalViewEmbedder() {
- return this;
+ return GetSurfaceExternalViewEmbedder().get();
}
} // namespace flutter
diff --git a/shell/platform/darwin/ios/ios_surface_metal.mm b/shell/platform/darwin/ios/ios_surface_metal.mm
index e7e4d12..ee240bd 100644
--- a/shell/platform/darwin/ios/ios_surface_metal.mm
+++ b/shell/platform/darwin/ios/ios_surface_metal.mm
@@ -55,7 +55,7 @@
// |GPUSurfaceDelegate|
ExternalViewEmbedder* IOSSurfaceMetal::GetExternalViewEmbedder() {
- return this;
+ return GetSurfaceExternalViewEmbedder().get();
}
} // namespace flutter
diff --git a/shell/platform/darwin/ios/ios_surface_software.mm b/shell/platform/darwin/ios/ios_surface_software.mm
index 1363bfe..7b5c2ee 100644
--- a/shell/platform/darwin/ios/ios_surface_software.mm
+++ b/shell/platform/darwin/ios/ios_surface_software.mm
@@ -124,7 +124,7 @@
// |GPUSurfaceSoftwareDelegate|
ExternalViewEmbedder* IOSSurfaceSoftware::GetExternalViewEmbedder() {
- return this;
+ return GetSurfaceExternalViewEmbedder().get();
}
} // namespace flutter