Fabric iOS: pass in surfaceId when requesting to download image

Summary:
Changelog: [Internal]

For attribution purpose, pass in the surfaceId and let the app-specific image loader handle it.

Reviewed By: shergin

Differential Revision: D18494106

fbshipit-source-id: e22ca339a2dd12c5bd619b596c7db9c49dc111d0
This commit is contained in:
Kevin Gozali 2019-11-16 00:10:25 -08:00 коммит произвёл Facebook Github Bot
Родитель fdcdca4cfa
Коммит 13a9a03203
8 изменённых файлов: 31 добавлений и 20 удалений

Просмотреть файл

@ -13,6 +13,7 @@
#import <React/RCTAssert.h> #import <React/RCTAssert.h>
#import <React/RCTBridge+Private.h> #import <React/RCTBridge+Private.h>
#import <React/RCTImageLoader.h> #import <React/RCTImageLoader.h>
#import <React/RCTImageLoaderWithAttributionProtocol.h>
#import <React/RCTSurfacePresenter.h> #import <React/RCTSurfacePresenter.h>
#import <React/RCTSurfacePresenterStub.h> #import <React/RCTSurfacePresenterStub.h>
@ -36,7 +37,7 @@ static ContextContainer::Shared RCTContextContainerFromBridge(RCTBridge *bridge)
: [bridge moduleForClass:[RCTImageLoader class]]; : [bridge moduleForClass:[RCTImageLoader class]];
contextContainer->insert("Bridge", wrapManagedObjectWeakly(bridge)); contextContainer->insert("Bridge", wrapManagedObjectWeakly(bridge));
contextContainer->insert("RCTImageLoader", wrapManagedObject(imageLoader)); contextContainer->insert("RCTImageLoader", wrapManagedObject((id<RCTImageLoaderWithAttributionProtocol>)imageLoader));
return contextContainer; return contextContainer;
} }

Просмотреть файл

@ -39,7 +39,7 @@ void ImageShadowNode::updateLocalData() {
// Now we are about to mutate the Shadow Node. // Now we are about to mutate the Shadow Node.
ensureUnsealed(); ensureUnsealed();
auto imageRequest = imageManager_->requestImage(imageSource); auto imageRequest = imageManager_->requestImage(imageSource, getSurfaceId());
auto imageLocalData = auto imageLocalData =
std::make_shared<ImageLocalData>(imageSource, std::move(imageRequest)); std::make_shared<ImageLocalData>(imageSource, std::move(imageRequest));
setLocalData(imageLocalData); setLocalData(imageLocalData);

Просмотреть файл

@ -63,13 +63,13 @@ void SliderShadowNode::updateLocalData() {
// TODO: check if multiple requests are cached or if it's a net loss // TODO: check if multiple requests are cached or if it's a net loss
const auto &newLocalData = std::make_shared<SliderLocalData>( const auto &newLocalData = std::make_shared<SliderLocalData>(
newTrackImageSource, newTrackImageSource,
imageManager_->requestImage(newTrackImageSource), imageManager_->requestImage(newTrackImageSource, getSurfaceId()),
newMinimumTrackImageSource, newMinimumTrackImageSource,
imageManager_->requestImage(newMinimumTrackImageSource), imageManager_->requestImage(newMinimumTrackImageSource, getSurfaceId()),
newMaximumTrackImageSource, newMaximumTrackImageSource,
imageManager_->requestImage(newMaximumTrackImageSource), imageManager_->requestImage(newMaximumTrackImageSource, getSurfaceId()),
newThumbImageSource, newThumbImageSource,
imageManager_->requestImage(newThumbImageSource)); imageManager_->requestImage(newThumbImageSource, getSurfaceId()));
setLocalData(newLocalData); setLocalData(newLocalData);
} }

Просмотреть файл

@ -9,6 +9,7 @@
#include <memory> #include <memory>
#include <react/core/ReactPrimitives.h>
#include <react/imagemanager/ImageRequest.h> #include <react/imagemanager/ImageRequest.h>
#include <react/imagemanager/primitives.h> #include <react/imagemanager/primitives.h>
#include <react/utils/ContextContainer.h> #include <react/utils/ContextContainer.h>
@ -28,7 +29,8 @@ class ImageManager {
ImageManager(ContextContainer::Shared const &contextContainer); ImageManager(ContextContainer::Shared const &contextContainer);
~ImageManager(); ~ImageManager();
ImageRequest requestImage(const ImageSource &imageSource) const; ImageRequest requestImage(const ImageSource &imageSource, SurfaceId surfaceId)
const;
private: private:
void *self_; void *self_;

Просмотреть файл

@ -20,7 +20,9 @@ ImageManager::~ImageManager() {
// Not implemented. // Not implemented.
} }
ImageRequest ImageManager::requestImage(const ImageSource &imageSource) const { ImageRequest ImageManager::requestImage(
const ImageSource &imageSource,
SurfaceId surfaceId) const {
// Not implemented. // Not implemented.
return ImageRequest(imageSource); return ImageRequest(imageSource);
} }

Просмотреть файл

