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/RCTBridge+Private.h>
#import <React/RCTImageLoader.h>
#import <React/RCTImageLoaderWithAttributionProtocol.h>
#import <React/RCTSurfacePresenter.h>
#import <React/RCTSurfacePresenterStub.h>
@ -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<RCTImageLoaderWithAttributionProtocol>)imageLoader));
return contextContainer;
}

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

@ -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<ImageLocalData>(imageSource, std::move(imageRequest));
setLocalData(imageLocalData);

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

@ -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<SliderLocalData>(
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);
}

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

@ -9,6 +9,7 @@
#include <memory>
#include <react/core/ReactPrimitives.h>
#include <react/imagemanager/ImageRequest.h>
#include <react/imagemanager/primitives.h>
#include <react/utils/ContextContainer.h>
@ -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_;

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

@ -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);
}

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

@ -7,7 +7,7 @@
#include "ImageManager.h"
#import <React/RCTImageLoader.h>
#import <React/RCTImageLoaderWithAttributionProtocol.h>
#import <react/utils/ManagedObjectWrapper.h>
#import "RCTImageManager.h"
@ -17,8 +17,9 @@ namespace react {
ImageManager::ImageManager(ContextContainer::Shared const &contextContainer)
{
RCTImageLoader *imageLoader =
(RCTImageLoader *)unwrapManagedObject(contextContainer->at<std::shared_ptr<void>>("RCTImageLoader"));
id<RCTImageLoaderWithAttributionProtocol> imageLoader =
(id<RCTImageLoaderWithAttributionProtocol>)unwrapManagedObject(
contextContainer->at<std::shared_ptr<void>>("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

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

@ -7,21 +7,23 @@
#import <UIKit/UIKit.h>
#import <react/core/ReactPrimitives.h>
#import <react/imagemanager/ImageRequest.h>
#import <react/imagemanager/primitives.h>
NS_ASSUME_NONNULL_BEGIN
@class RCTImageLoader;
@protocol RCTImageLoaderWithAttributionProtocol;
/**
* iOS-specific ImageManager.
*/
@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

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

@ -11,7 +11,7 @@
#import <react/utils/ManagedObjectWrapper.h>
#import <react/utils/SharedFunction.h>
#import <React/RCTImageLoader.h>
#import <React/RCTImageLoaderWithAttributionProtocol.h>
#import <react/imagemanager/ImageResponse.h>
#import <react/imagemanager/ImageResponseObserver.h>
@ -20,11 +20,11 @@
using namespace facebook::react;
@implementation RCTImageManager {
RCTImageLoader *_imageLoader;
id<RCTImageLoaderWithAttributionProtocol> _imageLoader;
dispatch_queue_t _backgroundSerialQueue;
}
- (instancetype)initWithImageLoader:(RCTImageLoader *)imageLoader
- (instancetype)initWithImageLoader:(id<RCTImageLoaderWithAttributionProtocol>)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];