fixed android content blocker, updated flutter driver tests

This commit is contained in:
Lorenzo Pichilli 2019-11-25 01:42:27 +01:00
parent 64f6995d83
commit ec47b1918d
47 changed files with 1973 additions and 701 deletions

View File

@ -9,6 +9,7 @@ about: Something is crashing or not working as intended
**App version:** <!-- Add branch if necessary --> **App version:** <!-- Add branch if necessary -->
**Android version:** <!-- If customize ROM, write which --> **Android version:** <!-- If customize ROM, write which -->
**Device information:** <!-- Manufacturer and model --> **Device information:** <!-- Manufacturer and model -->
**Flutter version:** <!-- Flutter version used -->
## Description ## Description

File diff suppressed because it is too large Load Diff

View File

@ -66,6 +66,9 @@ public class ContentBlockerHandler {
for (ContentBlocker contentBlocker : ruleListCopy) { for (ContentBlocker contentBlocker : ruleListCopy) {
ContentBlockerTrigger trigger = contentBlocker.trigger; ContentBlockerTrigger trigger = contentBlocker.trigger;
List<ContentBlockerTriggerResourceType> resourceTypes = trigger.resourceType; List<ContentBlockerTriggerResourceType> resourceTypes = trigger.resourceType;
if (resourceTypes.contains(ContentBlockerTriggerResourceType.IMAGE) && !resourceTypes.contains(ContentBlockerTriggerResourceType.SVG_DOCUMENT)) {
resourceTypes.add(ContentBlockerTriggerResourceType.SVG_DOCUMENT);
}
ContentBlockerAction action = contentBlocker.action; ContentBlockerAction action = contentBlocker.action;
@ -173,6 +176,7 @@ public class ContentBlockerHandler {
? contentTypeSplitted[1].replace("charset=", "").trim() ? contentTypeSplitted[1].replace("charset=", "").trim()
: "utf-8"; : "utf-8";
response.body().close();
response.close(); response.close();
return new WebResourceResponse(contentType, encoding, dataStream); return new WebResourceResponse(contentType, encoding, dataStream);
@ -180,6 +184,7 @@ public class ContentBlockerHandler {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
if (response != null) { if (response != null) {
response.body().close();
response.close(); response.close();
} }
Log.e(LOG_TAG, e.getMessage()); Log.e(LOG_TAG, e.getMessage());
@ -220,12 +225,14 @@ public class ContentBlockerHandler {
? contentTypeSplitted[1].replace("charset=", "").trim() ? contentTypeSplitted[1].replace("charset=", "").trim()
: "utf-8"; : "utf-8";
response.body().close();
response.close(); response.close();
responseResourceType = getResourceTypeFromContentType(contentType); responseResourceType = getResourceTypeFromContentType(contentType);
} }
} catch (Exception e) { } catch (Exception e) {
if (response != null) { if (response != null) {
response.body().close();
response.close(); response.close();
} }
e.printStackTrace(); e.printStackTrace();

View File

@ -2,7 +2,7 @@
# This is a generated file; do not edit or check into version control. # This is a generated file; do not edit or check into version control.
export "FLUTTER_ROOT=/Users/lorenzopichilli/flutter" export "FLUTTER_ROOT=/Users/lorenzopichilli/flutter"
export "FLUTTER_APPLICATION_PATH=/Users/lorenzopichilli/Desktop/flutter_inappbrowser/example" export "FLUTTER_APPLICATION_PATH=/Users/lorenzopichilli/Desktop/flutter_inappbrowser/example"
export "FLUTTER_TARGET=lib/main.dart" export "FLUTTER_TARGET=/Users/lorenzopichilli/Desktop/flutter_inappbrowser/example/test_driver/app.dart"
export "FLUTTER_BUILD_DIR=build" export "FLUTTER_BUILD_DIR=build"
export "SYMROOT=${SOURCE_ROOT}/../build/ios" export "SYMROOT=${SOURCE_ROOT}/../build/ios"
export "FLUTTER_FRAMEWORK_DIR=/Users/lorenzopichilli/flutter/bin/cache/artifacts/engine/ios" export "FLUTTER_FRAMEWORK_DIR=/Users/lorenzopichilli/flutter/bin/cache/artifacts/engine/ios"

View File

@ -31,6 +31,7 @@ class _InAppWebViewExampleScreenState extends State<InAppWebViewExampleScreen> {
InAppWebViewController webView; InAppWebViewController webView;
String url = ""; String url = "";
double progress = 0; double progress = 0;
CookieManager cookieManager = CookieManager.instance();
TextEditingController _textFieldController = TextEditingController(); TextEditingController _textFieldController = TextEditingController();
@ -124,7 +125,8 @@ class _InAppWebViewExampleScreenState extends State<InAppWebViewExampleScreen> {
//initialUrl: "chrome://safe-browsing/match?type=malware", //initialUrl: "chrome://safe-browsing/match?type=malware",
//initialUrl: "http://192.168.1.20:8081/", //initialUrl: "http://192.168.1.20:8081/",
//initialUrl: "https://192.168.1.20:4433/", //initialUrl: "https://192.168.1.20:4433/",
initialFile: "assets/index.html", //initialFile: "assets/index.html",
initialUrl: "https://flutter.dev/",
initialHeaders: {}, initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions( initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions( inAppWebViewOptions: InAppWebViewOptions(
@ -134,7 +136,7 @@ class _InAppWebViewExampleScreenState extends State<InAppWebViewExampleScreen> {
clearCache: true, clearCache: true,
//useShouldOverrideUrlLoading: true, //useShouldOverrideUrlLoading: true,
useOnTargetBlank: true, useOnTargetBlank: true,
//useOnLoadResource: true, useOnLoadResource: true,
//useOnDownloadStart: true, //useOnDownloadStart: true,
//useShouldInterceptAjaxRequest: true, //useShouldInterceptAjaxRequest: true,
//useShouldInterceptFetchRequest: true, //useShouldInterceptFetchRequest: true,
@ -151,7 +153,7 @@ class _InAppWebViewExampleScreenState extends State<InAppWebViewExampleScreen> {
ContentBlockerTriggerResourceType.STYLE_SHEET ContentBlockerTriggerResourceType.STYLE_SHEET
], ],
ifTopUrl: [ ifTopUrl: [
"https://getbootstrap.com/" "https://flutter.dev/"
]), ]),
action: ContentBlockerAction( action: ContentBlockerAction(
type: ContentBlockerActionType.BLOCK)) type: ContentBlockerActionType.BLOCK))
@ -195,11 +197,13 @@ class _InAppWebViewExampleScreenState extends State<InAppWebViewExampleScreen> {
}, },
onLoadStop: (InAppWebViewController controller, String url) async { onLoadStop: (InAppWebViewController controller, String url) async {
print("stopped $url"); print("stopped $url");
if (Platform.isAndroid) { if (Platform.isAndroid) {
controller.clearSslPreferences(); controller.clearSslPreferences();
controller.clearClientCertPreferences(); controller.clearClientCertPreferences();
} }
//controller.findAllAsync("flutter"); //controller.findAllAsync(find: "InAppWebView");
//controller.findAllAsync(find: "InAppWebViewInitialFileTest");
print(await controller.getFavicons()); print(await controller.getFavicons());
print(await CookieManager.instance().getCookies(url: url)); print(await CookieManager.instance().getCookies(url: url));
//await CookieManager.instance().setCookie(url: url, name: "myCookie", value: "myValue"); //await CookieManager.instance().setCookie(url: url, name: "myCookie", value: "myValue");

View File

@ -53,11 +53,8 @@ flutter:
- test_assets/in_app_webview_initial_file_test.html - test_assets/in_app_webview_initial_file_test.html
- test_assets/in_app_webview_on_load_resource_test.html - test_assets/in_app_webview_on_load_resource_test.html
- test_assets/in_app_webview_javascript_handler_test.html - test_assets/in_app_webview_javascript_handler_test.html
- test_assets/in_app_webview_ajax_test.html
- test_assets/in_app_webview_fetch_test.html
- test_assets/in_app_webview_on_load_resource_custom_scheme_test.html - test_assets/in_app_webview_on_load_resource_custom_scheme_test.html
- test_assets/in_app_webview_on_console_message_test.html - test_assets/in_app_webview_on_console_message_test.html
- test_assets/in_app_webview_on_download_start_test.html
- test_assets/in_app_webview_on_target_blank_test.html - test_assets/in_app_webview_on_target_blank_test.html
- test_assets/in_app_webview_on_js_dialog_test.html - test_assets/in_app_webview_on_js_dialog_test.html
- test_assets/css/ - test_assets/css/

View File

@ -1,24 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>InAppWebViewAjaxTest</title>
</head>
<body>
<h1>InAppWebViewAjaxTest</h1>
<script>
window.addEventListener('flutterInAppBrowserPlatformReady', function(event) {
var xhttp = new XMLHttpRequest();
xhttp.open("POST", "http://192.168.1.20:8082/test-ajax-post");
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("firstname=Foo&lastname=Bar");
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "http://192.168.1.20:8082/test-download-file");
xhttp2.send();
});
</script>
</body>
</html>

View File

@ -1,40 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>InAppWebViewFetchTest</title>
</head>
<body>
<h1>InAppWebViewFetchTest</h1>
<script>
window.addEventListener('flutterInAppBrowserPlatformReady', function(event) {
fetch(new Request("http://192.168.1.20:8082/test-download-file")).then(function(response) {
window.flutter_inappbrowser.callHandler('fetchGet', response.status);
}).catch(function(error) {
window.flutter_inappbrowser.callHandler('fetchGet', "ERROR: " + error);
});
fetch("http://192.168.1.20:8082/test-ajax-post", {
method: 'POST',
body: JSON.stringify({
firstname: 'Foo',
lastname: 'Bar'
}),
headers: {
'Content-Type': 'application/json'
}
}).then(function(response) {
response.json().then(function(value) {
window.flutter_inappbrowser.callHandler('fetchPost', value);
}).catch(function(error) {
window.flutter_inappbrowser.callHandler('fetchPost', "ERROR: " + error);
});
}).catch(function(error) {
window.flutter_inappbrowser.callHandler('fetchPost', "ERROR: " + error);
});
});
</script>
</body>
</html>

View File

@ -1,18 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>InAppWebViewOnDownloadStartTest</title>
</head>
<body>
<h1>InAppWebViewOnDownloadStartTest</h1>
<a id="download-file" href="http://192.168.1.20:8082/test-download-file">download file</a>
<script>
window.addEventListener("flutterInAppBrowserPlatformReady", function(event) {
document.querySelector("#download-file").click();
});
</script>
</body>
</html>

View File

@ -0,0 +1,26 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>InAppWebViewOnNavigationStateChangeTest</title>
<base href="index.html">
</head>
<body>
<h1>InAppWebViewOnNavigationStateChangeTest</h1>
<script>
window.addEventListener("flutterInAppBrowserPlatformReady", function(event) {
var state = {}
var title = ''
var url = 'first-push';
history.pushState(state, title, url);
setTimeout(function() {
var url = 'second-push';
history.pushState(state, title, url);
}, 100);
});
</script>
</body>
</html>

View File

@ -0,0 +1 @@
final environment = {"NODE_SERVER_IP":"192.168.1.20"};

View File

@ -1,5 +1,4 @@
import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_driver/driver_extension.dart';
import 'app_test.dart';
import 'main_test.dart' as app; import 'main_test.dart' as app;
void main() { void main() {

View File

@ -1,8 +1,10 @@
// Imports the Flutter Driver API. // Imports the Flutter Driver API.
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'package:flutter_driver/flutter_driver.dart'; import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
import '.env.dart';
void main() { void main() {
@ -22,38 +24,101 @@ void main() {
} }
}); });
//
// IMPORTANT NOTE!!!
// These tests need to follow the same order of "var routes" in "buildRoutes()" function
// defined in main_test.dart
//
test('InAppWebViewInitialUrlTest', () async { test('InAppWebViewInitialUrlTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewInitialFileTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewInitialUrlTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewInitialUrlTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String url = await driver.getText(appBarTitle); String url = await driver.getText(appBarTitle);
expect(url, "https://flutter.dev/"); expect(url, "https://flutter.dev/");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewInitialFileTest', () async { test('InAppWebViewInitialFileTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewInitialDataTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewInitialFileTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewInitialFileTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String title = await driver.getText(appBarTitle); String title = await driver.getText(appBarTitle);
expect(title, "true"); expect(title, "true");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewInitialDataTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnProgressChangedTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewInitialDataTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(title, "true");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnProgressChangedTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnScrollChangedTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnProgressChangedTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(title, "true");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnScrollChangedTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnLoadResourceTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnScrollChangedTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(title, "true");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnLoadResourceTest', () async { test('InAppWebViewOnLoadResourceTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
List<String> resourceList = [ List<String> resourceList = [
"https://getbootstrap.com/docs/4.3/dist/css/bootstrap.min.css", "https://getbootstrap.com/docs/4.3/dist/css/bootstrap.min.css",
"https://code.jquery.com/jquery-3.3.1.min.js", "https://code.jquery.com/jquery-3.3.1.min.js",
@ -61,114 +126,177 @@ void main() {
]; ];
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewJavaScriptHandlerTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnLoadResourceTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewOnLoadResourceTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String title = await driver.getText(appBarTitle); String title = await driver.getText(appBarTitle);
for (String resource in resourceList) { for (String resource in resourceList) {
expect(true, title.contains(resource)); expect(true, title.contains(resource));
} }
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewJavaScriptHandlerTest', () async { test('InAppWebViewJavaScriptHandlerTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewAjaxTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewJavaScriptHandlerTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewJavaScriptHandlerTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String title = await driver.getText(appBarTitle); String title = await driver.getText(appBarTitle);
expect(true, !title.contains("false")); expect(true, !title.contains("false"));
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewAjaxTest', () async { test('InAppWebViewAjaxTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewFetchTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewAjaxTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewAjaxTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String title = await driver.getText(appBarTitle); String title = await driver.getText(appBarTitle);
expect(title, "Lorenzo Pichilli Lorenzo Pichilli"); expect(title, "Lorenzo Pichilli Lorenzo Pichilli");
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnLoadResourceCustomSchemeTest', () async { await driver.tap(sideMenuButton);
await Future.delayed(const Duration(milliseconds: 2000)); await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
final appBarTitle = find.byValueKey('AppBarTitle'); await driver.tap(nextTest);
while((await driver.getText(appBarTitle)) == "InAppWebViewOnLoadResourceCustomSchemeTest") {
await Future.delayed(const Duration(milliseconds: 1000));
}
String title = await driver.getText(appBarTitle);
expect(title, "true");
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewFetchTest', () async { test('InAppWebViewFetchTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnLoadResourceCustomSchemeTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewFetchTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewFetchTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String title = await driver.getText(appBarTitle); String title = await driver.getText(appBarTitle);
expect(true, title.contains("Lorenzo Pichilli") && title.contains("200")); expect(true, title.contains("Lorenzo Pichilli") && title.contains("200"));
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnLoadResourceCustomSchemeTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewShouldOverrideUrlLoadingTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnLoadResourceCustomSchemeTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(title, "true");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewShouldOverrideUrlLoadingTest', () async { test('InAppWebViewShouldOverrideUrlLoadingTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnConsoleMessageTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewShouldOverrideUrlLoadingTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewShouldOverrideUrlLoadingTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String url = await driver.getText(appBarTitle); String url = await driver.getText(appBarTitle);
expect(url, "https://flutter.dev/"); expect(url, "https://flutter.dev/");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnConsoleMessageTest', () async { test('InAppWebViewOnConsoleMessageTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnDownloadStartTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnConsoleMessageTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewOnConsoleMessageTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String title = await driver.getText(appBarTitle); String title = await driver.getText(appBarTitle);
expect(title, "message LOG"); expect(title, "message LOG");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnDownloadStartTest', () async { test('InAppWebViewOnDownloadStartTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnTargetBlankTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnDownloadStartTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewOnDownloadStartTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String url = await driver.getText(appBarTitle); String url = await driver.getText(appBarTitle);
expect(url, "http://192.168.1.20:8082/test-download-file"); expect(url, "http://${environment["NODE_SERVER_IP"]}:8082/test-download-file");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnTargetBlankTest', () async { test('InAppWebViewOnTargetBlankTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnJsDialogTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnTargetBlankTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewOnTargetBlankTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String url = await driver.getText(appBarTitle); String url = await driver.getText(appBarTitle);
expect(url, "https://flutter.dev/"); expect(url, "https://flutter.dev/");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnJsDialogTest', () async { test('InAppWebViewOnJsDialogTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final alertButtonOk = find.byValueKey('AlertButtonOk'); final alertButtonOk = find.byValueKey('AlertButtonOk');
final confirmButtonCancel = find.byValueKey('ConfirmButtonCancel'); final confirmButtonCancel = find.byValueKey('ConfirmButtonCancel');
@ -177,8 +305,12 @@ void main() {
final promptButtonCancel = find.byValueKey('PromptButtonCancel'); final promptButtonCancel = find.byValueKey('PromptButtonCancel');
final promptButtonOk = find.byValueKey('PromptButtonOk'); final promptButtonOk = find.byValueKey('PromptButtonOk');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnSafeBrowsingHitTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnJsDialogTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewOnJsDialogTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
await driver.tap(alertButtonOk); await driver.tap(alertButtonOk);
@ -204,30 +336,196 @@ void main() {
title = await driver.getText(appBarTitle); title = await driver.getText(appBarTitle);
expect(title, "prompt new value"); expect(title, "prompt new value");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnSafeBrowsingHitTest', () async { test('InAppWebViewOnSafeBrowsingHitTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnReceivedHttpAuthRequestTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnSafeBrowsingHitTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewOnSafeBrowsingHitTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String url = await driver.getText(appBarTitle); String url = await driver.getText(appBarTitle);
if (Platform.isAndroid)
expect(url, "chrome://safe-browsing/match?type=malware"); expect(url, "chrome://safe-browsing/match?type=malware");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnReceivedHttpAuthRequestTest', () async { test('InAppWebViewOnReceivedHttpAuthRequestTest', () async {
await Future.delayed(const Duration(milliseconds: 2000));
final appBarTitle = find.byValueKey('AppBarTitle'); final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewSslRequestTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnReceivedHttpAuthRequestTest") { while((await driver.getText(appBarTitle)) == "InAppWebViewOnReceivedHttpAuthRequestTest") {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 500));
} }
String title = await driver.getText(appBarTitle); String title = await driver.getText(appBarTitle);
expect(title, "Authorized"); expect(title, "Authorized");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewSslRequestTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnFindResultReceivedTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewSslRequestTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(title, "Authorized");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnFindResultReceivedTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnNavigationStateChangeTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnFindResultReceivedTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(title, "2");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnNavigationStateChangeTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnLoadErrorTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnNavigationStateChangeTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(true, title.contains("first-push") && title.contains("second-push"));
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnLoadErrorTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewOnLoadHttpErrorTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnLoadErrorTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
if (Platform.isAndroid) {
expect(title, "-2");
} else if (Platform.isIOS) {
expect(title, "-1022");
}
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewOnLoadHttpErrorTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewCookieManagerTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewOnLoadHttpErrorTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(title, "404");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewCookieManagerTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewHttpAuthCredentialDatabaseTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewCookieManagerTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(title, "myValue true true");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewHttpAuthCredentialDatabaseTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
final sideMenuButton = find.byValueKey('SideMenu');
final listTiles = find.byValueKey('ListTiles');
final nextTest = find.byValueKey('InAppWebViewContentBlockerTest');
while((await driver.getText(appBarTitle)) == "InAppWebViewHttpAuthCredentialDatabaseTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(title, "Authorized true true");
await driver.tap(sideMenuButton);
await driver.scrollUntilVisible(listTiles, nextTest, dyScroll: -300.0);
await driver.tap(nextTest);
}, timeout: new Timeout(new Duration(minutes: 5)));
test('InAppWebViewContentBlockerTest', () async {
final appBarTitle = find.byValueKey('AppBarTitle');
while((await driver.getText(appBarTitle)) == "InAppWebViewContentBlockerTest") {
await Future.delayed(const Duration(milliseconds: 500));
}
String title = await driver.getText(appBarTitle);
expect(title, "true");
}, timeout: new Timeout(new Duration(minutes: 5))); }, timeout: new Timeout(new Duration(minutes: 5)));
}); });

View File

@ -1,3 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
@ -14,6 +15,7 @@ class WidgetTest extends StatefulWidget {
} }
class WidgetTestState extends State<WidgetTest> { class WidgetTestState extends State<WidgetTest> {
final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
InAppWebViewController webView; InAppWebViewController webView;
String appBarTitle; String appBarTitle;

View File

@ -3,8 +3,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
import '.env.dart';
class InAppWebViewAjaxTest extends WidgetTest { class InAppWebViewAjaxTest extends WidgetTest {
final InAppWebViewAjaxTestState state = InAppWebViewAjaxTestState(); final InAppWebViewAjaxTestState state = InAppWebViewAjaxTestState();
@ -21,13 +21,40 @@ class InAppWebViewAjaxTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
child: Container( child: Container(
child: InAppWebView( child: InAppWebView(
initialFile: "test_assets/in_app_webview_ajax_test.html", initialData: InAppWebViewInitialData(data: """
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>InAppWebViewAjaxTest</title>
</head>
<body>
<h1>InAppWebViewAjaxTest</h1>
<script>
window.addEventListener('flutterInAppBrowserPlatformReady', function(event) {
var xhttp = new XMLHttpRequest();
xhttp.open("POST", "http://${environment["NODE_SERVER_IP"]}:8082/test-ajax-post");
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("firstname=Foo&lastname=Bar");
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "http://${environment["NODE_SERVER_IP"]}:8082/test-download-file");
xhttp2.send();
});
</script>
</body>
</html>
"""),
initialHeaders: {}, initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions( initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions( inAppWebViewOptions: InAppWebViewOptions(
@ -80,7 +107,6 @@ class InAppWebViewAjaxTestState extends WidgetTestState {
testsDone++; testsDone++;
if (testsDone == totTests) { if (testsDone == totTests) {
setState(() { }); setState(() { });
nextTest(context: context, state: this);
} }
} }
} }

View File

@ -0,0 +1,70 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart';
import 'main_test.dart';
class InAppWebViewContentBlockerTest extends WidgetTest {
final InAppWebViewContentBlockerTestState state = InAppWebViewContentBlockerTestState();
@override
InAppWebViewContentBlockerTestState createState() => state;
}
class InAppWebViewContentBlockerTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewContentBlockerTest";
@override
Widget build(BuildContext context) {
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl: "https://flutter.dev/",
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true,
contentBlockers: [
ContentBlocker(
trigger: ContentBlockerTrigger(
urlFilter: ".*",
resourceType: [
ContentBlockerTriggerResourceType.IMAGE,
ContentBlockerTriggerResourceType.STYLE_SHEET
],
ifTopUrl: [
"https://flutter.dev/"
]),
action: ContentBlockerAction(
type: ContentBlockerActionType.BLOCK))
]
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) {
setState(() {
appBarTitle = "true";
});
},
),
),
),
])
)
);
}
}

