diff --git a/React/Fabric/RCTSurfacePresenterBridgeAdapter.mm b/React/Fabric/RCTSurfacePresenterBridgeAdapter.mm index 4d5eefdee6..3a97f969a2 100644 --- a/React/Fabric/RCTSurfacePresenterBridgeAdapter.mm +++ b/React/Fabric/RCTSurfacePresenterBridgeAdapter.mm @@ -13,6 +13,7 @@ #import #import #import +#import #import #import @@ -36,7 +37,7 @@ static ContextContainer::Shared RCTContextContainerFromBridge(RCTBridge *bridge) : [bridge moduleForClass:[RCTImageLoader class]]; contextContainer->insert("Bridge", wrapManagedObjectWeakly(bridge)); - contextContainer->insert("RCTImageLoader", wrapManagedObject(imageLoader)); + contextContainer->insert("RCTImageLoader", wrapManagedObject((id)imageLoader)); return contextContainer; } diff --git a/ReactCommon/fabric/components/image/ImageShadowNode.cpp b/ReactCommon/fabric/components/image/ImageShadowNode.cpp index 97cd893e9a..52f1fadb0b 100644 --- a/ReactCommon/fabric/components/image/ImageShadowNode.cpp +++ b/ReactCommon/fabric/components/image/ImageShadowNode.cpp @@ -39,7 +39,7 @@ void ImageShadowNode::updateLocalData() { // Now we are about to mutate the Shadow Node. ensureUnsealed(); - auto imageRequest = imageManager_->requestImage(imageSource); + auto imageRequest = imageManager_->requestImage(imageSource, getSurfaceId()); auto imageLocalData = std::make_shared(imageSource, std::move(imageRequest)); setLocalData(imageLocalData); diff --git a/ReactCommon/fabric/components/slider/SliderShadowNode.cpp b/ReactCommon/fabric/components/slider/SliderShadowNode.cpp index 2d54b497fc..780a1cdd23 100644 --- a/ReactCommon/fabric/components/slider/SliderShadowNode.cpp +++ b/ReactCommon/fabric/components/slider/SliderShadowNode.cpp @@ -63,13 +63,13 @@ void SliderShadowNode::updateLocalData() { // TODO: check if multiple requests are cached or if it's a net loss const auto &newLocalData = std::make_shared( newTrackImageSource, - imageManager_->requestImage(newTrackImageSource), + imageManager_->requestImage(newTrackImageSource, getSurfaceId()), newMinimumTrackImageSource, - imageManager_->requestImage(newMinimumTrackImageSource), + imageManager_->requestImage(newMinimumTrackImageSource, getSurfaceId()), newMaximumTrackImageSource, - imageManager_->requestImage(newMaximumTrackImageSource), + imageManager_->requestImage(newMaximumTrackImageSource, getSurfaceId()), newThumbImageSource, - imageManager_->requestImage(newThumbImageSource)); + imageManager_->requestImage(newThumbImageSource, getSurfaceId())); setLocalData(newLocalData); } diff --git a/ReactCommon/fabric/imagemanager/ImageManager.h b/ReactCommon/fabric/imagemanager/ImageManager.h index b12c54694e..704451052b 100644 --- a/ReactCommon/fabric/imagemanager/ImageManager.h +++ b/ReactCommon/fabric/imagemanager/ImageManager.h @@ -9,6 +9,7 @@ #include +#include #include #include #include @@ -28,7 +29,8 @@ class ImageManager { ImageManager(ContextContainer::Shared const &contextContainer); ~ImageManager(); - ImageRequest requestImage(const ImageSource &imageSource) const; + ImageRequest requestImage(const ImageSource &imageSource, SurfaceId surfaceId) + const; private: void *self_; diff --git a/ReactCommon/fabric/imagemanager/platform/cxx/ImageManager.cpp b/ReactCommon/fabric/imagemanager/platform/cxx/ImageManager.cpp index 87c93f7a62..7a4b8211f2 100644 --- a/ReactCommon/fabric/imagemanager/platform/cxx/ImageManager.cpp +++ b/ReactCommon/fabric/imagemanager/platform/cxx/ImageManager.cpp @@ -20,7 +20,9 @@ ImageManager::~ImageManager() { // Not implemented. } -ImageRequest ImageManager::requestImage(const ImageSource &imageSource) const { +ImageRequest ImageManager::requestImage( + const ImageSource &imageSource, + SurfaceId surfaceId) const { // Not implemented. return ImageRequest(imageSource); } diff --git a/ReactCommon/fabric/imagemanager/platform/ios/ImageManager.mm b/ReactCommon/fabric/imagemanager/platform/ios/ImageManager.mm index fa069232a5..b6183ab2e2 100644 --- a/ReactCommon/fabric/imagemanager/platform/ios/ImageManager.mm +++ b/ReactCommon/fabric/imagemanager/platform/ios/ImageManager.mm @@ -7,7 +7,7 @@ #include "ImageManager.h" -#import +#import #import #import "RCTImageManager.h" @@ -17,8 +17,9 @@ namespace react { ImageManager::ImageManager(ContextContainer::Shared const &contextContainer) { - RCTImageLoader *imageLoader = - (RCTImageLoader *)unwrapManagedObject(contextContainer->at>("RCTImageLoader")); + id imageLoader = + (id)unwrapManagedObject( + contextContainer->at>("RCTImageLoader")); self_ = (__bridge_retained void *)[[RCTImageManager alloc] initWithImageLoader:imageLoader]; } @@ -28,10 +29,10 @@ ImageManager::~ImageManager() self_ = nullptr; } -ImageRequest ImageManager::requestImage(const ImageSource &imageSource) const +ImageRequest ImageManager::requestImage(const ImageSource &imageSource, SurfaceId surfaceId) const { RCTImageManager *imageManager = (__bridge RCTImageManager *)self_; - return [imageManager requestImage:imageSource]; + return [imageManager requestImage:imageSource surfaceId:surfaceId]; } } // namespace react diff --git a/ReactCommon/fabric/imagemanager/platform/ios/RCTImageManager.h b/ReactCommon/fabric/imagemanager/platform/ios/RCTImageManager.h index ebba6a12bb..7a8303d6af 100644 --- a/ReactCommon/fabric/imagemanager/platform/ios/RCTImageManager.h +++ b/ReactCommon/fabric/imagemanager/platform/ios/RCTImageManager.h @@ -7,21 +7,23 @@ #import +#import #import #import NS_ASSUME_NONNULL_BEGIN -@class RCTImageLoader; +@protocol RCTImageLoaderWithAttributionProtocol; /** * iOS-specific ImageManager. */ @interface RCTImageManager : NSObject -- (instancetype)initWithImageLoader:(RCTImageLoader *)imageLoader; +- (instancetype)initWithImageLoader:(id)imageLoader; -- (facebook::react::ImageRequest)requestImage:(facebook::react::ImageSource)imageSource; +- (facebook::react::ImageRequest)requestImage:(facebook::react::ImageSource)imageSource + surfaceId:(facebook::react::SurfaceId)surfaceId; @end diff --git a/ReactCommon/fabric/imagemanager/platform/ios/RCTImageManager.mm b/ReactCommon/fabric/imagemanager/platform/ios/RCTImageManager.mm index 8bf059b027..1f5fdd5d4d 100644 --- a/ReactCommon/fabric/imagemanager/platform/ios/RCTImageManager.mm +++ b/ReactCommon/fabric/imagemanager/platform/ios/RCTImageManager.mm @@ -11,7 +11,7 @@ #import #import -#import +#import #import #import @@ -20,11 +20,11 @@ using namespace facebook::react; @implementation RCTImageManager { - RCTImageLoader *_imageLoader; + id _imageLoader; dispatch_queue_t _backgroundSerialQueue; } -- (instancetype)initWithImageLoader:(RCTImageLoader *)imageLoader +- (instancetype)initWithImageLoader:(id)imageLoader { if (self = [super init]) { _imageLoader = imageLoader; @@ -35,7 +35,7 @@ using namespace facebook::react; return self; } -- (ImageRequest)requestImage:(ImageSource)imageSource +- (ImageRequest)requestImage:(ImageSource)imageSource surfaceId:(SurfaceId)surfaceId { SystraceSection s("RCTImageManager::requestImage"); @@ -87,6 +87,9 @@ using namespace facebook::react; scale:imageSource.scale clipped:YES resizeMode:RCTResizeModeStretch + attribution:{ + .surfaceId = surfaceId, + } progressBlock:progressBlock partialLoadBlock:nil completionBlock:completionBlock];