Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

[webview_flutter_wkwebview] Implements the HostApis and methods for the CookieManager. #5244

Merged
merged 4 commits into from
Apr 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,23 @@ enum WKNavigationActionPolicyEnum {
cancel,
}

enum NSHttpCookiePropertyKeyEnum {
comment,
commentUrl,
discard,
domain,
expires,
maximumAge,
name,
originUrl,
path,
port,
sameSitePolicy,
secure,
value,
version,
}

class NSKeyValueObservingOptionsEnumData {
NSKeyValueObservingOptionsEnumData({
this.value,
Expand Down Expand Up @@ -153,6 +170,29 @@ class WKWebsiteDataTypesEnumData {
}
}

class NSHttpCookiePropertyKeyEnumData {
NSHttpCookiePropertyKeyEnumData({
this.value,
});

NSHttpCookiePropertyKeyEnum? value;

Object encode() {
final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
pigeonMap['value'] = value == null ? null : value!.index;
return pigeonMap;
}

static NSHttpCookiePropertyKeyEnumData decode(Object message) {
final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
return NSHttpCookiePropertyKeyEnumData(
value: pigeonMap['value'] != null
? NSHttpCookiePropertyKeyEnum.values[pigeonMap['value']! as int]
: null,
);
}
}

class NSUrlRequestData {
NSUrlRequestData({
required this.url,
Expand Down Expand Up @@ -221,6 +261,28 @@ class WKUserScriptData {
}
}

class NSHttpCookieData {
NSHttpCookieData({
required this.properties,
});

Map<NSHttpCookiePropertyKeyEnumData?, String?> properties;

Object encode() {
final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
pigeonMap['properties'] = properties;
return pigeonMap;
}

static NSHttpCookieData decode(Object message) {
final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
return NSHttpCookieData(
properties: (pigeonMap['properties'] as Map<Object?, Object?>?)!
.cast<NSHttpCookiePropertyKeyEnumData?, String?>(),
);
}
}

class _WKWebsiteDataStoreHostApiCodec extends StandardMessageCodec {
const _WKWebsiteDataStoreHostApiCodec();
@override
Expand Down Expand Up @@ -283,6 +345,31 @@ class WKWebsiteDataStoreHostApi {
}
}

Future<void> createDefaultDataStore(int arg_instanceId) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.WKWebsiteDataStoreHostApi.createDefaultDataStore',
codec,
binaryMessenger: _binaryMessenger);
final Map<Object?, Object?>? replyMap =
await channel.send(<Object?>[arg_instanceId]) as Map<Object?, Object?>?;
if (replyMap == null) {
throw PlatformException(
code: 'channel-error',
message: 'Unable to establish connection on channel.',
);
} else if (replyMap['error'] != null) {
final Map<Object?, Object?> error =
(replyMap['error'] as Map<Object?, Object?>?)!;
throw PlatformException(
code: (error['code'] as String?)!,
message: error['message'] as String?,
details: error['details'],
);
} else {
return;
}
}

Future<bool> removeDataOfTypes(
int arg_instanceId,
List<WKWebsiteDataTypesEnumData?> arg_dataTypes,
Expand Down Expand Up @@ -1686,3 +1773,97 @@ class WKUIDelegateHostApi {
}
}
}

class _WKHttpCookieStoreHostApiCodec extends StandardMessageCodec {
const _WKHttpCookieStoreHostApiCodec();
@override
void writeValue(WriteBuffer buffer, Object? value) {
if (value is NSHttpCookieData) {
buffer.putUint8(128);
writeValue(buffer, value.encode());
} else if (value is NSHttpCookiePropertyKeyEnumData) {
buffer.putUint8(129);
writeValue(buffer, value.encode());
} else {
super.writeValue(buffer, value);
}
}

@override
Object? readValueOfType(int type, ReadBuffer buffer) {
switch (type) {
case 128:
return NSHttpCookieData.decode(readValue(buffer)!);

case 129:
return NSHttpCookiePropertyKeyEnumData.decode(readValue(buffer)!);

default:
return super.readValueOfType(type, buffer);
}
}
}

class WKHttpCookieStoreHostApi {
/// Constructor for [WKHttpCookieStoreHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
WKHttpCookieStoreHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;

final BinaryMessenger? _binaryMessenger;

static const MessageCodec<Object?> codec = _WKHttpCookieStoreHostApiCodec();

Future<void> createFromWebsiteDataStore(
int arg_instanceId, int arg_websiteDataStoreInstanceId) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.WKHttpCookieStoreHostApi.createFromWebsiteDataStore',
codec,
binaryMessenger: _binaryMessenger);
final Map<Object?, Object?>? replyMap = await channel
.send(<Object?>[arg_instanceId, arg_websiteDataStoreInstanceId])
as Map<Object?, Object?>?;
if (replyMap == null) {
throw PlatformException(
code: 'channel-error',
message: 'Unable to establish connection on channel.',
);
} else if (replyMap['error'] != null) {
final Map<Object?, Object?> error =
(replyMap['error'] as Map<Object?, Object?>?)!;
throw PlatformException(
code: (error['code'] as String?)!,
message: error['message'] as String?,
details: error['details'],
);
} else {
return;
}
}

