Skip to content

Commit 9b75f36

Browse files
committed
feat: added support for more js events like new permissions, 'fileChooser', favIcon, touchIcon
1 parent ddc23b0 commit 9b75f36

File tree

3 files changed

+136
-26
lines changed

3 files changed

+136
-26
lines changed

src/webview/index.android.ts

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,9 @@ function initializeWebViewClient(): void {
363363
if (!owner) {
364364
return;
365365
}
366-
367-
owner._titleChanged(title);
366+
if (owner.hasListeners(WebViewExtBase.titleChangedEvent)) {
367+
owner._titleChanged(title);
368+
}
368369
}
369370

370371
public onJsAlert(view: AndroidWebView, url: string, message: string, result: android.webkit.JsResult): boolean {
@@ -465,6 +466,7 @@ function initializeWebViewClient(): void {
465466
async _onPermissionsRequest(permissionRequest: android.webkit.PermissionRequest) {
466467
const owner = this.owner?.get();
467468
if (!owner) {
469+
permissionRequest.deny();
468470
return;
469471
}
470472
try {
@@ -491,14 +493,75 @@ function initializeWebViewClient(): void {
491493
await owner._onRequestPermissions(wantedPermissions);
492494

493495
permissionRequest.grant(requestedPermissions);
494-
} catch (err) {
495-
console.error(err);
496+
} catch (error) {
496497
permissionRequest.deny();
498+
owner.notify({ eventName: 'error', error });
497499
}
498500
}
499501
onPermissionRequest(permissionRequest: android.webkit.PermissionRequest) {
500502
this._onPermissionsRequest(permissionRequest);
501503
}
504+
async onGeolocationPermissionsShowPrompt(origin: string, callback: globalAndroid.webkit.GeolocationPermissions.Callback) {
505+
const owner = this.owner?.get();
506+
if (!owner) {
507+
callback.invoke(origin, false, false);
508+
return;
509+
}
510+
try {
511+
await owner._onRequestPermissions(['location']);
512+
callback.invoke(origin, true, true);
513+
} catch (error) {
514+
callback.invoke(origin, false, false);
515+
owner.notify({ eventName: 'error', error });
516+
}
517+
}
518+
public onReceivedIcon(webView: globalAndroid.webkit.WebView, icon: globalAndroid.graphics.Bitmap): void {
519+
const owner = this.owner?.get();
520+
if (!owner) {
521+
return;
522+
}
523+
if (owner.hasListeners('favicon')) {
524+
owner.notify({ eventName: 'favicon', icon });
525+
}
526+
}
527+
public onReceivedTouchIconUrl(webView: globalAndroid.webkit.WebView, url: string, precomposed: boolean): void {
528+
const owner = this.owner?.get();
529+
if (!owner) {
530+
return;
531+
}
532+
if (owner.hasListeners('touchicon')) {
533+
owner.notify({ eventName: 'touchicon', url, precomposed });
534+
}
535+
}
536+
public onShowFileChooser(
537+
webView: globalAndroid.webkit.WebView,
538+
filePathCallback: globalAndroid.webkit.ValueCallback<androidNative.Array<globalAndroid.net.Uri>>,
539+
fileChooserParams: globalAndroid.webkit.WebChromeClient.FileChooserParams
540+
): boolean {
541+
const owner = this.owner?.get();
542+
if (!owner) {
543+
return false;
544+
}
545+
if (owner.hasListeners('fileChooser')) {
546+
owner.notify({
547+
eventName: 'fileChooser',
548+
callback: (files: string[]) => {
549+
if (!files || files.length === 0) {
550+
filePathCallback.onReceiveValue(null);
551+
} else {
552+
const res = Array.create(android.net.Uri, files.length);
553+
files.forEach((filePath, index) => {
554+
const file = File.fromPath(filePath);
555+
res[index] = android.net.Uri.parse(`file://${file.path}`);
556+
});
557+
}
558+
},
559+
fileChooserParams
560+
});
561+
return true;
562+
}
563+
return false;
564+
}
502565
// onPermissionRequestCanceled (permissionRequest: android.webkit.PermissionRequest) {
503566
// console.log("onPermissionRequestCanceled", permissionRequest);
504567
// return super.onPermissionRequestCanceled(permissionRequest);

src/webview/index.common.ts

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -560,8 +560,6 @@ export abstract class WebViewExtBase extends ContainerView {
560560
const args = {
561561
error,
562562
eventName: WebViewExtBase.loadFinishedEvent,
563-
navigationType: undefined,
564-
object: this,
565563
url
566564
} as LoadFinishedEventData;
567565

@@ -613,7 +611,6 @@ export abstract class WebViewExtBase extends ContainerView {
613611
const args = {
614612
eventName: WebViewExtBase.loadStartedEvent,
615613
navigationType,
616-
object: this,
617614
url
618615
} as LoadStartedEventData;
619616

@@ -633,7 +630,6 @@ export abstract class WebViewExtBase extends ContainerView {
633630
eventName: WebViewExtBase.shouldOverrideUrlLoadingEvent,
634631
httpMethod,
635632
navigationType,
636-
object: this,
637633
url
638634
} as ShouldOverrideUrlLoadEventData;
639635
this.notify(args);
@@ -643,7 +639,6 @@ export abstract class WebViewExtBase extends ContainerView {
643639
public _loadProgress(progress: number) {
644640
const args = {
645641
eventName: WebViewExtBase.loadProgressEvent,
646-
object: this,
647642
progress,
648643
url: this.src
649644
} as LoadProgressEventData;
@@ -652,14 +647,11 @@ export abstract class WebViewExtBase extends ContainerView {
652647
}
653648

654649
public _titleChanged(title: string) {
655-
const args = {
650+
this.notify({
656651
eventName: WebViewExtBase.titleChangedEvent,
657-
object: this,
658652
title,
659653
url: this.src
660-
} as TitleChangedEventData;
661-
662-
this.notify(args);
654+
} as TitleChangedEventData);
663655
}
664656

665657
public _webAlert(message: string, callback: () => void) {
@@ -669,7 +661,6 @@ export abstract class WebViewExtBase extends ContainerView {
669661

670662
const args = {
671663
eventName: WebViewExtBase.webAlertEvent,
672-
object: this,
673664
message,
674665
url: this.src,
675666
callback
@@ -687,7 +678,6 @@ export abstract class WebViewExtBase extends ContainerView {
687678

688679
const args = {
689680
eventName: WebViewExtBase.webConfirmEvent,
690-
object: this,
691681
message,
692682
url: this.src,
693683
callback
@@ -705,7 +695,6 @@ export abstract class WebViewExtBase extends ContainerView {
705695

706696
const args = {
707697
eventName: WebViewExtBase.webPromptEvent,
708-
object: this,
709698
message,
710699
defaultText,
711700
url: this.src,
@@ -724,7 +713,6 @@ export abstract class WebViewExtBase extends ContainerView {
724713

725714
const args = {
726715
eventName: WebViewExtBase.webConsoleEvent,
727-
object: this,
728716
data: {
729717
message,
730718
lineNo,
@@ -745,7 +733,6 @@ export abstract class WebViewExtBase extends ContainerView {
745733

746734
const args = {
747735
eventName: WebViewExtBase.enterFullscreenEvent,
748-
object: this,
749736
exitFullscreen,
750737
url: this.src
751738
} as EnterFullscreenEventData;
@@ -758,7 +745,6 @@ export abstract class WebViewExtBase extends ContainerView {
758745
public _onExitFullscreen() {
759746
const args = {
760747
eventName: WebViewExtBase.exitFullscreenEvent,
761-
object: this,
762748
url: this.src
763749
} as ExitFullscreenEventData;
764750

@@ -1428,7 +1414,6 @@ export abstract class WebViewExtBase extends ContainerView {
14281414
public onWebViewEvent(eventName: string, data: any) {
14291415
this.notify({
14301416
eventName,
1431-
object: this,
14321417
data
14331418
});
14341419
}
@@ -1467,7 +1452,6 @@ export abstract class WebViewExtBase extends ContainerView {
14671452
return new Promise<void>((resolve, reject) => {
14681453
const args = {
14691454
eventName: EventNames.RequestPermissions,
1470-
object: this,
14711455
url: this.src,
14721456
permissions,
14731457
callback(allow) {

src/webview/index.ios.ts

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ export class AWebView extends WebViewExtBase {
414414
[debugModeProperty.setNative](enabled) {
415415
const nativeView = this.nativeViewProtected;
416416

417-
nativeView.inspectable = !!enabled;
417+
nativeView['inspectable'] = !!enabled;
418418
}
419419

420420
[scrollBounceProperty.getDefault]() {
@@ -675,15 +675,22 @@ export class WKNavigationDelegateNotaImpl extends NSObject implements WKNavigati
675675
if (shouldOverrideUrlLoading === true) {
676676
if (Trace.isEnabled()) {
677677
Trace.write(
678-
`WKNavigationDelegateClass.webViewDecidePolicyForNavigationActionDecisionHandler("${url}", "${navigationAction.navigationType}") -> method:${httpMethod} "${navType}" -> cancel`, WebViewTraceCategory, Trace.messageType.info);
678+
`WKNavigationDelegateClass.webViewDecidePolicyForNavigationActionDecisionHandler("${url}", "${navigationAction.navigationType}") -> method:${httpMethod} "${navType}" -> cancel`,
679+
WebViewTraceCategory,
680+
Trace.messageType.info
681+
);
679682
decisionHandler(WKNavigationActionPolicy.Cancel);
680683
}
681684
return;
682685
}
683686
decisionHandler(WKNavigationActionPolicy.Allow);
684687

685688
if (Trace.isEnabled()) {
686-
Trace.write(`WKNavigationDelegateClass.webViewDecidePolicyForNavigationActionDecisionHandler("${url}", "${navigationAction.navigationType}") -> method:${httpMethod} "${navType}"`, WebViewTraceCategory, Trace.messageType.info);
689+
Trace.write(
690+
`WKNavigationDelegateClass.webViewDecidePolicyForNavigationActionDecisionHandler("${url}", "${navigationAction.navigationType}") -> method:${httpMethod} "${navType}"`,
691+
WebViewTraceCategory,
692+
Trace.messageType.info
693+
);
687694
}
688695
owner._onLoadStarted(url, navType);
689696
}
@@ -779,7 +786,11 @@ export class WKScriptMessageHandlerNotaImpl extends NSObject implements WKScript
779786
}
780787
} catch (err) {
781788
if (Trace.isEnabled()) {
782-
Trace.write(`userContentControllerDidReceiveScriptMessage(${userContentController}, ${webViewMessage}) - bad message: ${webViewMessage.body}`, WebViewTraceCategory, Trace.messageType.error);
789+
Trace.write(
790+
`userContentControllerDidReceiveScriptMessage(${userContentController}, ${webViewMessage}) - bad message: ${webViewMessage.body}`,
791+
WebViewTraceCategory,
792+
Trace.messageType.error
793+
);
783794
}
784795
}
785796
}
@@ -878,4 +889,56 @@ export class WKUIDelegateNotaImpl extends NSObject implements WKUIDelegate {
878889

879890
return null;
880891
}
892+
async webViewRequestDeviceOrientationAndMotionPermissionForOriginInitiatedByFrameDecisionHandler?(
893+
webView: WKWebView,
894+
origin: WKSecurityOrigin,
895+
frame: WKFrameInfo,
896+
decisionHandler: (p1: WKPermissionDecision) => void
897+
) {
898+
const owner = this.owner.get();
899+
if (!owner) {
900+
decisionHandler(WKPermissionDecision.Deny);
901+
return;
902+
}
903+
try {
904+
await owner._onRequestPermissions(['motion']);
905+
decisionHandler(WKPermissionDecision.Grant);
906+
} catch (error) {
907+
decisionHandler(WKPermissionDecision.Deny);
908+
owner.notify({ eventName: 'error', error });
909+
}
910+
}
911+
912+
async webViewRequestMediaCapturePermissionForOriginInitiatedByFrameTypeDecisionHandler?(
913+
webView: WKWebView,
914+
origin: WKSecurityOrigin,
915+
frame: WKFrameInfo,
916+
type: WKMediaCaptureType,
917+
decisionHandler: (p1: WKPermissionDecision) => void
918+
) {
919+
const owner = this.owner.get();
920+
if (!owner) {
921+
decisionHandler(WKPermissionDecision.Deny);
922+
return;
923+
}
924+
try {
925+
const permissions = [];
926+
switch (type) {
927+
case WKMediaCaptureType.Camera:
928+
permissions.push('camera');
929+
break;
930+
case WKMediaCaptureType.Microphone:
931+
permissions.push('microphone');
932+
break;
933+
case WKMediaCaptureType.CameraAndMicrophone:
934+
permissions.push('camera', 'microphone');
935+
break;
936+
}
937+
await owner._onRequestPermissions(permissions);
938+
decisionHandler(WKPermissionDecision.Grant);
939+
} catch (error) {
940+
decisionHandler(WKPermissionDecision.Deny);
941+
owner.notify({ eventName: 'error', error });
942+
}
943+
}
881944
}

0 commit comments

Comments
 (0)