@ -7,7 +7,7 @@
#include "ImageManager.h" #include "ImageManager.h"
#import <React/RCTImageLoader.h> #import <React/RCTImageLoaderWithAttributionProtocol.h>
#import <react/utils/ManagedObjectWrapper.h> #import <react/utils/ManagedObjectWrapper.h>
#import "RCTImageManager.h" #import "RCTImageManager.h"
@ -17,8 +17,9 @@ namespace react {
ImageManager::ImageManager(ContextContainer::Shared const &contextContainer) ImageManager::ImageManager(ContextContainer::Shared const &contextContainer)
{ {
RCTImageLoader *imageLoader = id<RCTImageLoaderWithAttributionProtocol> imageLoader =
(RCTImageLoader *)unwrapManagedObject(contextContainer->at<std::shared_ptr<void>>("RCTImageLoader")); (id<RCTImageLoaderWithAttributionProtocol>)unwrapManagedObject(
contextContainer->at<std::shared_ptr<void>>("RCTImageLoader"));
self_ = (__bridge_retained void *)[[RCTImageManager alloc] initWithImageLoader:imageLoader]; self_ = (__bridge_retained void *)[[RCTImageManager alloc] initWithImageLoader:imageLoader];
} }
@ -28,10 +29,10 @@ ImageManager::~ImageManager()
self_ = nullptr; self_ = nullptr;
} }
ImageRequest ImageManager::requestImage(const ImageSource &imageSource) const ImageRequest ImageManager::requestImage(const ImageSource &imageSource, SurfaceId surfaceId) const
{ {
RCTImageManager *imageManager = (__bridge RCTImageManager *)self_; RCTImageManager *imageManager = (__bridge RCTImageManager *)self_;
return [imageManager requestImage:imageSource]; return [imageManager requestImage:imageSource surfaceId:surfaceId];
} }
} // namespace react } // namespace react

Просмотреть файл

@ -7,21 +7,23 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import <react/core/ReactPrimitives.h>
#import <react/imagemanager/ImageRequest.h> #import <react/imagemanager/ImageRequest.h>
#import <react/imagemanager/primitives.h> #import <react/imagemanager/primitives.h>
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@class RCTImageLoader; @protocol RCTImageLoaderWithAttributionProtocol;
/** /**
* iOS-specific ImageManager. * iOS-specific ImageManager.
*/ */
@interface RCTImageManager : NSObject @interface RCTImageManager : NSObject
- (instancetype)initWithImageLoader:(RCTImageLoader *)imageLoader; - (instancetype)initWithImageLoader:(id<RCTImageLoaderWithAttributionProtocol>)imageLoader;
- (facebook::react::ImageRequest)requestImage:(facebook::react::ImageSource)imageSource; - (facebook::react::ImageRequest)requestImage:(facebook::react::ImageSource)imageSource
surfaceId:(facebook::react::SurfaceId)surfaceId;
@end @end

Просмотреть файл

@ -11,7 +11,7 @@
#import <react/utils/ManagedObjectWrapper.h> #import <react/utils/ManagedObjectWrapper.h>
#import <react/utils/SharedFunction.h> #import <react/utils/SharedFunction.h>
#import <React/RCTImageLoader.h> #import <React/RCTImageLoaderWithAttributionProtocol.h>
#import <react/imagemanager/ImageResponse.h> #import <react/imagemanager/ImageResponse.h>
#import <react/imagemanager/ImageResponseObserver.h> #import <react/imagemanager/ImageResponseObserver.h>
@ -20,11 +20,11 @@
using namespace facebook::react; using namespace facebook::react;
@implementation RCTImageManager { @implementation RCTImageManager {
RCTImageLoader *_imageLoader; id<RCTImageLoaderWithAttributionProtocol> _imageLoader;
dispatch_queue_t _backgroundSerialQueue; dispatch_queue_t _backgroundSerialQueue;
} }
- (instancetype)initWithImageLoader:(RCTImageLoader *)imageLoader - (instancetype)initWithImageLoader:(id<RCTImageLoaderWithAttributionProtocol>)imageLoader
{ {
if (self = [super init]) { if (self = [super init]) {
_imageLoader = imageLoader; _imageLoader = imageLoader;
@ -35,7 +35,7 @@ using namespace facebook::react;
return self; return self;
} }
- (ImageRequest)requestImage:(ImageSource)imageSource - (ImageRequest)requestImage:(ImageSource)imageSource surfaceId:(SurfaceId)surfaceId
{ {
SystraceSection s("RCTImageManager::requestImage"); SystraceSection s("RCTImageManager::requestImage");
@ -87,6 +87,9 @@ using namespace facebook::react;
scale:imageSource.scale scale:imageSource.scale
clipped:YES clipped:YES
resizeMode:RCTResizeModeStretch resizeMode:RCTResizeModeStretch
attribution:{
.surfaceId = surfaceId,
}
progressBlock:progressBlock progressBlock:progressBlock
partialLoadBlock:nil partialLoadBlock:nil
completionBlock:completionBlock]; completionBlock:completionBlock];