Revert "Revert "reland "Migrate darwin common "framework_shared" target to ARC #37049" (#37219)" (#37320)" (#37883)
This reverts commit cf22fc23f6b54d28b767708685d92154f8aefd68.
diff --git a/shell/platform/darwin/BUILD.gn b/shell/platform/darwin/BUILD.gn
index 23c8e40..f11a8b7 100644
--- a/shell/platform/darwin/BUILD.gn
+++ b/shell/platform/darwin/BUILD.gn
@@ -26,6 +26,20 @@
sources = [
"common/buffer_conversions.h",
"common/buffer_conversions.mm",
+ ]
+
+ deps = [ "//flutter/fml" ]
+
+ public_deps = [ ":flutter_channels_arc" ]
+
+ public_configs = [ "//flutter:config" ]
+}
+
+source_set("flutter_channels_arc") {
+ cflags_objc = flutter_cflags_objc_arc
+ cflags_objcc = flutter_cflags_objcc_arc
+
+ sources = [
"common/framework/Headers/FlutterBinaryMessenger.h",
"common/framework/Headers/FlutterChannels.h",
"common/framework/Headers/FlutterCodecs.h",
@@ -36,13 +50,12 @@
"common/framework/Source/FlutterStandardCodec_Internal.h",
]
- deps = [
- "//flutter/common",
- "//flutter/flow",
- "//flutter/fml",
- "//flutter/runtime",
- "//flutter/shell/common",
- "//third_party/skia",
+ public = [
+ "common/framework/Headers/FlutterBinaryMessenger.h",
+ "common/framework/Headers/FlutterChannels.h",
+ "common/framework/Headers/FlutterCodecs.h",
+ "common/framework/Headers/FlutterMacros.h",
+ "common/framework/Source/FlutterStandardCodec_Internal.h",
]
public_configs = [ "//flutter:config" ]
diff --git a/shell/platform/darwin/common/BUILD.gn b/shell/platform/darwin/common/BUILD.gn
index 45a9e30..72e3a80 100644
--- a/shell/platform/darwin/common/BUILD.gn
+++ b/shell/platform/darwin/common/BUILD.gn
@@ -16,15 +16,7 @@
"command_line.mm",
]
- deps = [
- "//flutter/common",
- "//flutter/flow",
- "//flutter/fml",
- "//flutter/runtime",
- "//flutter/shell/common",
- "//third_party/dart/runtime:dart_api",
- "//third_party/skia",
- ]
+ deps = [ "//flutter/fml" ]
public_configs = [ "//flutter:config" ]
}
@@ -38,8 +30,8 @@
# Framework code shared between iOS and macOS.
source_set("framework_shared") {
- cflags_objc = flutter_cflags_objc
- cflags_objcc = flutter_cflags_objcc
+ cflags_objc = flutter_cflags_objc_arc
+ cflags_objcc = flutter_cflags_objcc_arc
sources = [
"framework/Source/FlutterChannels.mm",
diff --git a/shell/platform/darwin/common/framework/Headers/FlutterCodecs.h b/shell/platform/darwin/common/framework/Headers/FlutterCodecs.h
index 3ba5d4e..f7117f0 100644
--- a/shell/platform/darwin/common/framework/Headers/FlutterCodecs.h
+++ b/shell/platform/darwin/common/framework/Headers/FlutterCodecs.h
@@ -344,17 +344,17 @@
/**
* The type of the encoded values.
*/
-@property(readonly, nonatomic) FlutterStandardDataType type;
+@property(readonly, nonatomic, assign) FlutterStandardDataType type;
/**
* The number of value items encoded.
*/
-@property(readonly, nonatomic) UInt32 elementCount;
+@property(readonly, nonatomic, assign) UInt32 elementCount;
/**
* The number of bytes used by the encoding of a single value item.
*/
-@property(readonly, nonatomic) UInt8 elementSize;
+@property(readonly, nonatomic, assign) UInt8 elementSize;
@end
/**
diff --git a/shell/platform/darwin/common/framework/Source/FlutterChannels.mm b/shell/platform/darwin/common/framework/Source/FlutterChannels.mm
index 30b306a..f360144 100644
--- a/shell/platform/darwin/common/framework/Source/FlutterChannels.mm
+++ b/shell/platform/darwin/common/framework/Source/FlutterChannels.mm
@@ -4,6 +4,8 @@
#import "flutter/shell/platform/darwin/common/framework/Headers/FlutterChannels.h"
+FLUTTER_ASSERT_ARC
+
#pragma mark - Basic message channel
static NSString* const kFlutterChannelBuffersChannel = @"dev.flutter/channel-buffers";
@@ -51,9 +53,9 @@
+ (instancetype)messageChannelWithName:(NSString*)name
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
codec:(NSObject<FlutterMessageCodec>*)codec {
- return [[[FlutterBasicMessageChannel alloc] initWithName:name
- binaryMessenger:messenger
- codec:codec] autorelease];
+ return [[FlutterBasicMessageChannel alloc] initWithName:name
+ binaryMessenger:messenger
+ codec:codec];
}
- (instancetype)initWithName:(NSString*)name
@@ -69,21 +71,13 @@
taskQueue:(NSObject<FlutterTaskQueue>*)taskQueue {
self = [super init];
NSAssert(self, @"Super init cannot be nil");
- _name = [name retain];
- _messenger = [messenger retain];
- _codec = [codec retain];
- _taskQueue = [taskQueue retain];
+ _name = [name copy];
+ _messenger = messenger;
+ _codec = codec;
+ _taskQueue = taskQueue;
return self;
}
-- (void)dealloc {
- [_name release];
- [_messenger release];
- [_codec release];
- [_taskQueue release];
- [super dealloc];
-}
-
- (void)sendMessage:(id)message {
[_messenger sendOnChannel:_name message:[_codec encode:message]];
}
@@ -107,7 +101,10 @@
}
return;
}
+
// Grab reference to avoid retain on self.
+ // `self` might be released before the block, so the block needs to retain the codec to
+ // make sure it is not released with `self`
NSObject<FlutterMessageCodec>* codec = _codec;
FlutterBinaryMessageHandler messageHandler = ^(NSData* message, FlutterBinaryReply callback) {
handler([codec decode:message], ^(id reply) {
@@ -128,26 +125,19 @@
////////////////////////////////////////////////////////////////////////////////
@implementation FlutterError
+ (instancetype)errorWithCode:(NSString*)code message:(NSString*)message details:(id)details {
- return [[[FlutterError alloc] initWithCode:code message:message details:details] autorelease];
+ return [[FlutterError alloc] initWithCode:code message:message details:details];
}
- (instancetype)initWithCode:(NSString*)code message:(NSString*)message details:(id)details {
NSAssert(code, @"Code cannot be nil");
self = [super init];
NSAssert(self, @"Super init cannot be nil");
- _code = [code retain];
- _message = [message retain];
- _details = [details retain];
+ _code = [code copy];
+ _message = [message copy];
+ _details = details;
return self;
}
-- (void)dealloc {
- [_code release];
- [_message release];
- [_details release];
- [super dealloc];
-}
-
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
@@ -169,24 +159,18 @@
////////////////////////////////////////////////////////////////////////////////
@implementation FlutterMethodCall
+ (instancetype)methodCallWithMethodName:(NSString*)method arguments:(id)arguments {
- return [[[FlutterMethodCall alloc] initWithMethodName:method arguments:arguments] autorelease];
+ return [[FlutterMethodCall alloc] initWithMethodName:method arguments:arguments];
}
- (instancetype)initWithMethodName:(NSString*)method arguments:(id)arguments {
NSAssert(method, @"Method name cannot be nil");
self = [super init];
NSAssert(self, @"Super init cannot be nil");
- _method = [method retain];
- _arguments = [arguments retain];
+ _method = [method copy];
+ _arguments = arguments;
return self;
}
-- (void)dealloc {
- [_method release];
- [_arguments release];
- [super dealloc];
-}
-
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
@@ -224,8 +208,7 @@
+ (instancetype)methodChannelWithName:(NSString*)name
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
codec:(NSObject<FlutterMethodCodec>*)codec {
- return [[[FlutterMethodChannel alloc] initWithName:name binaryMessenger:messenger
- codec:codec] autorelease];
+ return [[FlutterMethodChannel alloc] initWithName:name binaryMessenger:messenger codec:codec];
}
- (instancetype)initWithName:(NSString*)name
@@ -240,21 +223,13 @@
taskQueue:(NSObject<FlutterTaskQueue>*)taskQueue {
self = [super init];
NSAssert(self, @"Super init cannot be nil");
- _name = [name retain];
- _messenger = [messenger retain];
- _codec = [codec retain];
- _taskQueue = [taskQueue retain];
+ _name = [name copy];
+ _messenger = messenger;
+ _codec = codec;
+ _taskQueue = taskQueue;
return self;
}
-- (void)dealloc {
- [_name release];
- [_messenger release];
- [_codec release];
- [_taskQueue release];
- [super dealloc];
-}
-
- (void)invokeMethod:(NSString*)method arguments:(id)arguments {
FlutterMethodCall* methodCall = [FlutterMethodCall methodCallWithMethodName:method
arguments:arguments];
@@ -285,6 +260,8 @@
return;
}
// Make sure the block captures the codec, not self.
+ // `self` might be released before the block, so the block needs to retain the codec to
+ // make sure it is not released with `self`
NSObject<FlutterMethodCodec>* codec = _codec;
FlutterBinaryMessageHandler messageHandler = ^(NSData* message, FlutterBinaryReply callback) {
FlutterMethodCall* call = [codec decodeMethodCall:message];
@@ -328,8 +305,7 @@
+ (instancetype)eventChannelWithName:(NSString*)name
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
codec:(NSObject<FlutterMethodCodec>*)codec {
- return [[[FlutterEventChannel alloc] initWithName:name binaryMessenger:messenger
- codec:codec] autorelease];
+ return [[FlutterEventChannel alloc] initWithName:name binaryMessenger:messenger codec:codec];
}
- (instancetype)initWithName:(NSString*)name
@@ -344,21 +320,13 @@
taskQueue:(NSObject<FlutterTaskQueue>* _Nullable)taskQueue {
self = [super init];
NSAssert(self, @"Super init cannot be nil");
- _name = [name retain];
- _messenger = [messenger retain];
- _codec = [codec retain];
- _taskQueue = [taskQueue retain];
+ _name = [name copy];
+ _messenger = messenger;
+ _codec = codec;
+ _taskQueue = taskQueue;
return self;
}
-- (void)dealloc {
- [_name release];
- [_codec release];
- [_messenger release];
- [_taskQueue release];
- [super dealloc];
-}
-
static FlutterBinaryMessengerConnection SetStreamHandlerMessageHandlerOnChannel(
NSObject<FlutterStreamHandler>* handler,
NSString* name,
diff --git a/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m b/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m
index a499fbe..e2593f5 100644
--- a/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m
+++ b/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m
@@ -234,6 +234,78 @@
OCMVerify([binaryMessenger cleanUpConnection:connection]);
}
+- (void)testBasicMessageChannelInvokeHandlerAfterChannelReleased {
+ NSString* channelName = @"foo";
+ __block NSString* handlerMessage;
+ __block FlutterBinaryMessageHandler messageHandler;
+ @autoreleasepool {
+ FlutterBinaryMessengerConnection connection = 123;
+ id binaryMessenger = OCMProtocolMock(@protocol(FlutterBinaryMessenger));
+ id codec = OCMProtocolMock(@protocol(FlutterMessageCodec));
+ id taskQueue = OCMClassMock([NSObject class]);
+ FlutterBasicMessageChannel* channel =
+ [[FlutterBasicMessageChannel alloc] initWithName:channelName
+ binaryMessenger:binaryMessenger
+ codec:codec
+ taskQueue:taskQueue];
+
+ FlutterMessageHandler handler = ^(id _Nullable message, FlutterReply callback) {
+ handlerMessage = message;
+ };
+ OCMStub([binaryMessenger
+ setMessageHandlerOnChannel:channelName
+ binaryMessageHandler:[OCMArg checkWithBlock:^BOOL(
+ FlutterBinaryMessageHandler handler) {
+ messageHandler = handler;
+ return YES;
+ }]
+ taskQueue:taskQueue])
+ .andReturn(connection);
+ OCMStub([codec decode:[OCMArg any]]).andReturn(@"decoded message");
+ [channel setMessageHandler:handler];
+ }
+ // Channel is released, messageHandler should still retain the codec. The codec
+ // internally makes a `decode` call and updates the `handlerMessage` to "decoded message".
+ messageHandler([NSData data], ^(NSData* data){
+ });
+ XCTAssertEqualObjects(handlerMessage, @"decoded message");
+}
+
+- (void)testMethodChannelInvokeHandlerAfterChannelReleased {
+ NSString* channelName = @"foo";
+ FlutterBinaryMessengerConnection connection = 123;
+ __block FlutterMethodCall* decodedMethodCall;
+ __block FlutterBinaryMessageHandler messageHandler;
+ @autoreleasepool {
+ id binaryMessenger = OCMProtocolMock(@protocol(FlutterBinaryMessenger));
+ id codec = OCMProtocolMock(@protocol(FlutterMethodCodec));
+ id taskQueue = OCMClassMock([NSObject class]);
+ FlutterMethodChannel* channel = [[FlutterMethodChannel alloc] initWithName:channelName
+ binaryMessenger:binaryMessenger
+ codec:codec
+ taskQueue:taskQueue];
+ FlutterMethodCallHandler handler = ^(FlutterMethodCall* call, FlutterResult result) {
+ decodedMethodCall = call;
+ };
+ OCMStub([binaryMessenger
+ setMessageHandlerOnChannel:channelName
+ binaryMessageHandler:[OCMArg checkWithBlock:^BOOL(
+ FlutterBinaryMessageHandler handler) {
+ messageHandler = handler;
+ return YES;
+ }]
+ taskQueue:taskQueue])
+ .andReturn(connection);
+ OCMStub([codec decodeMethodCall:[OCMArg any]])
+ .andReturn([FlutterMethodCall methodCallWithMethodName:@"decoded method call"
+ arguments:nil]);
+ [channel setMethodCallHandler:handler];
+ }
+ messageHandler([NSData data], ^(NSData* data){
+ });
+ XCTAssertEqualObjects(decodedMethodCall.method, @"decoded method call");
+}
+
- (void)testMethodChannelTaskQueue {
NSString* channelName = @"foo";
FlutterBinaryMessengerConnection connection = 123;
diff --git a/shell/platform/darwin/common/framework/Source/FlutterCodecs.mm b/shell/platform/darwin/common/framework/Source/FlutterCodecs.mm
index 8ea26cc..57ef1eb 100644
--- a/shell/platform/darwin/common/framework/Source/FlutterCodecs.mm
+++ b/shell/platform/darwin/common/framework/Source/FlutterCodecs.mm
@@ -6,6 +6,8 @@
#include <cstring>
+FLUTTER_ASSERT_ARC
+
@implementation FlutterBinaryCodec
+ (instancetype)sharedInstance {
static id _sharedInstance = nil;
@@ -48,7 +50,7 @@
if (message == nil) {
return nil;
}
- return [[[NSString alloc] initWithData:message encoding:NSUTF8StringEncoding] autorelease];
+ return [[NSString alloc] initWithData:message encoding:NSUTF8StringEncoding];
}
@end
diff --git a/shell/platform/darwin/common/framework/Source/FlutterStandardCodec.mm b/shell/platform/darwin/common/framework/Source/FlutterStandardCodec.mm
index eeb3ef9..62e85e6 100644
--- a/shell/platform/darwin/common/framework/Source/FlutterStandardCodec.mm
+++ b/shell/platform/darwin/common/framework/Source/FlutterStandardCodec.mm
@@ -4,6 +4,8 @@
#import "flutter/shell/platform/darwin/common/framework/Source/FlutterStandardCodec_Internal.h"
+FLUTTER_ASSERT_ARC
+
#pragma mark - Codec for basic message channel
@implementation FlutterStandardMessageCodec {
@@ -12,29 +14,23 @@
+ (instancetype)sharedInstance {
static id _sharedInstance = nil;
if (!_sharedInstance) {
- FlutterStandardReaderWriter* readerWriter =
- [[[FlutterStandardReaderWriter alloc] init] autorelease];
+ FlutterStandardReaderWriter* readerWriter = [[FlutterStandardReaderWriter alloc] init];
_sharedInstance = [[FlutterStandardMessageCodec alloc] initWithReaderWriter:readerWriter];
}
return _sharedInstance;
}
+ (instancetype)codecWithReaderWriter:(FlutterStandardReaderWriter*)readerWriter {
- return [[[FlutterStandardMessageCodec alloc] initWithReaderWriter:readerWriter] autorelease];
+ return [[FlutterStandardMessageCodec alloc] initWithReaderWriter:readerWriter];
}
- (instancetype)initWithReaderWriter:(FlutterStandardReaderWriter*)readerWriter {
self = [super init];
NSAssert(self, @"Super init cannot be nil");
- _readerWriter = [readerWriter retain];
+ _readerWriter = readerWriter;
return self;
}
-- (void)dealloc {
- [_readerWriter release];
- [super dealloc];
-}
-
- (NSData*)encode:(id)message {
if (message == nil) {
return nil;
@@ -64,29 +60,23 @@
+ (instancetype)sharedInstance {
static id _sharedInstance = nil;
if (!_sharedInstance) {
- FlutterStandardReaderWriter* readerWriter =
- [[[FlutterStandardReaderWriter alloc] init] autorelease];
+ FlutterStandardReaderWriter* readerWriter = [[FlutterStandardReaderWriter alloc] init];
_sharedInstance = [[FlutterStandardMethodCodec alloc] initWithReaderWriter:readerWriter];
}
return _sharedInstance;
}
+ (instancetype)codecWithReaderWriter:(FlutterStandardReaderWriter*)readerWriter {
- return [[[FlutterStandardMethodCodec alloc] initWithReaderWriter:readerWriter] autorelease];
+ return [[FlutterStandardMethodCodec alloc] initWithReaderWriter:readerWriter];
}
- (instancetype)initWithReaderWriter:(FlutterStandardReaderWriter*)readerWriter {
self = [super init];
NSAssert(self, @"Super init cannot be nil");
- _readerWriter = [readerWriter retain];
+ _readerWriter = readerWriter;
return self;
}
-- (void)dealloc {
- [_readerWriter release];
- [super dealloc];
-}
-
- (NSData*)encodeMethodCall:(FlutterMethodCall*)call {
NSMutableData* data = [NSMutableData dataWithCapacity:32];
FlutterStandardWriter* writer = [_readerWriter writerWithData:data];
@@ -173,7 +163,7 @@
}
+ (instancetype)typedDataWithData:(NSData*)data type:(FlutterStandardDataType)type {
- return [[[FlutterStandardTypedData alloc] initWithData:data type:type] autorelease];
+ return [[FlutterStandardTypedData alloc] initWithData:data type:type];
}
- (instancetype)initWithData:(NSData*)data type:(FlutterStandardDataType)type {
@@ -182,18 +172,13 @@
NSAssert(data.length % elementSize == 0, @"Data must contain integral number of elements");
self = [super init];
NSAssert(self, @"Super init cannot be nil");
- _data = [data retain];
+ _data = [data copy];
_type = type;
_elementSize = elementSize;
_elementCount = data.length / elementSize;
return self;
}
-- (void)dealloc {
- [_data release];
- [super dealloc];
-}
-
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
@@ -220,15 +205,10 @@
- (instancetype)initWithData:(NSMutableData*)data {
self = [super init];
NSAssert(self, @"Super init cannot be nil");
- _data = [data retain];
+ _data = data;
return self;
}
-- (void)dealloc {
- [_data release];
- [super dealloc];
-}
-
- (void)writeByte:(UInt8)value {
[_data appendBytes:&value length:1];
}
@@ -273,7 +253,7 @@
if (value == nil || value == [NSNull null]) {
[self writeByte:FlutterStandardFieldNil];
} else if ([value isKindOfClass:[NSNumber class]]) {
- CFNumberRef number = (CFNumberRef)value;
+ CFNumberRef number = (__bridge CFNumberRef)value;
BOOL success = NO;
if (CFGetTypeID(number) == CFBooleanGetTypeID()) {
BOOL b = CFBooleanGetValue((CFBooleanRef)number);
@@ -348,16 +328,11 @@
- (instancetype)initWithData:(NSData*)data {
self = [super init];
NSAssert(self, @"Super init cannot be nil");
- _data = [data retain];
+ _data = [data copy];
_range = NSMakeRange(0, 0);
return self;
}
-- (void)dealloc {
- [_data release];
- [super dealloc];
-}
-
- (BOOL)hasMore {
return _range.location < _data.length;
}
@@ -398,7 +373,7 @@
- (NSString*)readUTF8 {
NSData* bytes = [self readData:[self readSize]];
- return [[[NSString alloc] initWithData:bytes encoding:NSUTF8StringEncoding] autorelease];
+ return [[NSString alloc] initWithData:bytes encoding:NSUTF8StringEncoding];
}
- (void)readAlignment:(UInt8)alignment {
@@ -482,10 +457,10 @@
@implementation FlutterStandardReaderWriter
- (FlutterStandardWriter*)writerWithData:(NSMutableData*)data {
- return [[[FlutterStandardWriter alloc] initWithData:data] autorelease];
+ return [[FlutterStandardWriter alloc] initWithData:data];
}
- (FlutterStandardReader*)readerWithData:(NSData*)data {
- return [[[FlutterStandardReader alloc] initWithData:data] autorelease];
+ return [[FlutterStandardReader alloc] initWithData:data];
}
@end
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterRestorationPluginTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterRestorationPluginTest.mm
index 36de96d..d61a29e 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterRestorationPluginTest.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterRestorationPluginTest.mm
@@ -80,7 +80,7 @@
[restorationPlugin setRestorationData:data];
XCTAssertEqual([capturedResult count], 2u);
XCTAssertEqual([capturedResult objectForKey:@"enabled"], @YES);
- XCTAssertEqual([[capturedResult objectForKey:@"data"] data], data);
+ XCTAssertEqualObjects([[capturedResult objectForKey:@"data"] data], data);
}
- (void)testRestorationDisabledRespondsRightAway {
@@ -112,7 +112,7 @@
}];
XCTAssertEqual([capturedResult count], 2u);
XCTAssertEqual([capturedResult objectForKey:@"enabled"], @YES);
- XCTAssertEqual([[capturedResult objectForKey:@"data"] data], data);
+ XCTAssertEqualObjects([[capturedResult objectForKey:@"data"] data], data);
}
- (void)testRespondsWithNoDataWhenRestorationIsCompletedWithoutData {
@@ -161,7 +161,7 @@
result:^(id _Nullable result) {
XCTAssertNil(result);
}];
- XCTAssertEqual([restorationPlugin restorationData], data);
+ XCTAssertEqualObjects([restorationPlugin restorationData], data);
}
- (void)testRespondsWithDataSetByFramework {
@@ -177,7 +177,7 @@
result:^(id _Nullable result) {
XCTAssertNil(result);
}];
- XCTAssertEqual([restorationPlugin restorationData], data);
+ XCTAssertEqualObjects([restorationPlugin restorationData], data);
__block id capturedResult;
methodCall = [FlutterMethodCall methodCallWithMethodName:@"get" arguments:nil];
@@ -187,7 +187,7 @@
}];
XCTAssertEqual([capturedResult count], 2u);
XCTAssertEqual([capturedResult objectForKey:@"enabled"], @YES);
- XCTAssertEqual([[capturedResult objectForKey:@"data"] data], data);
+ XCTAssertEqualObjects([[capturedResult objectForKey:@"data"] data], data);
}
- (void)testResetClearsData {
@@ -203,7 +203,7 @@
result:^(id _Nullable result) {
XCTAssertNil(result);
}];
- XCTAssertEqual([restorationPlugin restorationData], data);
+ XCTAssertEqualObjects([restorationPlugin restorationData], data);
[restorationPlugin reset];
XCTAssertNil([restorationPlugin restorationData]);