Future<void> setCookie(
int arg_instanceId, NSHttpCookieData arg_cookie) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.WKHttpCookieStoreHostApi.setCookie', codec,
binaryMessenger: _binaryMessenger);
final Map<Object?, Object?>? replyMap = await channel
.send(<Object?>[arg_instanceId, arg_cookie]) as Map<Object?, Object?>?;
if (replyMap == null) {
throw PlatformException(
code: 'channel-error',
message: 'Unable to establish connection on channel.',
);
} else if (replyMap['error'] != null) {
final Map<Object?, Object?> error =
(replyMap['error'] as Map<Object?, Object?>?)!;
throw PlatformException(
code: (error['code'] as String?)!,
message: error['message'] as String?,
details: error['details'],
);
} else {
return;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,11 @@ class WKWebsiteDataStore {
);

factory WKWebsiteDataStore._defaultDataStore() {
throw UnimplementedError();
final WKWebsiteDataStore websiteDataStore = WKWebsiteDataStore._();
websiteDataStore._websiteDataStoreApi.createDefaultDataStoreForInstances(
websiteDataStore,
);
return websiteDataStore;
}

/// Constructs a [WKWebsiteDataStore] that is owned by [configuration].
Expand Down Expand Up @@ -301,20 +305,38 @@ class WKWebsiteDataStore {
/// An object that manages the HTTP cookies associated with a particular web view.
///
/// Wraps [WKHTTPCookieStore](https://developer.apple.com/documentation/webkit/wkhttpcookiestore?language=objc).
class WKHttpCookieStore {
class WKHttpCookieStore extends NSObject {
WKHttpCookieStore._({
BinaryMessenger? binaryMessenger,
InstanceManager? instanceManager,
}) : _httpCookieStoreApi = WKHttpCookieStoreHostApiImpl(
binaryMessenger: binaryMessenger,
instanceManager: instanceManager,
);

/// Constructs a [WKHttpCookieStore] that is owned by [dataStore].
@visibleForTesting
WKHttpCookieStore.fromWebsiteDataStore(
// TODO(bparrishMines): Remove ignore on implementation.
// ignore: avoid_unused_constructor_parameters
WKWebsiteDataStore dataStore,
) {
throw UnimplementedError();
factory WKHttpCookieStore.fromWebsiteDataStore(
WKWebsiteDataStore dataStore, {
BinaryMessenger? binaryMessenger,
InstanceManager? instanceManager,
}) {
final WKHttpCookieStore cookieStore = WKHttpCookieStore._(
binaryMessenger: binaryMessenger,
instanceManager: instanceManager,
);
cookieStore._httpCookieStoreApi.createFromWebsiteDataStoreForInstances(
cookieStore,
dataStore,
);
return cookieStore;
}

final WKHttpCookieStoreHostApiImpl _httpCookieStoreApi;

/// Adds a cookie to the cookie store.
Future<void> setCookie(NSHttpCookie cookie) {
throw UnimplementedError();
return _httpCookieStoreApi.setCookieForInsances(this, cookie);
}
}

Expand Down
Loading