View File

@ -0,0 +1,69 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart';
import 'main_test.dart';
class InAppWebViewCookieManagerTest extends WidgetTest {
final InAppWebViewCookieManagerTestState state = InAppWebViewCookieManagerTestState();
@override
InAppWebViewCookieManagerTestState createState() => state;
}
class InAppWebViewCookieManagerTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewCookieManagerTest";
CookieManager cookieManager = CookieManager.instance();
@override
Widget build(BuildContext context) {
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl: "https://flutter.dev/",
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) async {
var title = "";
await cookieManager.getCookies(url: url);
await cookieManager.setCookie(url: url, name: "myCookie", value: "myValue");
Cookie cookie = await cookieManager.getCookie(url: url, name: "myCookie");
title = cookie.value.toString();
await cookieManager.deleteCookie(url: url, name: "myCookie");
cookie = await cookieManager.getCookie(url: url, name: "myCookie");
title += " " + ((cookie == null) ? "true" : "false");
await cookieManager.deleteCookies(url: url);
List<Cookie> cookies = await cookieManager.getCookies(url: url);
title += " " + ((cookies.length == 0) ? "true" : "false");
setState(() {
appBarTitle = title;
});
},
),
),
),
])
)
);
}
}

View File

@ -5,8 +5,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
import '.env.dart';
class InAppWebViewFetchTest extends WidgetTest { class InAppWebViewFetchTest extends WidgetTest {
final InAppWebViewFetchTestState state = InAppWebViewFetchTestState(); final InAppWebViewFetchTestState state = InAppWebViewFetchTestState();
@ -23,13 +23,56 @@ class InAppWebViewFetchTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
child: Container( child: Container(
child: InAppWebView( child: InAppWebView(
initialFile: "test_assets/in_app_webview_fetch_test.html", initialData: InAppWebViewInitialData(data: """
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>InAppWebViewFetchTest</title>
</head>
<body>
<h1>InAppWebViewFetchTest</h1>
<script>
window.addEventListener('flutterInAppBrowserPlatformReady', function(event) {
fetch(new Request("http://${environment["NODE_SERVER_IP"]}:8082/test-download-file")).then(function(response) {
window.flutter_inappbrowser.callHandler('fetchGet', response.status);
}).catch(function(error) {
window.flutter_inappbrowser.callHandler('fetchGet', "ERROR: " + error);
});
fetch("http://${environment["NODE_SERVER_IP"]}:8082/test-ajax-post", {
method: 'POST',
body: JSON.stringify({
firstname: 'Foo',
lastname: 'Bar'
}),
headers: {
'Content-Type': 'application/json'
}
}).then(function(response) {
response.json().then(function(value) {
window.flutter_inappbrowser.callHandler('fetchPost', value);
}).catch(function(error) {
window.flutter_inappbrowser.callHandler('fetchPost', "ERROR: " + error);
});
}).catch(function(error) {
window.flutter_inappbrowser.callHandler('fetchPost', "ERROR: " + error);
});
});
</script>
</body>
</html>
"""),
initialHeaders: {}, initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions( initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions( inAppWebViewOptions: InAppWebViewOptions(
@ -79,7 +122,6 @@ class InAppWebViewFetchTestState extends WidgetTestState {
testsDone++; testsDone++;
if (testsDone == totTests) { if (testsDone == totTests) {
setState(() { }); setState(() { });
nextTest(context: context, state: this);
} }
} }
} }

View File

@ -0,0 +1,79 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart';
import 'main_test.dart';
import '.env.dart';
class InAppWebViewHttpAuthCredentialDatabaseTest extends WidgetTest {
final InAppWebViewHttpAuthCredentialDatabaseTestState state = InAppWebViewHttpAuthCredentialDatabaseTestState();
@override
InAppWebViewHttpAuthCredentialDatabaseTestState createState() => state;
}
class InAppWebViewHttpAuthCredentialDatabaseTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewHttpAuthCredentialDatabaseTest";
HttpAuthCredentialDatabase httpAuthCredentialDatabase = HttpAuthCredentialDatabase.instance();
@override
Widget build(BuildContext context) {
httpAuthCredentialDatabase.setHttpAuthCredential(
protectionSpace: ProtectionSpace(host: environment["NODE_SERVER_IP"], protocol: "http", realm: "Node", port: 8081),
credential: HttpAuthCredential(username: "USERNAME", password: "PASSWORD")
);
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl: "http://${environment["NODE_SERVER_IP"]}:8081/",
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) async {
var title = "";
String h1Content = await controller.evaluateJavascript(source: "document.body.querySelector('h1').textContent");
title = h1Content;
var credentials = await httpAuthCredentialDatabase.getHttpAuthCredentials(protectionSpace:
ProtectionSpace(host: environment["NODE_SERVER_IP"], protocol: "http", realm: "Node", port: 8081)
);
title += " " + ((credentials.length == 1) ? "true" : "false");
await httpAuthCredentialDatabase.clearAllAuthCredentials();
credentials = await httpAuthCredentialDatabase.getHttpAuthCredentials(protectionSpace:
ProtectionSpace(host: environment["NODE_SERVER_IP"], protocol: "http", realm: "Node", port: 8081)
);
title += " " + ((credentials.length == 0) ? "true" : "false");
setState(() {
appBarTitle = title;
});
},
onReceivedHttpAuthRequest: (InAppWebViewController controller, HttpAuthChallenge challenge) async {
return new HttpAuthResponse(action: HttpAuthResponseAction.USE_SAVED_HTTP_AUTH_CREDENTIALS);
},
),
),
),
])
)
);
}
}

