diff --git a/flow/embedded_views.h b/flow/embedded_views.h index d320504d29f63..50d09ed928859 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -183,6 +183,10 @@ class ExternalViewEmbedder { public: ExternalViewEmbedder() = default; + // This will return true after pre-roll if any of the embedded views + // have mutated for last layer tree. + virtual bool HasPendingViewOperations() = 0; + virtual void BeginFrame(SkISize frame_size) = 0; virtual void PrerollCompositeEmbeddedView( diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index b717e41e00a3c..aa2e2ab0bf4b3 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -160,6 +160,13 @@ frame_size_ = frame_size; } +bool FlutterPlatformViewsController::HasPendingViewOperations() { + if (!views_to_recomposite_.empty()) { + return true; + } + return active_composition_order_ != composition_order_; +} + void FlutterPlatformViewsController::PrerollCompositeEmbeddedView( int view_id, std::unique_ptr params) { diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index 9f04de5e0bfca..40ea6333dff23 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -79,6 +79,8 @@ class FlutterPlatformViewsController { void SetFrameSize(SkISize frame_size); + bool HasPendingViewOperations(); + void PrerollCompositeEmbeddedView(int view_id, std::unique_ptr params); diff --git a/shell/platform/darwin/ios/ios_surface_gl.h b/shell/platform/darwin/ios/ios_surface_gl.h index c337b896517f6..8999669c6a0a9 100644 --- a/shell/platform/darwin/ios/ios_surface_gl.h +++ b/shell/platform/darwin/ios/ios_surface_gl.h @@ -51,6 +51,9 @@ class IOSSurfaceGL final : public IOSSurface, // |GPUSurfaceGLDelegate| flutter::ExternalViewEmbedder* GetExternalViewEmbedder() override; + // |flutter::ExternalViewEmbedder| + bool HasPendingViewOperations() override; + // |flutter::ExternalViewEmbedder| void BeginFrame(SkISize frame_size) override; diff --git a/shell/platform/darwin/ios/ios_surface_gl.mm b/shell/platform/darwin/ios/ios_surface_gl.mm index e2f4135e342bf..5f4185a07bf69 100644 --- a/shell/platform/darwin/ios/ios_surface_gl.mm +++ b/shell/platform/darwin/ios/ios_surface_gl.mm @@ -82,6 +82,12 @@ } } +bool IOSSurfaceGL::HasPendingViewOperations() { + FlutterPlatformViewsController* platform_views_controller = GetPlatformViewsController(); + FML_CHECK(platform_views_controller != nullptr); + return platform_views_controller->HasPendingViewOperations(); +} + void IOSSurfaceGL::BeginFrame(SkISize frame_size) { FlutterPlatformViewsController* platform_views_controller = GetPlatformViewsController(); FML_CHECK(platform_views_controller != nullptr); diff --git a/shell/platform/darwin/ios/ios_surface_software.h b/shell/platform/darwin/ios/ios_surface_software.h index a4c2dd9af6764..7b0c2a0b0db9c 100644 --- a/shell/platform/darwin/ios/ios_surface_software.h +++ b/shell/platform/darwin/ios/ios_surface_software.h @@ -45,6 +45,9 @@ class IOSSurfaceSoftware final : public IOSSurface, // |GPUSurfaceSoftwareDelegate| flutter::ExternalViewEmbedder* GetExternalViewEmbedder() override; + // |flutter::ExternalViewEmbedder| + bool HasPendingViewOperations() override; + // |flutter::ExternalViewEmbedder| void BeginFrame(SkISize frame_size) override; diff --git a/shell/platform/darwin/ios/ios_surface_software.mm b/shell/platform/darwin/ios/ios_surface_software.mm index 289785a200374..2977ed792c34c 100644 --- a/shell/platform/darwin/ios/ios_surface_software.mm +++ b/shell/platform/darwin/ios/ios_surface_software.mm @@ -135,6 +135,12 @@ } } +bool IOSSurfaceSoftware::HasPendingViewOperations() { + FlutterPlatformViewsController* platform_views_controller = GetPlatformViewsController(); + FML_CHECK(platform_views_controller != nullptr); + return platform_views_controller->HasPendingViewOperations(); +} + void IOSSurfaceSoftware::BeginFrame(SkISize frame_size) { FlutterPlatformViewsController* platform_views_controller = GetPlatformViewsController(); FML_CHECK(platform_views_controller != nullptr);