fixed plugin dependencies, added getUrl web support

This commit is contained in:
Lorenzo Pichilli 2022-04-27 13:39:00 +02:00
parent 5fb73dae1e
commit 3bad02d6e4
7 changed files with 259 additions and 227 deletions

View File

@ -1,5 +1,6 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_test/flutter_test.dart';
@ -24,5 +25,9 @@ void initialUrlRequest() {
await controllerCompleter.future;
final String? currentUrl = (await controller.getUrl())?.toString();
expect(currentUrl, 'https://github.com/flutter');
});
}, skip: !kIsWeb || ![
TargetPlatform.android,
TargetPlatform.iOS,
TargetPlatform.macOS,
].contains(defaultTargetPlatform));
}

View File

@ -1,7 +1,7 @@
import 'dart:async';
import 'dart:collection';
import 'dart:convert';
import 'dart:io';
// import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/foundation.dart';
@ -89,7 +89,7 @@ class MyChromeSafariBrowser extends ChromeSafariBrowser {
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
if (Platform.isAndroid) {
if (defaultTargetPlatform == TargetPlatform.android) {
InAppWebViewController.setWebContentsDebuggingEnabled(true);
}
@ -350,141 +350,141 @@ void main() {
pageLoads.close();
});
group("iOS loadFileURL", () {
late Directory appSupportDir;
late File fileHtml;
late File fileJs;
setUpAll(() async {
appSupportDir = (await getApplicationSupportDirectory());
final Directory htmlFolder = Directory('${appSupportDir.path}/html/');
if (!await htmlFolder.exists()) {
await htmlFolder.create(recursive: true);
}
final Directory jsFolder = Directory('${appSupportDir.path}/js/');
if (!await jsFolder.exists()) {
await jsFolder.create(recursive: true);
}
var html = """
<!DOCTYPE html><html>
<head>
<title>file scheme</title>
</head>
<body>
<script src="../js/main.js"></script>
</body>
</html>
""";
fileHtml = File(htmlFolder.path + "index.html");
fileHtml.writeAsStringSync(html);
var js = """
console.log('message');
""";
fileJs = File(jsFolder.path + "main.js");
fileJs.writeAsStringSync(js);
});
testWidgets('initialUrl with file:// scheme and allowingReadAccessTo',
(WidgetTester tester) async {
final Completer<ConsoleMessage?> consoleMessageShouldNotComplete =
Completer<ConsoleMessage?>();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: InAppWebView(
key: GlobalKey(),
initialUrlRequest:
URLRequest(url: Uri.parse('file://${fileHtml.path}')),
onConsoleMessage: (controller, consoleMessage) {
consoleMessageShouldNotComplete.complete(consoleMessage);
},
),
),
);
var result = await consoleMessageShouldNotComplete.future
.timeout(const Duration(seconds: 2), onTimeout: () => null);
expect(result, null);
final Completer<ConsoleMessage> consoleMessageCompleter =
Completer<ConsoleMessage>();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: InAppWebView(
key: GlobalKey(),
initialUrlRequest:
URLRequest(url: Uri.parse('file://${fileHtml.path}')),
initialOptions: InAppWebViewGroupOptions(
ios: IOSInAppWebViewOptions(
allowingReadAccessTo:
Uri.parse('file://${appSupportDir.path}/'))),
onConsoleMessage: (controller, consoleMessage) {
consoleMessageCompleter.complete(consoleMessage);
},
),
),
);
final ConsoleMessage consoleMessage =
await consoleMessageCompleter.future;
expect(consoleMessage.messageLevel, ConsoleMessageLevel.LOG);
expect(consoleMessage.message, 'message');
}, skip: !Platform.isIOS);
testWidgets(
'loadUrl with file:// scheme and allowingReadAccessTo argument',
(WidgetTester tester) async {
final Completer<ConsoleMessage?> consoleMessageShouldNotComplete =
Completer<ConsoleMessage?>();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: InAppWebView(
key: GlobalKey(),
onWebViewCreated: (controller) {
controller.loadUrl(
urlRequest:
URLRequest(url: Uri.parse('file://${fileHtml.path}')));
},
onConsoleMessage: (controller, consoleMessage) {
consoleMessageShouldNotComplete.complete(consoleMessage);
},
),
),
);
var result = await consoleMessageShouldNotComplete.future
.timeout(const Duration(seconds: 2), onTimeout: () => null);
expect(result, null);
final Completer<ConsoleMessage> consoleMessageCompleter =
Completer<ConsoleMessage>();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: InAppWebView(
key: GlobalKey(),
onWebViewCreated: (controller) {
controller.loadUrl(
urlRequest:
URLRequest(url: Uri.parse('file://${fileHtml.path}')),
allowingReadAccessTo:
Uri.parse('file://${appSupportDir.path}/'));
},
onConsoleMessage: (controller, consoleMessage) {
consoleMessageCompleter.complete(consoleMessage);
},
),
),
);
final ConsoleMessage consoleMessage =
await consoleMessageCompleter.future;
expect(consoleMessage.messageLevel, ConsoleMessageLevel.LOG);
expect(consoleMessage.message, 'message');
}, skip: !Platform.isIOS);
}, skip: !Platform.isIOS);
// group("iOS loadFileURL", () {
// late Directory appSupportDir;
// late File fileHtml;
// late File fileJs;
//
// setUpAll(() async {
// appSupportDir = (await getApplicationSupportDirectory());
//
// final Directory htmlFolder = Directory('${appSupportDir.path}/html/');
// if (!await htmlFolder.exists()) {
// await htmlFolder.create(recursive: true);
// }
//
// final Directory jsFolder = Directory('${appSupportDir.path}/js/');
// if (!await jsFolder.exists()) {
// await jsFolder.create(recursive: true);
// }
//
// var html = """
// <!DOCTYPE html><html>
// <head>
// <title>file scheme</title>
// </head>
// <body>
// <script src="../js/main.js"></script>
// </body>
// </html>
// """;
// fileHtml = File(htmlFolder.path + "index.html");
// fileHtml.writeAsStringSync(html);
//
// var js = """
// console.log('message');
// """;
// fileJs = File(jsFolder.path + "main.js");
// fileJs.writeAsStringSync(js);
// });
//
// testWidgets('initialUrl with file:// scheme and allowingReadAccessTo',
// (WidgetTester tester) async {
// final Completer<ConsoleMessage?> consoleMessageShouldNotComplete =
// Completer<ConsoleMessage?>();
// await tester.pumpWidget(
// Directionality(
// textDirection: TextDirection.ltr,
// child: InAppWebView(
// key: GlobalKey(),
// initialUrlRequest:
// URLRequest(url: Uri.parse('file://${fileHtml.path}')),
// onConsoleMessage: (controller, consoleMessage) {
// consoleMessageShouldNotComplete.complete(consoleMessage);
// },
// ),
// ),
// );
// var result = await consoleMessageShouldNotComplete.future
// .timeout(const Duration(seconds: 2), onTimeout: () => null);
// expect(result, null);
//
// final Completer<ConsoleMessage> consoleMessageCompleter =
// Completer<ConsoleMessage>();
// await tester.pumpWidget(
// Directionality(
// textDirection: TextDirection.ltr,
// child: InAppWebView(
// key: GlobalKey(),
// initialUrlRequest:
// URLRequest(url: Uri.parse('file://${fileHtml.path}')),
// initialOptions: InAppWebViewGroupOptions(
// ios: IOSInAppWebViewOptions(
// allowingReadAccessTo:
// Uri.parse('file://${appSupportDir.path}/'))),
// onConsoleMessage: (controller, consoleMessage) {
// consoleMessageCompleter.complete(consoleMessage);
// },
// ),
// ),
// );
// final ConsoleMessage consoleMessage =
// await consoleMessageCompleter.future;
// expect(consoleMessage.messageLevel, ConsoleMessageLevel.LOG);
// expect(consoleMessage.message, 'message');
// }, skip: defaultTargetPlatform != TargetPlatform.iOS);
//
// testWidgets(
// 'loadUrl with file:// scheme and allowingReadAccessTo argument',
// (WidgetTester tester) async {
// final Completer<ConsoleMessage?> consoleMessageShouldNotComplete =
// Completer<ConsoleMessage?>();
// await tester.pumpWidget(
// Directionality(
// textDirection: TextDirection.ltr,
// child: InAppWebView(
// key: GlobalKey(),
// onWebViewCreated: (controller) {
// controller.loadUrl(
// urlRequest:
// URLRequest(url: Uri.parse('file://${fileHtml.path}')));
// },
// onConsoleMessage: (controller, consoleMessage) {
// consoleMessageShouldNotComplete.complete(consoleMessage);
// },
// ),
// ),
// );
// var result = await consoleMessageShouldNotComplete.future
// .timeout(const Duration(seconds: 2), onTimeout: () => null);
// expect(result, null);
//
// final Completer<ConsoleMessage> consoleMessageCompleter =
// Completer<ConsoleMessage>();
// await tester.pumpWidget(
// Directionality(
// textDirection: TextDirection.ltr,
// child: InAppWebView(
// key: GlobalKey(),
// onWebViewCreated: (controller) {
// controller.loadUrl(
// urlRequest:
// URLRequest(url: Uri.parse('file://${fileHtml.path}')),
// allowingReadAccessTo:
// Uri.parse('file://${appSupportDir.path}/'));
// },
// onConsoleMessage: (controller, consoleMessage) {
// consoleMessageCompleter.complete(consoleMessage);
// },
// ),
// ),
// );
// final ConsoleMessage consoleMessage =
// await consoleMessageCompleter.future;
// expect(consoleMessage.messageLevel, ConsoleMessageLevel.LOG);
// expect(consoleMessage.message, 'message');
// }, skip: defaultTargetPlatform != TargetPlatform.iOS);
// }, skip: defaultTargetPlatform != TargetPlatform.iOS);
testWidgets('JavaScript Handler', (WidgetTester tester) async {
final Completer controllerCompleter = Completer<InAppWebViewController>();
@ -899,7 +899,7 @@ void main() {
await controller.evaluateJavascript(source: "exitFullscreen();");
await expectLater(onExitFullscreenCompleter.future, completes);
}, skip: true /*!Platform.isAndroid*/);
}, skip: true /*defaultTargetPlatform != TargetPlatform.android*/);
});
group('Audio playback policy', () {
@ -1205,8 +1205,8 @@ void main() {
scrollPosY = await controller.getScrollY();
expect(scrollPosX, X_SCROLL * 2);
expect(scrollPosY, Y_SCROLL * 2);
}, skip: !Platform.isAndroid);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
}, skip: defaultTargetPlatform != TargetPlatform.android);
group('shouldOverrideUrlLoading', () {
final String page =
@ -1318,7 +1318,7 @@ void main() {
'https://github.com/pichillilorenzo/flutter_inappwebview');
pageLoads.close();
}, skip: !Platform.isIOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
testWidgets('can block requests', (WidgetTester tester) async {
final Completer controllerCompleter =
@ -1439,9 +1439,9 @@ void main() {
final String url = await errorUrlCompleter.future;
final int code = await errorCodeCompleter.future;
if (Platform.isAndroid) {
if (defaultTargetPlatform == TargetPlatform.android) {
expect(code, -2);
} else if (Platform.isIOS) {
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
expect(code, -1003);
}
expect(url, 'https://www.notawebsite..com/');
@ -1502,7 +1502,7 @@ void main() {
await controllerCompleter.future;
final String? currentUrl = (await controller.getUrl())?.toString();
expect(currentUrl, 'https://github.com/flutter');
}, skip: !Platform.isIOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
testWidgets('target _blank opens in same window',
(WidgetTester tester) async {
@ -1587,7 +1587,7 @@ void main() {
pageLoads.close();
},
skip: true /* !Platform.isAndroid */,
skip: true /* defaultTargetPlatform != TargetPlatform.android */,
);
testWidgets(
@ -1663,7 +1663,7 @@ void main() {
completion(null),
);
},
skip: !Platform.isAndroid,
skip: defaultTargetPlatform != TargetPlatform.android,
);
group('intercept ajax request', () {
@ -3016,7 +3016,7 @@ setTimeout(function() {
final String url = await pageLoaded.future;
expect(url, "chrome://safe-browsing/match?type=malware");
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
testWidgets('onScrollChanged', (WidgetTester tester) async {
final Completer controllerCompleter = Completer<InAppWebViewController>();
@ -3295,7 +3295,7 @@ setTimeout(function() {
expect(listEquals(resources, ['android.webkit.resource.VIDEO_CAPTURE']),
true);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
testWidgets('androidShouldInterceptRequest', (WidgetTester tester) async {
List<String> resourceList = [
@ -3352,7 +3352,7 @@ setTimeout(function() {
await pageLoaded.future;
await loadedResourceCompleter.future;
expect(resourceLoaded, containsAll(resourceList));
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
testWidgets('androidOnReceivedIcon', (WidgetTester tester) async {
final Completer controllerCompleter = Completer<InAppWebViewController>();
@ -3383,7 +3383,7 @@ setTimeout(function() {
await pageLoaded.future;
final Uint8List icon = await onReceivedIconCompleter.future;
expect(icon, isNotNull);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
testWidgets('androidOnReceivedTouchIconUrl', (WidgetTester tester) async {
final Completer controllerCompleter = Completer<InAppWebViewController>();
@ -3423,7 +3423,7 @@ setTimeout(function() {
final String url = await onReceivedTouchIconUrlCompleter.future;
expect(url, "https://placehold.it/72x72");
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
testWidgets('androidOnJsBeforeUnload', (WidgetTester tester) async {
final Completer controllerCompleter = Completer<InAppWebViewController>();
@ -3466,7 +3466,7 @@ setTimeout(function() {
source: "window.location.href = 'https://github.com/flutter';");
final String url = await onJsBeforeUnloadCompleter.future;
expect(url, 'https://github.com/flutter');
}, skip: true /*!Platform.isAndroid*/);
}, skip: true /*defaultTargetPlatform != TargetPlatform.android*/);
group("iosOnNavigationResponse", () {
testWidgets('allow navigation', (WidgetTester tester) async {
@ -3503,7 +3503,7 @@ setTimeout(function() {
await pageLoaded.future;
final String url = await onNavigationResponseCompleter.future;
expect(url, 'https://github.com/flutter');
}, skip: !Platform.isIOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
testWidgets('cancel navigation', (WidgetTester tester) async {
final Completer controllerCompleter =
@ -3539,8 +3539,8 @@ setTimeout(function() {
final String url = await onNavigationResponseCompleter.future;
expect(url, 'https://github.com/flutter');
expect(pageLoaded.future, doesNotComplete);
}, skip: !Platform.isIOS);
}, skip: !Platform.isIOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
testWidgets('initialUserScripts', (WidgetTester tester) async {
final Completer controllerCompleter = Completer<InAppWebViewController>();
@ -4104,11 +4104,11 @@ setTimeout(function() {
final InAppWebViewController controller =
await controllerCompleter.future;
if (Platform.isAndroid) {
if (defaultTargetPlatform == TargetPlatform.android) {
await pageLoaded.future;
expect(await controller.evaluateJavascript(source: "document.body"),
isNullOrEmpty);
} else if (Platform.isIOS) {
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
expect(pageLoaded.future, doesNotComplete);
}
});
@ -4797,52 +4797,52 @@ setTimeout(function() {
pageLoads.close();
});
testWidgets('saveWebArchive', (WidgetTester tester) async {
final Completer controllerCompleter = Completer<InAppWebViewController>();
final Completer<void> pageLoaded = Completer<void>();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: InAppWebView(
key: GlobalKey(),
initialUrlRequest:
URLRequest(url: Uri.parse('https://github.com/flutter')),
onWebViewCreated: (controller) {
controllerCompleter.complete(controller);
},
onLoadStop: (controller, url) {
pageLoaded.complete();
},
),
),
);
final InAppWebViewController controller =
await controllerCompleter.future;
await pageLoaded.future;
// wait a little bit after page load otherwise Android will not save the web archive
await Future.delayed(Duration(seconds: 1));
var supportDir = await getApplicationSupportDirectory();
var fileName = "flutter-website.";
if (Platform.isAndroid) {
fileName = fileName + WebArchiveFormat.MHT.toValue();
} else if (Platform.isIOS) {
fileName = fileName + WebArchiveFormat.WEBARCHIVE.toValue();
}
var fullPath = supportDir.path + Platform.pathSeparator + fileName;
var path = await controller.saveWebArchive(filePath: fullPath);
expect(path, isNotNull);
expect(path, endsWith(fileName));
path = await controller.saveWebArchive(
filePath: supportDir.path, autoname: true);
expect(path, isNotNull);
});
// testWidgets('saveWebArchive', (WidgetTester tester) async {
// final Completer controllerCompleter = Completer<InAppWebViewController>();
// final Completer<void> pageLoaded = Completer<void>();
//
// await tester.pumpWidget(
// Directionality(
// textDirection: TextDirection.ltr,
// child: InAppWebView(
// key: GlobalKey(),
// initialUrlRequest:
// URLRequest(url: Uri.parse('https://github.com/flutter')),
// onWebViewCreated: (controller) {
// controllerCompleter.complete(controller);
// },
// onLoadStop: (controller, url) {
// pageLoaded.complete();
// },
// ),
// ),
// );
//
// final InAppWebViewController controller =
// await controllerCompleter.future;
// await pageLoaded.future;
//
// // wait a little bit after page load otherwise Android will not save the web archive
// await Future.delayed(Duration(seconds: 1));
//
// var supportDir = await getApplicationSupportDirectory();
//
// var fileName = "flutter-website.";
// if (defaultTargetPlatform == TargetPlatform.android) {
// fileName = fileName + WebArchiveFormat.MHT.toValue();
// } else if (defaultTargetPlatform == TargetPlatform.iOS) {
// fileName = fileName + WebArchiveFormat.WEBARCHIVE.toValue();
// }
//
// var fullPath = supportDir.path + Platform.pathSeparator + fileName;
// var path = await controller.saveWebArchive(filePath: fullPath);
// expect(path, isNotNull);
// expect(path, endsWith(fileName));
//
// path = await controller.saveWebArchive(
// filePath: supportDir.path, autoname: true);
// expect(path, isNotNull);
// });
testWidgets('isSecureContext', (WidgetTester tester) async {
final Completer controllerCompleter = Completer<InAppWebViewController>();
@ -5070,7 +5070,7 @@ setTimeout(function() {
await controllerCompleter.future;
await pageLoaded.future;
await expectLater(controller.android.clearSslPreferences(), completes);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
testWidgets('pause/resume', (WidgetTester tester) async {
final Completer controllerCompleter =
@ -5100,7 +5100,7 @@ setTimeout(function() {
await expectLater(controller.android.pause(), completes);
await Future.delayed(Duration(seconds: 1));
await expectLater(controller.android.resume(), completes);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
testWidgets('getOriginalUrl', (WidgetTester tester) async {
final Completer controllerCompleter =
@ -5159,7 +5159,7 @@ setTimeout(function() {
expect(await controller.android.pageDown(bottom: false), true);
await Future.delayed(Duration(seconds: 1));
expect(await controller.android.pageUp(top: false), true);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
testWidgets('zoomIn/zoomOut', (WidgetTester tester) async {
final Completer controllerCompleter =
@ -5189,7 +5189,7 @@ setTimeout(function() {
expect(await controller.android.zoomIn(), true);
await Future.delayed(Duration(seconds: 1));
expect(await controller.android.zoomOut(), true);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
testWidgets('clearHistory', (WidgetTester tester) async {
final Completer controllerCompleter =
@ -5231,39 +5231,39 @@ setTimeout(function() {
expect(webHistory!.list!.length, 1);
pageLoads.close();
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
test('clearClientCertPreferences', () async {
await expectLater(
AndroidInAppWebViewController.clearClientCertPreferences(),
completes);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
test('getSafeBrowsingPrivacyPolicyUrl', () async {
expect(
await AndroidInAppWebViewController
.getSafeBrowsingPrivacyPolicyUrl(),
isNotNull);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
test('setSafeBrowsingWhitelist', () async {
expect(
await AndroidInAppWebViewController.setSafeBrowsingWhitelist(
hosts: ["flutter.dev", "github.com"]),
true);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
test('getCurrentWebViewPackage', () async {
expect(await AndroidInAppWebViewController.getCurrentWebViewPackage(),
isNotNull);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
test('setWebContentsDebuggingEnabled', () async {
expect(
AndroidInAppWebViewController.setWebContentsDebuggingEnabled(true),
completes);
}, skip: !Platform.isAndroid);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
}, skip: defaultTargetPlatform != TargetPlatform.android);
group('ios methods', () {
testWidgets('reloadFromOrigin', (WidgetTester tester) async {
@ -5292,7 +5292,7 @@ setTimeout(function() {
await controllerCompleter.future;
await pageLoaded.future;
await expectLater(controller.ios.reloadFromOrigin(), completes);
}, skip: !Platform.isIOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
testWidgets('createPdf', (WidgetTester tester) async {
final Completer controllerCompleter =
@ -5325,7 +5325,7 @@ setTimeout(function() {
var pdf = await controller.ios
.createPdf(iosWKPdfConfiguration: iosWKPdfConfiguration);
expect(pdf, isNotNull);
}, skip: !Platform.isIOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
testWidgets('createWebArchiveData', (WidgetTester tester) async {
final Completer controllerCompleter =
@ -5354,7 +5354,7 @@ setTimeout(function() {
await pageLoaded.future;
expect(await controller.ios.createWebArchiveData(), isNotNull);
}, skip: !Platform.isIOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
testWidgets('Apple Pay API enabled', (WidgetTester tester) async {
final Completer<void> pageLoaded = Completer<void>();
@ -5398,13 +5398,13 @@ setTimeout(function() {
await pageLoaded.future;
final message = await alertMessageCompleter.future;
expect(message, 'true');
}, skip: !Platform.isIOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
test('handlesURLScheme', () async {
expect(await IOSInAppWebViewController.handlesURLScheme("http"), true);
expect(await IOSInAppWebViewController.handlesURLScheme("https"), true);
}, skip: !Platform.isIOS);
}, skip: !Platform.isIOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
}, skip: defaultTargetPlatform != TargetPlatform.iOS);
});
group('Service Worker', () {
@ -5445,7 +5445,7 @@ setTimeout(function() {
);
expect(completer.future, completes);
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
testWidgets('setServiceWorkerClient to null', (WidgetTester tester) async {
final Completer<String> pageLoaded = Completer<String>();
@ -5478,7 +5478,7 @@ setTimeout(function() {
final String url = await pageLoaded.future;
expect(url, "https://mdn.github.io/sw-test/");
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
});
group('Cookie Manager', () {
@ -5924,7 +5924,7 @@ setTimeout(function() {
await chromeSafariBrowser.browserClosed.future;
expect(chromeSafariBrowser.isOpened(), false);
});
}, skip: !Platform.isAndroid);
}, skip: defaultTargetPlatform != TargetPlatform.android);
});
group('InAppLocalhostServer', () {

View File

@ -121,8 +121,9 @@ class _InAppWebViewExampleScreenState extends State<InAppWebViewExampleScreen> {
initialSettings: settings,
// contextMenu: contextMenu,
pullToRefreshController: pullToRefreshController,
onWebViewCreated: (controller) {
onWebViewCreated: (controller) async {
webViewController = controller;
print(await controller.getUrl());
},
onLoadStart: (controller, url) async {
setState(() {

View File

@ -354,7 +354,17 @@ window.flutter_inappwebview = {
console.log(e);
}
}
}
},
getUrl: function () {
var iframe = webView.iframe;
var url = iframe.src;
try {
url = iframe.contentWindow.location.href;
} catch (e) {
console.log(e);
}
return url;
},
};
return webView;

View File

@ -1179,9 +1179,13 @@ class InAppWebViewController
///Gets the URL for the current page.
///This is not always the same as the URL passed to [WebView.onLoadStart] because although the load for that URL has begun, the current page may not have changed.
///
///**NOTE for Web**: If `window.location.href` isn't accessible inside the iframe,
///it will return the current value of the `iframe.src` attribute.
///
///**Supported Platforms/Implementations**:
///- Android native WebView ([Official API - WebView.getUrl](https://developer.android.com/reference/android/webkit/WebView#getUrl()))
///- iOS ([Official API - WKWebView.url](https://developer.apple.com/documentation/webkit/wkwebview/1415005-url))
///- Web
Future<Uri?> getUrl() async {
Map<String, dynamic> args = <String, dynamic>{};
String? url = await _channel.invokeMethod('getUrl', args);

View File

@ -92,6 +92,8 @@ class InAppWebViewWebElement {
call.arguments["settings"].cast<String, dynamic>());
setSettings(newSettings);
break;
case "getUrl":
return getUrl();
case "dispose":
dispose();
break;
@ -217,6 +219,14 @@ class InAppWebViewWebElement {
_callMethod("stopLoading");
}
Future<String?> getUrl() async {
String? url = _callMethod("getUrl");
if (url == null || url.isEmpty || url == 'about:blank') {
url = iframe.src;
}
return url;
}
Set<Sandbox> getSandbox() {
var sandbox = iframe.sandbox;
Set<Sandbox> values = Set();

View File

@ -10,12 +10,14 @@ environment:
dependencies:
flutter:
sdk: flutter
flutter_web_plugins:
sdk: flutter
js: ^0.6.3
dev_dependencies:
flutter_test:
sdk: flutter
flutter_web_plugins:
flutter_driver:
sdk: flutter
pedantic: ^1.11.1