View File

@ -0,0 +1,92 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart';
import 'custom_widget_test.dart';
class InAppWebViewInitialDataTest extends WidgetTest {
final InAppWebViewInitialDataTestState state = InAppWebViewInitialDataTestState();
@override
InAppWebViewInitialDataTestState createState() => state;
}
class InAppWebViewInitialDataTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewInitialDataTest";
@override
Widget build(BuildContext context) {
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialData: InAppWebViewInitialData(data: """
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>InAppWebViewInitialDataTest</title>
<link rel="stylesheet" href="https://getbootstrap.com/docs/4.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="css/style.css">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<link rel="shortcut icon" href="favicon.ico">
</head>
<body class="text-center">
<div class="cover-container d-flex w-100 h-100 p-3 mx-auto flex-column">
<header class="masthead mb-auto">
<div class="inner">
<h3 class="masthead-brand">InAppWebViewInitialDataTest</h3>
<nav class="nav nav-masthead justify-content-center">
<a class="nav-link active" href="index.html">Home</a>
<a class="nav-link" href="page-1.html">Page 1</a>
<a class="nav-link" href="page-2.html">Page 2</a>
</nav>
</div>
</header>
<main role="main" class="inner cover">
<h1 class="cover-heading">InAppWebViewInitialFileTest</h1>
<img src="images/flutter-logo.svg" alt="flutter logo">
<p>
<img src="https://via.placeholder.com/100x50" alt="placeholder 100x50">
</p>
<a id="link" href="https://github.com/pichillilorenzo/flutter_inappbrowser">flutter_inappbrowser</a>
</main>
</div>
</body>
</html>
"""),
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) {
setState(() {
appBarTitle = "true";
});
},
),
),
),
])
)
);
}
}

