Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Changes from 1 commit
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
Prev Previous commit
Next Next commit
webkit flutter apis
  • Loading branch information
bparrishMines committed Jun 7, 2022
commit fccd9d67b750b64a3b7b0332e08ed5ddc84ff7bd
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,16 @@ extension _NSHttpCookieConverter on NSHttpCookie {
}
}

extension _WKNavigationActionPolicyConverter on WKNavigationActionPolicy {
WKNavigationActionPolicyEnumData toWKNavigationActionPolicyEnumData() {
return WKNavigationActionPolicyEnumData(
value: WKNavigationActionPolicyEnum.values.firstWhere(
(WKNavigationActionPolicyEnum element) => element.name == name,
),
);
}
}

extension _NSHttpCookiePropertyKeyConverter on NSHttpCookiePropertyKey {
NSHttpCookiePropertyKeyEnumData toNSHttpCookiePropertyKeyEnumData() {
late final NSHttpCookiePropertyKeyEnum value;
Expand Down Expand Up @@ -154,6 +164,48 @@ Iterable<WKAudiovisualMediaTypeEnumData> _toWKAudiovisualMediaTypeEnumData(
});
}

extension _NavigationActionDataConverter on WKNavigationActionData {
WKNavigationAction toNavigationAction() {
return WKNavigationAction(
request: request.toNSUrlRequest(),
targetFrame: targetFrame.toWKFrameInfo(),
);
}
}

extension _WKFrameInfoDataConverter on WKFrameInfoData {
WKFrameInfo toWKFrameInfo() {
return WKFrameInfo(isMainFrame: isMainFrame);
}
}

extension _NSUrlRequestDataConverter on NSUrlRequestData {
NSUrlRequest toNSUrlRequest() {
return NSUrlRequest(
url: url,
httpBody: httpBody,
httpMethod: httpMethod,
allHttpHeaderFields: allHttpHeaderFields.cast(),
);
}
}

extension _WKNSErrorDataConverter on NSErrorData {
NSError toNSError() {
return NSError(
domain: domain,
code: code,
localizedDescription: localiziedDescription,
);
}
}

