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:
Родитель
fdcdca4cfa
Коммит
13a9a03203
|
@ -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];
|
||||
|
|
Загрузка…
Ссылка в новой задаче