diff --git a/shell/common/rasterizer.cc b/shell/common/rasterizer.cc index 9684b4dcd9da5..b5be5e49e51eb 100644 --- a/shell/common/rasterizer.cc +++ b/shell/common/rasterizer.cc @@ -164,10 +164,9 @@ bool Rasterizer::DrawToSurface(flow::LayerTree& layer_tree) { auto external_view_embedder = surface_->GetExternalViewEmbedder(); - // TODO(amirh): uncomment this once external_view_embedder is populated. - // if (external_view_embedder != nullptr) { - // external_view_embedder->SetFrameSize(layer_tree.frame_size()); - // } + if (external_view_embedder != nullptr) { + external_view_embedder->SetFrameSize(layer_tree.frame_size()); + } auto compositor_frame = compositor_context_->AcquireFrame( surface_->GetContext(), canvas, external_view_embedder, diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterPlatformViews.h b/shell/platform/darwin/ios/framework/Headers/FlutterPlatformViews.h index a8145fa628f95..72086dec13a83 100644 --- a/shell/platform/darwin/ios/framework/Headers/FlutterPlatformViews.h +++ b/shell/platform/darwin/ios/framework/Headers/FlutterPlatformViews.h @@ -12,6 +12,16 @@ NS_ASSUME_NONNULL_BEGIN +/** + * Wraps a `UIView` for embedding in the Flutter hierarchy + */ +@protocol FlutterPlatformView +/** + * Returns a reference to the `UIView` that is wrapped by this `FlutterPlatformView`. + */ +- (UIView*)view; +@end + FLUTTER_EXPORT @protocol FlutterPlatformViewFactory /** @@ -28,9 +38,9 @@ FLUTTER_EXPORT * code, this will be null. Otherwise this will be the value sent from the Dart code as decoded by * `createArgsCodec`. */ -- (UIView*)createWithFrame:(CGRect)frame - viewIdentifier:(int64_t)viewId - arguments:(id _Nullable)args; +- (NSObject*)createWithFrame:(CGRect)frame + viewIdentifier:(int64_t)viewId + arguments:(id _Nullable)args; /** * Returns the `FlutterMessageCodec` for decoding the args parameter of `createWithFrame`. diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 20f089d6d97b7..f0b800737aa42 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -72,13 +72,17 @@ } } - UIView* embedded_view = [factory createWithFrame:CGRectZero - viewIdentifier:viewId - arguments:params]; - FlutterTouchInterceptingView* view = - [[[FlutterTouchInterceptingView alloc] initWithEmbeddedView:embedded_view + NSObject* embedded_view = [factory createWithFrame:CGRectZero + viewIdentifier:viewId + arguments:params]; + views_[viewId] = fml::scoped_nsobject>([embedded_view retain]); + + FlutterTouchInterceptingView* touch_interceptor = + [[[FlutterTouchInterceptingView alloc] initWithEmbeddedView:embedded_view.view flutterView:flutter_view_] autorelease]; - views_[viewId] = fml::scoped_nsobject([view retain]); + + touch_interceptors_[viewId] = + fml::scoped_nsobject([touch_interceptor retain]); result(nil); } @@ -94,9 +98,10 @@ return; } - UIView* view = views_[viewId].get(); - [view removeFromSuperview]; + UIView* touch_interceptor = touch_interceptors_[viewId].get(); + [touch_interceptor removeFromSuperview]; views_.erase(viewId); + touch_interceptors_.erase(viewId); overlays_.erase(viewId); result(nil); } @@ -113,7 +118,7 @@ return; } - FlutterTouchInterceptingView* view = views_[viewId].get(); + FlutterTouchInterceptingView* view = touch_interceptors_[viewId].get(); [view releaseGesture]; result(nil); @@ -159,8 +164,8 @@ CGRectMake(params.offsetPixels.x() / screenScale, params.offsetPixels.y() / screenScale, params.sizePoints.width(), params.sizePoints.height()); - UIView* view = views_[view_id].get(); - [view setFrame:rect]; + UIView* touch_interceptor = touch_interceptors_[view_id].get(); + [touch_interceptor setFrame:rect]; SkCanvas* canvas = composition_frames_[view_id]->SkiaCanvas(); canvas->clear(SK_ColorTRANSPARENT); @@ -204,7 +209,7 @@ active_composition_order_.clear(); for (size_t i = 0; i < composition_order_.size(); i++) { int view_id = composition_order_[i]; - [flutter_view addSubview:views_[view_id].get()]; + [flutter_view addSubview:touch_interceptors_[view_id].get()]; [flutter_view addSubview:overlays_[view_id]->overlay_view.get()]; active_composition_order_.push_back(view_id); } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index e3cfa4141dcf0..2e40d9c861743 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -70,7 +70,8 @@ class FlutterPlatformViewsController { fml::scoped_nsobject channel_; fml::scoped_nsobject flutter_view_; std::map>> factories_; - std::map> views_; + std::map>> views_; + std::map> touch_interceptors_; std::map> overlays_; SkISize frame_size_;