View File

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
class InAppWebViewInitialFileTest extends WidgetTest { class InAppWebViewInitialFileTest extends WidgetTest {
@ -19,7 +18,9 @@ class InAppWebViewInitialFileTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
@ -43,7 +44,6 @@ class InAppWebViewInitialFileTestState extends WidgetTestState {
setState(() { setState(() {
appBarTitle = "true"; appBarTitle = "true";
}); });
nextTest(context: context, state: this);
}, },
), ),
), ),

View File

@ -4,7 +4,6 @@ import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
class InAppWebViewInitialUrlTest extends WidgetTest { class InAppWebViewInitialUrlTest extends WidgetTest {
final InAppWebViewInitialUrlTestState state = InAppWebViewInitialUrlTestState(); final InAppWebViewInitialUrlTestState state = InAppWebViewInitialUrlTestState();
@ -20,7 +19,9 @@ class InAppWebViewInitialUrlTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
@ -44,7 +45,6 @@ class InAppWebViewInitialUrlTestState extends WidgetTestState {
setState(() { setState(() {
appBarTitle = url; appBarTitle = url;
}); });
nextTest(context: context, state: this);
}, },
), ),
), ),

View File

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
class Foo { class Foo {
@ -34,7 +33,9 @@ class InAppWebViewJavaScriptHandlerTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
@ -64,7 +65,6 @@ class InAppWebViewJavaScriptHandlerTestState extends WidgetTestState {
appBarTitle += " " + (args[3] is Map).toString(); appBarTitle += " " + (args[3] is Map).toString();
appBarTitle += " " + (args[4] is Map).toString(); appBarTitle += " " + (args[4] is Map).toString();
setState(() { }); setState(() { });
nextTest(context: context, state: this);
}); });
}, },

View File

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
class InAppWebViewOnConsoleMessageTest extends WidgetTest { class InAppWebViewOnConsoleMessageTest extends WidgetTest {
@ -19,7 +18,9 @@ class InAppWebViewOnConsoleMessageTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
@ -46,7 +47,6 @@ class InAppWebViewOnConsoleMessageTestState extends WidgetTestState {
setState(() { setState(() {
appBarTitle = consoleMessage.message + " " + consoleMessage.messageLevel.toString(); appBarTitle = consoleMessage.message + " " + consoleMessage.messageLevel.toString();
}); });
nextTest(context: context, state: this);
}, },
), ),
), ),

View File

@ -3,8 +3,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
import '.env.dart';
class InAppWebViewOnDownloadStartTest extends WidgetTest { class InAppWebViewOnDownloadStartTest extends WidgetTest {
final InAppWebViewOnDownloadStartTestState state = InAppWebViewOnDownloadStartTestState(); final InAppWebViewOnDownloadStartTestState state = InAppWebViewOnDownloadStartTestState();
@ -19,13 +19,34 @@ class InAppWebViewOnDownloadStartTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
child: Container( child: Container(
child: InAppWebView( child: InAppWebView(
initialFile: "test_assets/in_app_webview_on_download_start_test.html", initialData: InAppWebViewInitialData(data: """
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>InAppWebViewOnDownloadStartTest</title>
</head>
<body>
<h1>InAppWebViewOnDownloadStartTest</h1>
<a id="download-file" href="http://${environment["NODE_SERVER_IP"]}:8082/test-download-file">download file</a>
<script>
window.addEventListener("flutterInAppBrowserPlatformReady", function(event) {
document.querySelector("#download-file").click();
});
</script>
</body>
</html>
"""),
initialHeaders: {}, initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions( initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions( inAppWebViewOptions: InAppWebViewOptions(
@ -47,7 +68,6 @@ class InAppWebViewOnDownloadStartTestState extends WidgetTestState {
setState(() { setState(() {
appBarTitle = url; appBarTitle = url;
}); });
nextTest(context: context, state: this);
}, },
), ),
), ),

View File

@ -0,0 +1,60 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart';
import 'custom_widget_test.dart';
class InAppWebViewOnFindResultReceivedTest extends WidgetTest {
final InAppWebViewOnFindResultReceivedTestState state = InAppWebViewOnFindResultReceivedTestState();
@override
InAppWebViewOnFindResultReceivedTestState createState() => state;
}
class InAppWebViewOnFindResultReceivedTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewOnFindResultReceivedTest";
@override
Widget build(BuildContext context) {
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialFile: "test_assets/in_app_webview_initial_file_test.html",
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) {
controller.findAllAsync(find: "InAppWebViewInitialFileTest");
},
onFindResultReceived: (InAppWebViewController controller, int activeMatchOrdinal, int numberOfMatches, bool isDoneCounting) async {
if (isDoneCounting) {
setState(() {
appBarTitle = numberOfMatches.toString();
});
}
},
),
),
),
])
)
);
}
}