extension _WKScriptMessageDataConverter on WKScriptMessageData {
WKScriptMessage toWKScriptMessage() {
return WKScriptMessage(name: name, body: body);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We really need the ability to use existing classes as Pigeon data classes :(

Copy link
Contributor Author

@bparrishMines bparrishMines Jun 8, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree. I think we could use the enums and data classes generated from pigeon if flutter/flutter#53191 was implemented. This would save us alot of code.


extension _WKUserScriptConverter on WKUserScript {
WKUserScriptData toWKUserScriptData() {
return WKUserScriptData(
Expand Down Expand Up @@ -282,6 +334,36 @@ class WKScriptMessageHandlerHostApiImpl extends WKScriptMessageHandlerHostApi {
}
}

/// Flutter api implementation for [WKScriptMessageHandler].
class WKScriptMessageHandlerFlutterApiImpl
extends WKScriptMessageHandlerFlutterApi {
/// Constructs a [WKScriptMessageHandlerFlutterApiImpl].
WKScriptMessageHandlerFlutterApiImpl({InstanceManager? instanceManager}) {
this.instanceManager = instanceManager ?? NSObject.globalInstanceManager;
}

/// Maintains instances stored to communicate with native language objects.
late final InstanceManager instanceManager;

WKScriptMessageHandler _getHandler(int identifier) {
return instanceManager.getInstanceWithWeakReference(identifier)!;
}

@override
void didReceiveScriptMessage(
int identifier,
int userContentControllerIdentifier,
WKScriptMessageData message,
) {
_getHandler(identifier).didReceiveScriptMessage(
instanceManager.getInstanceWithWeakReference(
userContentControllerIdentifier,
)! as WKUserContentController,
message.toWKScriptMessage(),
);
}
}

/// Host api implementation for [WKPreferences].
class WKPreferencesHostApiImpl extends WKPreferencesHostApi {
/// Constructs a [WKPreferencesHostApiImpl].
Expand Down Expand Up @@ -492,6 +574,36 @@ class WKUIDelegateHostApiImpl extends WKUIDelegateHostApi {
}
}

/// Flutter api implementation for [WKUIDelegate].
class WKUIDelegateFlutterApiImpl extends WKUIDelegateFlutterApi {
/// Constructs a [WKUIDelegateFlutterApiImpl].
WKUIDelegateFlutterApiImpl({InstanceManager? instanceManager}) {
this.instanceManager = instanceManager ?? NSObject.globalInstanceManager;
}

/// Maintains instances stored to communicate with native language objects.
late final InstanceManager instanceManager;

WKUIDelegate _getDelegate(int identifier) {
return instanceManager.getInstanceWithWeakReference(identifier)!;
}

@override
void onCreateWebView(
int identifier,
int configurationIdentifier,
WKNavigationActionData navigationAction,
) {
final void Function(WKWebViewConfiguration, WKNavigationAction)? function =
_getDelegate(identifier).onCreateWebView;
function?.call(
instanceManager.getInstanceWithWeakReference(configurationIdentifier)!
as WKWebViewConfiguration,
navigationAction.toNavigationAction(),
);
}
}

/// Host api implementation for [WKNavigationDelegate].
@immutable
class WKNavigationDelegateHostApiImpl extends WKNavigationDelegateHostApi {
Expand Down Expand Up @@ -558,6 +670,89 @@ class WKNavigationDelegateFlutterApiImpl
url,
);
}

@override
Future<WKNavigationActionPolicyEnumData> decidePolicyForNavigationAction(
int identifier,
int webViewIdentifier,
WKNavigationActionData navigationAction,
) async {
final Future<WKNavigationActionPolicy> Function(
WKWebView,
WKNavigationAction navigationAction,
)? function = _getDelegate(identifier).decidePolicyForNavigationAction;

if (function == null) {
return WKNavigationActionPolicyEnumData(
value: WKNavigationActionPolicyEnum.allow,
);
}

final WKNavigationActionPolicy policy = await function(
instanceManager.getInstanceWithWeakReference(webViewIdentifier)!
as WKWebView,
navigationAction.toNavigationAction(),
);
return policy.toWKNavigationActionPolicyEnumData();
}

@override
void didFailNavigation(
int identifier,
int webViewIdentifier,
NSErrorData error,
) {
final void Function(WKWebView, NSError)? function =
_getDelegate(identifier).didFailNavigation;
function?.call(
instanceManager.getInstanceWithWeakReference(webViewIdentifier)!
as WKWebView,
error.toNSError(),
);
}

@override
void didFailProvisionalNavigation(
int identifier,
int webViewIdentifier,
NSErrorData error,
) {
final void Function(WKWebView, NSError)? function =
_getDelegate(identifier).didFailProvisionalNavigation;
function?.call(
instanceManager.getInstanceWithWeakReference(webViewIdentifier)!
as WKWebView,
error.toNSError(),
);
}

@override
void didStartProvisionalNavigation(
int identifier,
int webViewIdentifier,
String? url,
) {
final void Function(WKWebView, String?)? function =
_getDelegate(identifier).didStartProvisionalNavigation;
function?.call(
instanceManager.getInstanceWithWeakReference(webViewIdentifier)!
as WKWebView,
url,
);
}

@override
void webViewWebContentProcessDidTerminate(
int identifier,
int webViewIdentifier,
) {
final void Function(WKWebView)? function =
_getDelegate(identifier).webViewWebContentProcessDidTerminate;
function?.call(
instanceManager.getInstanceWithWeakReference(webViewIdentifier)!
as WKWebView,
);
}
}

/// Host api implementation for [WKWebView].
Expand Down