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/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];
|
||||||
|
|
Загрузка…
Ссылка в новой задаче