View File

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
class InAppWebViewOnJsDialogTest extends WidgetTest { class InAppWebViewOnJsDialogTest extends WidgetTest {
@ -27,7 +26,9 @@ class InAppWebViewOnJsDialogTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
@ -54,7 +55,6 @@ class InAppWebViewOnJsDialogTestState extends WidgetTestState {
setState(() { setState(() {
appBarTitle = "prompt " + args[0]; appBarTitle = "prompt " + args[0];
}); });
nextTest(context: context, state: this);
}); });
}, },
onLoadStart: (InAppWebViewController controller, String url) { onLoadStart: (InAppWebViewController controller, String url) {

View File

@ -0,0 +1,59 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart';
import 'main_test.dart';
class InAppWebViewOnLoadErrorTest extends WidgetTest {
final InAppWebViewOnLoadErrorTestState state = InAppWebViewOnLoadErrorTestState();
@override
InAppWebViewOnLoadErrorTestState createState() => state;
}
class InAppWebViewOnLoadErrorTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewOnLoadErrorTest";
@override
Widget build(BuildContext context) {
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl: "http://not-existing-domain.org/",
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) {
},
onLoadError: (InAppWebViewController controller, String url, int code, String message) async {
setState(() {
appBarTitle = code.toString();
});
}
),
),
),
])
)
);
}
}

View File

@ -0,0 +1,59 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart';
import 'main_test.dart';
class InAppWebViewOnLoadHttpErrorTest extends WidgetTest {
final InAppWebViewOnLoadHttpErrorTestState state = InAppWebViewOnLoadHttpErrorTestState();
@override
InAppWebViewOnLoadHttpErrorTestState createState() => state;
}
class InAppWebViewOnLoadHttpErrorTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewOnLoadHttpErrorTest";
@override
Widget build(BuildContext context) {
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl: "https://google.com/404",
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) {
},
onLoadHttpError: (InAppWebViewController controller, String url, int statusCode, String description) async {
setState(() {
appBarTitle = statusCode.toString();
});
},
),
),
),
])
)
);
}
}

View File

@ -4,7 +4,6 @@ import 'package:flutter/services.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
class InAppWebViewOnLoadResourceCustomSchemeTest extends WidgetTest { class InAppWebViewOnLoadResourceCustomSchemeTest extends WidgetTest {
@ -20,7 +19,9 @@ class InAppWebViewOnLoadResourceCustomSchemeTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
@ -42,7 +43,6 @@ class InAppWebViewOnLoadResourceCustomSchemeTestState extends WidgetTestState {
setState(() { setState(() {
appBarTitle = "true"; appBarTitle = "true";
}); });
nextTest(context: context, state: this);
}); });
}, },
onLoadStart: (InAppWebViewController controller, String url) { onLoadStart: (InAppWebViewController controller, String url) {

View File

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
class InAppWebViewOnLoadResourceTest extends WidgetTest { class InAppWebViewOnLoadResourceTest extends WidgetTest {
@ -25,7 +24,9 @@ class InAppWebViewOnLoadResourceTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
@ -54,7 +55,6 @@ class InAppWebViewOnLoadResourceTestState extends WidgetTestState {
countResources++; countResources++;
if (countResources == resourceList.length) { if (countResources == resourceList.length) {
setState(() { }); setState(() { });
nextTest(context: context, state: this);
} }
} }
), ),

View File

@ -0,0 +1,72 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart';
import 'custom_widget_test.dart';
class InAppWebViewOnNavigationStateChangeTest extends WidgetTest {
final InAppWebViewOnNavigationStateChangeTestState state = InAppWebViewOnNavigationStateChangeTestState();
@override
InAppWebViewOnNavigationStateChangeTestState createState() => state;
}
class InAppWebViewOnNavigationStateChangeTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewOnNavigationStateChangeTest";
@override
Widget build(BuildContext context) {
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl: "https://flutter.dev/",
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) {
controller.evaluateJavascript(source: """
var state = {}
var title = ''
var url = 'first-push';
history.pushState(state, title, url);
setTimeout(function() {
var url = 'second-push';
history.pushState(state, title, url);
}, 100);
""");
},
onNavigationStateChange: (InAppWebViewController controller, String url) async {
if (url.endsWith("second-push")) {
setState(() {
appBarTitle += " " + url;
});
} else {
appBarTitle = url;
}
},
),
),
),
])
)
);
}
}

View File

@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart';
import 'main_test.dart';
class InAppWebViewOnProgressChangedTest extends WidgetTest {
final InAppWebViewOnProgressChangedTestState state = InAppWebViewOnProgressChangedTestState();
@override
InAppWebViewOnProgressChangedTestState createState() => state;
}
class InAppWebViewOnProgressChangedTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewOnProgressChangedTest";
@override
Widget build(BuildContext context) {
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl: "https://flutter.dev/",
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) {
},
onProgressChanged: (InAppWebViewController controller, int progress) {
if (progress == 100) {
setState(() {
appBarTitle = "true";
});
}
},
),
),
),
])
)
);
}
}

View File

@ -4,7 +4,7 @@ import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart'; import '.env.dart';
class InAppWebViewOnReceivedHttpAuthRequestTest extends WidgetTest { class InAppWebViewOnReceivedHttpAuthRequestTest extends WidgetTest {
final InAppWebViewOnReceivedHttpAuthRequestTestState state = InAppWebViewOnReceivedHttpAuthRequestTestState(); final InAppWebViewOnReceivedHttpAuthRequestTestState state = InAppWebViewOnReceivedHttpAuthRequestTestState();
@ -20,13 +20,15 @@ class InAppWebViewOnReceivedHttpAuthRequestTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
child: Container( child: Container(
child: InAppWebView( child: InAppWebView(
initialUrl: "http://192.168.1.20:8081/", initialUrl: "http://${environment["NODE_SERVER_IP"]}:8081/",
initialHeaders: {}, initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions( initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions( inAppWebViewOptions: InAppWebViewOptions(
@ -45,7 +47,6 @@ class InAppWebViewOnReceivedHttpAuthRequestTestState extends WidgetTestState {
setState(() { setState(() {
appBarTitle = h1Content; appBarTitle = h1Content;
}); });
nextTest(context: context, state: this);
}, },
onReceivedHttpAuthRequest: (InAppWebViewController controller, HttpAuthChallenge challenge) async { onReceivedHttpAuthRequest: (InAppWebViewController controller, HttpAuthChallenge challenge) async {
return new HttpAuthResponse( return new HttpAuthResponse(

View File

@ -6,7 +6,6 @@ import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
class InAppWebViewOnSafeBrowsingHitTest extends WidgetTest { class InAppWebViewOnSafeBrowsingHitTest extends WidgetTest {
final InAppWebViewOnSafeBrowsingHitTestState state = InAppWebViewOnSafeBrowsingHitTestState(); final InAppWebViewOnSafeBrowsingHitTestState state = InAppWebViewOnSafeBrowsingHitTestState();
@ -22,13 +21,15 @@ class InAppWebViewOnSafeBrowsingHitTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
child: Container( child: Container(
child: InAppWebView( child: InAppWebView(
initialUrl: "chrome://safe-browsing/match?type=malware", initialUrl: (Platform.isAndroid) ? "chrome://safe-browsing/match?type=malware" : "https://flutter.dev/",
initialHeaders: {}, initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions( initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions( inAppWebViewOptions: InAppWebViewOptions(
@ -38,8 +39,6 @@ class InAppWebViewOnSafeBrowsingHitTestState extends WidgetTestState {
debuggingEnabled: true debuggingEnabled: true
), ),
androidInAppWebViewOptions: AndroidInAppWebViewOptions( androidInAppWebViewOptions: AndroidInAppWebViewOptions(
databaseEnabled: true,
domStorageEnabled: true,
safeBrowsingEnabled: true, safeBrowsingEnabled: true,
), ),
), ),
@ -55,7 +54,6 @@ class InAppWebViewOnSafeBrowsingHitTestState extends WidgetTestState {
setState(() { setState(() {
appBarTitle = url; appBarTitle = url;
}); });
nextTest(context: context, state: this);
}, },
onSafeBrowsingHit: (InAppWebViewController controller, String url, SafeBrowsingThreat threatType) async { onSafeBrowsingHit: (InAppWebViewController controller, String url, SafeBrowsingThreat threatType) async {
return SafeBrowsingResponse(report: true, action: SafeBrowsingResponseAction.PROCEED); return SafeBrowsingResponse(report: true, action: SafeBrowsingResponseAction.PROCEED);

View File

@ -0,0 +1,63 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart';
import 'main_test.dart';
class InAppWebViewOnScrollChangedTest extends WidgetTest {
final InAppWebViewOnScrollChangedTestState state = InAppWebViewOnScrollChangedTestState();
@override
InAppWebViewOnScrollChangedTestState createState() => state;
}
class InAppWebViewOnScrollChangedTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewOnScrollChangedTest";
bool scrolled = false;
@override
Widget build(BuildContext context) {
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl: "https://flutter.dev/",
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) {
controller.scrollTo(x: 0, y: 500);
},
onScrollChanged: (InAppWebViewController controller, int x, int y) {
if (!scrolled) {
scrolled = true;
setState(() {
appBarTitle = "true";
});
}
},
),
),
),
])
)
);
}
}

View File

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
class InAppWebViewOnTargetBlankTest extends WidgetTest { class InAppWebViewOnTargetBlankTest extends WidgetTest {
@ -19,7 +18,9 @@ class InAppWebViewOnTargetBlankTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
@ -46,7 +47,6 @@ class InAppWebViewOnTargetBlankTestState extends WidgetTestState {
setState(() { setState(() {
appBarTitle = url; appBarTitle = url;
}); });
nextTest(context: context, state: this);
} }
}, },
onTargetBlank: (InAppWebViewController controller, String url) { onTargetBlank: (InAppWebViewController controller, String url) {

View File

@ -4,7 +4,6 @@ import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
import 'main_test.dart'; import 'main_test.dart';
import 'util_test.dart';
class InAppWebViewShouldOverrideUrlLoadingTest extends WidgetTest { class InAppWebViewShouldOverrideUrlLoadingTest extends WidgetTest {
final InAppWebViewShouldOverrideUrlLoadingTestState state = InAppWebViewShouldOverrideUrlLoadingTestState(); final InAppWebViewShouldOverrideUrlLoadingTestState state = InAppWebViewShouldOverrideUrlLoadingTestState();
@ -19,7 +18,9 @@ class InAppWebViewShouldOverrideUrlLoadingTestState extends WidgetTestState {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle), appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container( body: Container(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Expanded( Expanded(
@ -45,7 +46,6 @@ class InAppWebViewShouldOverrideUrlLoadingTestState extends WidgetTestState {
setState(() { setState(() {
appBarTitle = url; appBarTitle = url;
}); });
nextTest(context: context, state: this);
} else { } else {
controller.evaluateJavascript(source: "document.querySelector('#link').click();"); controller.evaluateJavascript(source: "document.querySelector('#link').click();");
} }

View File

@ -0,0 +1,70 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
import 'custom_widget_test.dart';
import 'main_test.dart';
import '.env.dart';
class InAppWebViewSslRequestTest extends WidgetTest {
final InAppWebViewSslRequestTestState state = InAppWebViewSslRequestTestState();
@override
InAppWebViewSslRequestTestState createState() => state;
}
class InAppWebViewSslRequestTestState extends WidgetTestState {
String appBarTitle = "InAppWebViewSslRequestTest";
@override
Widget build(BuildContext context) {
return Scaffold(
key: this.scaffoldKey,
appBar: myAppBar(state: this, title: appBarTitle),
drawer: myDrawer(context: context),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: Container(
child: InAppWebView(
initialUrl: "https://${environment["NODE_SERVER_IP"]}:4433/",
initialHeaders: {},
initialOptions: InAppWebViewWidgetOptions(
inAppWebViewOptions: InAppWebViewOptions(
clearCache: true,
debuggingEnabled: true
)
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) async {
String h1Content = await controller.evaluateJavascript(source: "document.body.querySelector('h1').textContent");
setState(() {
appBarTitle = h1Content;
});
},
onReceivedServerTrustAuthRequest: (InAppWebViewController controller, ServerTrustChallenge challenge) async {
return new ServerTrustAuthResponse(action: ServerTrustAuthResponseAction.PROCEED);
},
onReceivedClientCertRequest: (InAppWebViewController controller, ClientCertChallenge challenge) async {
return new ClientCertResponse(
certificatePath: "test_assets/certificate.pfx",
certificatePassword: "",
androidKeyStoreType: "PKCS12",
action: ClientCertResponseAction.PROCEED);
},
),
),
),
])
)
);
}
}

View File

@ -4,31 +4,43 @@ import 'package:flutter/material.dart';
import 'custom_widget_test.dart'; import 'custom_widget_test.dart';
import 'in_app_webview_ajax_test.dart'; import 'in_app_webview_ajax_test.dart';
import 'in_app_webview_content_blocker_test.dart';
import 'in_app_webview_cookie_manager_test.dart';
import 'in_app_webview_fetch_test.dart'; import 'in_app_webview_fetch_test.dart';
import 'in_app_webview_http_auth_credential_database_test.dart';
import 'in_app_webview_initial_data_test.dart';
import 'in_app_webview_initial_file_test.dart'; import 'in_app_webview_initial_file_test.dart';
import 'in_app_webview_initial_url_test.dart'; import 'in_app_webview_initial_url_test.dart';
import 'in_app_webview_javascript_handler_test.dart'; import 'in_app_webview_javascript_handler_test.dart';
import 'in_app_webview_on_console_message_test.dart'; import 'in_app_webview_on_console_message_test.dart';
import 'in_app_webview_on_download_start_test.dart'; import 'in_app_webview_on_download_start_test.dart';
import 'in_app_webview_on_find_result_received_test.dart';
import 'in_app_webview_on_js_dialog_test.dart'; import 'in_app_webview_on_js_dialog_test.dart';
import 'in_app_webview_on_load_error_test.dart';
import 'in_app_webview_on_load_http_error_test.dart';
import 'in_app_webview_on_load_resource_custom_scheme_test.dart'; import 'in_app_webview_on_load_resource_custom_scheme_test.dart';
import 'in_app_webview_on_load_resource_test.dart'; import 'in_app_webview_on_load_resource_test.dart';
import 'in_app_webview_on_navigation_state_change_test.dart';
import 'in_app_webview_on_progress_changed_test.dart';
import 'in_app_webview_on_received_http_auth_request_test.dart'; import 'in_app_webview_on_received_http_auth_request_test.dart';
import 'in_app_webview_on_safe_browsing_hit_test.dart'; import 'in_app_webview_on_safe_browsing_hit_test.dart';
import 'in_app_webview_on_scroll_changed_test.dart';
import 'in_app_webview_on_target_blank_test.dart'; import 'in_app_webview_on_target_blank_test.dart';
import 'in_app_webview_should_override_url_loading_test.dart'; import 'in_app_webview_should_override_url_loading_test.dart';
import 'in_app_webview_ssl_request_test.dart';
List<String> testRoutes = []; Map<String, WidgetBuilder> getTestRoutes({@required BuildContext context}) {
Map<String, WidgetBuilder> buildRoutes({@required BuildContext context}) {
var routes = { var routes = {
'/': (context) => InAppWebViewInitialUrlTest(), '/': (context) => InAppWebViewInitialUrlTest(),
'/InAppWebViewInitialFileTest': (context) => InAppWebViewInitialFileTest(), '/InAppWebViewInitialFileTest': (context) => InAppWebViewInitialFileTest(),
'/InAppWebViewInitialDataTest': (context) => InAppWebViewInitialDataTest(),
'/InAppWebViewOnProgressChangedTest': (context) => InAppWebViewOnProgressChangedTest(),
'/InAppWebViewOnScrollChangedTest': (context) => InAppWebViewOnScrollChangedTest(),
'/InAppWebViewOnLoadResourceTest': (context) => InAppWebViewOnLoadResourceTest(), '/InAppWebViewOnLoadResourceTest': (context) => InAppWebViewOnLoadResourceTest(),
'/InAppWebViewJavaScriptHandlerTest': (context) => InAppWebViewJavaScriptHandlerTest(), '/InAppWebViewJavaScriptHandlerTest': (context) => InAppWebViewJavaScriptHandlerTest(),
'/InAppWebViewAjaxTest': (context) => InAppWebViewAjaxTest(), '/InAppWebViewAjaxTest': (context) => InAppWebViewAjaxTest(),
'/InAppWebViewFetchTest': (context) => InAppWebViewFetchTest(),
'/InAppWebViewOnLoadResourceCustomSchemeTest': (context) => InAppWebViewOnLoadResourceCustomSchemeTest(), '/InAppWebViewOnLoadResourceCustomSchemeTest': (context) => InAppWebViewOnLoadResourceCustomSchemeTest(),
'/InAppWebViewFetchTest': (context) => InAppWebViewFetchTest(),
'/InAppWebViewFetchTest': (context) => InAppWebViewFetchTest(),
'/InAppWebViewShouldOverrideUrlLoadingTest': (context) => InAppWebViewShouldOverrideUrlLoadingTest(), '/InAppWebViewShouldOverrideUrlLoadingTest': (context) => InAppWebViewShouldOverrideUrlLoadingTest(),
'/InAppWebViewOnConsoleMessageTest': (context) => InAppWebViewOnConsoleMessageTest(), '/InAppWebViewOnConsoleMessageTest': (context) => InAppWebViewOnConsoleMessageTest(),
'/InAppWebViewOnDownloadStartTest': (context) => InAppWebViewOnDownloadStartTest(), '/InAppWebViewOnDownloadStartTest': (context) => InAppWebViewOnDownloadStartTest(),
@ -36,18 +48,33 @@ Map<String, WidgetBuilder> buildRoutes({@required BuildContext context}) {
'/InAppWebViewOnJsDialogTest': (context) => InAppWebViewOnJsDialogTest(), '/InAppWebViewOnJsDialogTest': (context) => InAppWebViewOnJsDialogTest(),
'/InAppWebViewOnSafeBrowsingHitTest': (context) => InAppWebViewOnSafeBrowsingHitTest(), '/InAppWebViewOnSafeBrowsingHitTest': (context) => InAppWebViewOnSafeBrowsingHitTest(),
'/InAppWebViewOnReceivedHttpAuthRequestTest': (context) => InAppWebViewOnReceivedHttpAuthRequestTest(), '/InAppWebViewOnReceivedHttpAuthRequestTest': (context) => InAppWebViewOnReceivedHttpAuthRequestTest(),
'/InAppWebViewSslRequestTest': (context) => InAppWebViewSslRequestTest(),
'/InAppWebViewOnFindResultReceivedTest': (context) => InAppWebViewOnFindResultReceivedTest(),
'/InAppWebViewOnNavigationStateChangeTest': (context) => InAppWebViewOnNavigationStateChangeTest(),
'/InAppWebViewOnLoadErrorTest': (context) => InAppWebViewOnLoadErrorTest(),
'/InAppWebViewOnLoadHttpErrorTest': (context) => InAppWebViewOnLoadHttpErrorTest(),
'/InAppWebViewCookieManagerTest': (context) => InAppWebViewCookieManagerTest(),
'/InAppWebViewHttpAuthCredentialDatabaseTest': (context) => InAppWebViewHttpAuthCredentialDatabaseTest(),
'/InAppWebViewContentBlockerTest': (context) => InAppWebViewContentBlockerTest(),
}; };
routes.forEach((k, v) => testRoutes.add(k));
return routes; return routes;
} }
AppBar myAppBar({@required WidgetTestState state, @required String title}) { AppBar myAppBar({@required WidgetTestState state, @required String title}) {
return AppBar( return AppBar(
title: Text( title: Text(
title, title,
key: Key("AppBarTitle") key: Key("AppBarTitle")
), ),
actions: <Widget>[ actions: <Widget>[
IconButton(
icon: Icon(Icons.menu),
key: Key("SideMenu"),
onPressed: () {
state.scaffoldKey.currentState.openDrawer();
},
),
IconButton( IconButton(
icon: Icon(Icons.refresh), icon: Icon(Icons.refresh),
onPressed: () { onPressed: () {
@ -59,6 +86,40 @@ AppBar myAppBar({@required WidgetTestState state, @required String title}) {
); );
} }
Drawer myDrawer({@required context}) {
var routes = getTestRoutes(context: context);
List<Widget> listTiles = [
DrawerHeader(
child: Text('Tests'),
decoration: BoxDecoration(
color: Colors.blue,
),
)
];
for (String k in routes.keys) {
var title = "";
if (k == "/") {
title = "InAppWebViewInitialUrlTest";
} else {
title = k.substring(1);
}
listTiles.add(ListTile(
title: Text(title),
key: Key(title),
onTap: () {
Navigator.pushReplacementNamed(context, k);
},
));
}
return Drawer(
child: ListView(
key: Key("ListTiles"),
padding: EdgeInsets.zero,
children: listTiles,
),
);
}
Future main() async { Future main() async {
runApp(new MyApp()); runApp(new MyApp());
} }
@ -85,7 +146,7 @@ class _MyAppState extends State<MyApp> {
return MaterialApp( return MaterialApp(
title: 'flutter_inappbrowser tests', title: 'flutter_inappbrowser tests',
initialRoute: '/', initialRoute: '/',
routes: buildRoutes(context: context) routes: getTestRoutes(context: context)
); );
} }
} }

View File

@ -1,19 +0,0 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'custom_widget_test.dart';
import 'main_test.dart';
int currentTest = 0;
void nextTest({@required BuildContext context, @required WidgetTestState state}) {
if (currentTest + 1 < testRoutes.length) {
currentTest++;
String nextRoute = testRoutes[currentTest];
Future.delayed(const Duration(milliseconds: 2000)).then((value) {
Navigator.pushReplacementNamed(context, nextRoute);
});
}
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'types.dart';
///ContentBlocker class represents a set of rules to use block content in the browser window. ///ContentBlocker class represents a set of rules to use block content in the browser window.
/// ///
@ -34,56 +35,6 @@ class ContentBlocker {
} }
} }
///ContentBlockerTriggerResourceType class represents the possible resource type defined for a [ContentBlockerTrigger].
class ContentBlockerTriggerResourceType {
final String _value;
const ContentBlockerTriggerResourceType._internal(this._value);
static ContentBlockerTriggerResourceType fromValue(String value) {
return (["document", "image", "style-sheet", "script", "font",
"media", "svg-document", "raw"].contains(value)) ? ContentBlockerTriggerResourceType._internal(value) : null;
}
String toValue() => _value;
@override
String toString() => _value;
static const DOCUMENT = const ContentBlockerTriggerResourceType._internal('document');
static const IMAGE = const ContentBlockerTriggerResourceType._internal('image');
static const STYLE_SHEET = const ContentBlockerTriggerResourceType._internal('style-sheet');
static const SCRIPT = const ContentBlockerTriggerResourceType._internal('script');
static const FONT = const ContentBlockerTriggerResourceType._internal('font');
static const MEDIA = const ContentBlockerTriggerResourceType._internal('media');
static const SVG_DOCUMENT = const ContentBlockerTriggerResourceType._internal('svg-document');
///Any untyped load
static const RAW = const ContentBlockerTriggerResourceType._internal('raw');
bool operator ==(value) => value == _value;
@override
int get hashCode => _value.hashCode;
}
///ContentBlockerTriggerLoadType class represents the possible load type for a [ContentBlockerTrigger].
class ContentBlockerTriggerLoadType {
final String _value;
const ContentBlockerTriggerLoadType._internal(this._value);
static ContentBlockerTriggerLoadType fromValue(String value) {
return (["first-party", "third-party"].contains(value)) ? ContentBlockerTriggerLoadType._internal(value) : null;
}
String toValue() => _value;
@override
String toString() => _value;
///FIRST_PARTY is triggered only if the resource has the same scheme, domain, and port as the main page resource.
static const FIRST_PARTY = const ContentBlockerTriggerLoadType._internal('first-party');
///THIRD_PARTY is triggered if the resource is not from the same domain as the main page resource.
static const THIRD_PARTY = const ContentBlockerTriggerLoadType._internal('third-party');
bool operator ==(value) => value == _value;
@override
int get hashCode => _value.hashCode;
}
///Trigger of the content blocker. The trigger tells to the WebView when to perform the corresponding action. ///Trigger of the content blocker. The trigger tells to the WebView when to perform the corresponding action.
///A trigger dictionary must include an [ContentBlockerTrigger.urlFilter], which specifies a pattern to match the URL against. ///A trigger dictionary must include an [ContentBlockerTrigger.urlFilter], which specifies a pattern to match the URL against.
///The remaining properties are optional and modify the behavior of the trigger. ///The remaining properties are optional and modify the behavior of the trigger.
@ -184,32 +135,6 @@ class ContentBlockerTrigger {
} }
} }
///ContentBlockerActionType class represents the kind of action that can be used with a [ContentBlockerTrigger].
class ContentBlockerActionType {
final String _value;
const ContentBlockerActionType._internal(this._value);
static ContentBlockerActionType fromValue(String value) {
return (["block", "css-display-none", "make-https"].contains(value)) ? ContentBlockerActionType._internal(value) : null;
}
String toValue() => _value;
@override
String toString() => _value;
///Stops loading of the resource. If the resource was cached, the cache is ignored.
static const BLOCK = const ContentBlockerActionType._internal('block');
///Hides elements of the page based on a CSS selector. A selector field contains the selector list. Any matching element has its display property set to none, which hides it.
///
///**NOTE**: on Android, JavaScript must be enabled.
static const CSS_DISPLAY_NONE = const ContentBlockerActionType._internal('css-display-none');
///Changes a URL from http to https. URLs with a specified (nondefault) port and links using other protocols are unaffected.
static const MAKE_HTTPS = const ContentBlockerActionType._internal('make-https');
bool operator ==(value) => value == _value;
@override
int get hashCode => _value.hashCode;
}
///Action associated to the trigger. The action tells to the WebView what to do when the trigger is matched. ///Action associated to the trigger. The action tells to the WebView what to do when the trigger is matched.
///When a trigger matches a resource, the browser queues the associated action for execution. ///When a trigger matches a resource, the browser queues the associated action for execution.
///The WebView evaluates all the triggers, it executes the actions in order. ///The WebView evaluates all the triggers, it executes the actions in order.

View File

@ -3,6 +3,8 @@ import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'types.dart';
///Manages the cookies used by WebView instances. ///Manages the cookies used by WebView instances.
/// ///
///**NOTE for iOS**: available from iOS 11.0+. ///**NOTE for iOS**: available from iOS 11.0+.
@ -56,22 +58,22 @@ class CookieManager {
} }
///Gets all the cookies for the given [url]. ///Gets all the cookies for the given [url].
Future<List<Map<String, dynamic>>> getCookies({@required String url}) async { Future<List<Cookie>> getCookies({@required String url}) async {
assert(url != null && url.isNotEmpty); assert(url != null && url.isNotEmpty);
Map<String, dynamic> args = <String, dynamic>{}; Map<String, dynamic> args = <String, dynamic>{};
args.putIfAbsent('url', () => url); args.putIfAbsent('url', () => url);
List<dynamic> cookies = await _channel.invokeMethod('getCookies', args); List<dynamic> cookieListMap = await _channel.invokeMethod('getCookies', args);
cookies = cookies.cast<Map<dynamic, dynamic>>(); cookieListMap = cookieListMap.cast<Map<dynamic, dynamic>>();
for(var i = 0; i < cookies.length; i++) { List<Cookie> cookies = [];
cookies[i] = cookies[i].cast<String, dynamic>(); for(var i = 0; i < cookieListMap.length; i++) {
cookies.add(Cookie(name: cookieListMap[i]["name"], value: cookieListMap[i]["value"]));
} }
cookies = cookies.cast<Map<String, dynamic>>();
return cookies; return cookies;
} }
///Gets a cookie by its [name] for the given [url]. ///Gets a cookie by its [name] for the given [url].
Future<Map<String, dynamic>> getCookie({@required String url, @required String name}) async { Future<Cookie> getCookie({@required String url, @required String name}) async {
assert(url != null && url.isNotEmpty); assert(url != null && url.isNotEmpty);
assert(name != null && name.isNotEmpty); assert(name != null && name.isNotEmpty);
@ -82,7 +84,7 @@ class CookieManager {
for(var i = 0; i < cookies.length; i++) { for(var i = 0; i < cookies.length; i++) {
cookies[i] = cookies[i].cast<String, dynamic>(); cookies[i] = cookies[i].cast<String, dynamic>();
if (cookies[i]["name"] == name) if (cookies[i]["name"] == name)
return cookies[i]; return Cookie(name: cookies[i]["name"], value: cookies[i]["value"]);
} }
return null; return null;
} }

View File

@ -1500,3 +1500,90 @@ class FetchRequest {
return null; return null;
} }
} }
///ContentBlockerTriggerResourceType class represents the possible resource type defined for a [ContentBlockerTrigger].
class ContentBlockerTriggerResourceType {
final String _value;
const ContentBlockerTriggerResourceType._internal(this._value);
static ContentBlockerTriggerResourceType fromValue(String value) {
return (["document", "image", "style-sheet", "script", "font",
"media", "svg-document", "raw"].contains(value)) ? ContentBlockerTriggerResourceType._internal(value) : null;
}
String toValue() => _value;
@override
String toString() => _value;
static const DOCUMENT = const ContentBlockerTriggerResourceType._internal('document');
static const IMAGE = const ContentBlockerTriggerResourceType._internal('image');
static const STYLE_SHEET = const ContentBlockerTriggerResourceType._internal('style-sheet');
static const SCRIPT = const ContentBlockerTriggerResourceType._internal('script');
static const FONT = const ContentBlockerTriggerResourceType._internal('font');
static const MEDIA = const ContentBlockerTriggerResourceType._internal('media');
static const SVG_DOCUMENT = const ContentBlockerTriggerResourceType._internal('svg-document');
///Any untyped load
static const RAW = const ContentBlockerTriggerResourceType._internal('raw');
bool operator ==(value) => value == _value;
@override
int get hashCode => _value.hashCode;
}
///ContentBlockerTriggerLoadType class represents the possible load type for a [ContentBlockerTrigger].
class ContentBlockerTriggerLoadType {
final String _value;
const ContentBlockerTriggerLoadType._internal(this._value);
static ContentBlockerTriggerLoadType fromValue(String value) {
return (["first-party", "third-party"].contains(value)) ? ContentBlockerTriggerLoadType._internal(value) : null;
}
String toValue() => _value;
@override
String toString() => _value;
///FIRST_PARTY is triggered only if the resource has the same scheme, domain, and port as the main page resource.
static const FIRST_PARTY = const ContentBlockerTriggerLoadType._internal('first-party');
///THIRD_PARTY is triggered if the resource is not from the same domain as the main page resource.
static const THIRD_PARTY = const ContentBlockerTriggerLoadType._internal('third-party');
bool operator ==(value) => value == _value;
@override
int get hashCode => _value.hashCode;
}
///ContentBlockerActionType class represents the kind of action that can be used with a [ContentBlockerTrigger].
class ContentBlockerActionType {
final String _value;
const ContentBlockerActionType._internal(this._value);
static ContentBlockerActionType fromValue(String value) {
return (["block", "css-display-none", "make-https"].contains(value)) ? ContentBlockerActionType._internal(value) : null;
}
String toValue() => _value;
@override
String toString() => _value;
///Stops loading of the resource. If the resource was cached, the cache is ignored.
static const BLOCK = const ContentBlockerActionType._internal('block');
///Hides elements of the page based on a CSS selector. A selector field contains the selector list. Any matching element has its display property set to none, which hides it.
///
///**NOTE**: on Android, JavaScript must be enabled.
static const CSS_DISPLAY_NONE = const ContentBlockerActionType._internal('css-display-none');
///Changes a URL from http to https. URLs with a specified (nondefault) port and links using other protocols are unaffected.
static const MAKE_HTTPS = const ContentBlockerActionType._internal('make-https');
bool operator ==(value) => value == _value;
@override
int get hashCode => _value.hashCode;
}
///Cookie class represents a cookie returned by the [CookieManager].
class Cookie {
///The name;
String name;
///The value;
dynamic value;
Cookie({@required this.name, @required this.value});
}

View File

@ -30,36 +30,48 @@ appHttps.get('/', (req, res) => {
res.send(` res.send(`
<html> <html>
<head> <head>
<script src="/fakeResource" type="text/javascript"></script>
</head> </head>
<body> <body>
<p>Hello ${cert.subject.CN}, your certificate was issued by ${cert.issuer.CN}!</p> <h1>Authorized</h1>
</body> </body>
</html> </html>
`) `);
// They can still provide a certificate which is not accepted by us. Unfortunately, the `cert` object will be an empty // They can still provide a certificate which is not accepted by us. Unfortunately, the `cert` object will be an empty
// object instead of `null` if there is no certificate at all, so we have to check for a known field rather than // object instead of `null` if there is no certificate at all, so we have to check for a known field rather than
// truthiness. // truthiness.
} else if (cert.subject) { } else if (cert.subject) {
res.status(403).send(`Sorry ${cert.subject.CN}, certificates from ${cert.issuer.CN} are not welcome here.`) console.log(`Sorry ${cert.subject.CN}, certificates from ${cert.issuer.CN} are not welcome here.`);
res.status(403).send(`
<html>
<head>
</head>
<body>
<h1>Forbidden</h1>
</body>
</html>
`);
// And last, they can come to us with no certificate at all: // And last, they can come to us with no certificate at all:
} else { } else {
res.status(401).send(`Sorry, but you need to provide a client certificate to continue.`) console.log(`Sorry, but you need to provide a client certificate to continue.`)
res.status(401).send(`
<html>
<head>
</head>
<body>
<h1>Unauthorized</h1>
</body>
</html>
`);
} }
res.end() res.end()
}) })
appHttps.get('/fakeResource', (req, res) => {
console.log(JSON.stringify(req.headers))
res.set("Content-Type", "text/javascript")
res.send(`alert("HI");`)
res.end()
})
// Let's create our HTTPS server and we're ready to go. // Let's create our HTTPS server and we're ready to go.
https.createServer(options, appHttps).listen(4433) https.createServer(options, appHttps).listen(4433)
// Ensure this is before any other middleware or routes // Ensure this is before any other middleware or routes
appAuthBasic.use((req, res, next) => { appAuthBasic.use((req, res, next) => {
let user = auth(req) let user = auth(req)
@ -98,6 +110,8 @@ appAuthBasic.get("/", (req, res) => {
appAuthBasic.listen(8081) appAuthBasic.listen(8081)
// Parse URL-encoded bodies (as sent by HTML forms) // Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded()); app.use(express.urlencoded());

8
test.sh Executable file
View File

@ -0,0 +1,8 @@
#!/bin/bash
export NODE_SERVER_IP=$1
dart tool/env.dart
cd nodejs_server_test_auth_basic_and_ssl
node index.js &
cd ../example
flutter driver -t test_driver/app.dart
kill $(jobs -p)

12
tool/env.dart Normal file
View File

@ -0,0 +1,12 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
Future<void> main() async {
final config = {
'NODE_SERVER_IP': Platform.environment['NODE_SERVER_IP'],
};
final filename = 'example/test_driver/.env.dart';
File(filename).writeAsString('final environment = ${json.encode(config)};');
}