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

Commit 1dce6ab

Browse files
Fix webview_flutter Android integration tests and add Espresso (#4147)
1 parent 7d49fd4 commit 1dce6ab

File tree

9 files changed

+96
-17
lines changed

9 files changed

+96
-17
lines changed

packages/webview_flutter/webview_flutter/example/android/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,6 @@ flutter {
5757
dependencies {
5858
testImplementation 'junit:junit:4.12'
5959
androidTestImplementation 'androidx.test:runner:1.2.0'
60-
androidTestImplementation 'androidx.test:rules:1.2.0'
6160
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
61+
api 'androidx.test:core:1.2.0'
6262
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package io.flutter.plugins.webviewflutterexample;
6+
7+
import static org.junit.Assert.assertTrue;
8+
9+
import androidx.test.core.app.ActivityScenario;
10+
import io.flutter.plugins.webviewflutter.WebViewFlutterPlugin;
11+
import org.junit.Test;
12+
13+
public class WebViewTest {
14+
@Test
15+
public void webViewPluginIsAdded() {
16+
final ActivityScenario<WebViewTestActivity> scenario =
17+
ActivityScenario.launch(WebViewTestActivity.class);
18+
scenario.onActivity(
19+
activity -> {
20+
assertTrue(activity.engine.getPlugins().has(WebViewFlutterPlugin.class));
21+
});
22+
}
23+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2+
package="io.flutter.plugins.webviewflutterexample">
3+
<!-- Flutter needs it to communicate with the running application
4+
to allow setting breakpoints, to provide hot reload, etc.
5+
-->
6+
<uses-permission android:name="android.permission.INTERNET"/>
7+
<application android:usesCleartextTraffic="true">
8+
<activity
9+
android:name=".WebViewTestActivity"
10+
android:launchMode="singleTop"
11+
android:theme="@style/LaunchTheme"
12+
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
13+
android:hardwareAccelerated="true"
14+
android:windowSoftInputMode="adjustResize">
15+
</activity>
16+
</application>
17+
</manifest>

packages/webview_flutter/webview_flutter/example/android/app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="io.flutter.plugins.webviewflutterexample">
3+
34
<application
5+
android:usesCleartextTraffic="true"
46
android:icon="@mipmap/ic_launcher"
57
android:label="webview_flutter_example">
68
<meta-data
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package io.flutter.plugins.webviewflutterexample;
6+
7+
import androidx.annotation.NonNull;
8+
import io.flutter.embedding.android.FlutterActivity;
9+
import io.flutter.embedding.engine.FlutterEngine;
10+
11+
// Extends FlutterActivity to make the FlutterEngine accessible for testing.
12+
public class WebViewTestActivity extends FlutterActivity {
13+
public FlutterEngine engine;
14+
15+
@Override
16+
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
17+
super.configureFlutterEngine(flutterEngine);
18+
engine = flutterEngine;
19+
}
20+
}

packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import 'package:integration_test/integration_test.dart';
1818
void main() {
1919
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
2020

21-
testWidgets('initalUrl', (WidgetTester tester) async {
21+
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757.
22+
testWidgets('initialUrl', (WidgetTester tester) async {
2223
final Completer<WebViewController> controllerCompleter =
2324
Completer<WebViewController>();
2425
await tester.pumpWidget(
@@ -36,8 +37,9 @@ void main() {
3637
final WebViewController controller = await controllerCompleter.future;
3738
final String? currentUrl = await controller.currentUrl();
3839
expect(currentUrl, 'https://flutter.dev/');
39-
});
40+
}, skip: true);
4041

42+
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757.
4143
testWidgets('loadUrl', (WidgetTester tester) async {
4244
final Completer<WebViewController> controllerCompleter =
4345
Completer<WebViewController>();
@@ -57,8 +59,9 @@ void main() {
5759
await controller.loadUrl('https://www.google.com/');
5860
final String? currentUrl = await controller.currentUrl();
5961
expect(currentUrl, 'https://www.google.com/');
60-
});
62+
}, skip: true);
6163

64+
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757.
6265
testWidgets('loadUrl with headers', (WidgetTester tester) async {
6366
final Completer<WebViewController> controllerCompleter =
6467
Completer<WebViewController>();
@@ -98,7 +101,7 @@ void main() {
98101
final String content = await controller
99102
.evaluateJavascript('document.documentElement.innerText');
100103
expect(content.contains('flutter_test_header'), isTrue);
101-
});
104+
}, skip: Platform.isAndroid);
102105

103106
testWidgets('JavaScriptChannel', (WidgetTester tester) async {
104107
final Completer<WebViewController> controllerCompleter =
@@ -274,6 +277,7 @@ void main() {
274277
expect(customUserAgent2, 'Custom_User_Agent2');
275278
});
276279

280+
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757.
277281
testWidgets('use default platform userAgent after webView is rebuilt',
278282
(WidgetTester tester) async {
279283
final Completer<WebViewController> controllerCompleter =
@@ -323,7 +327,7 @@ void main() {
323327

324328
final String customUserAgent2 = await _getUserAgent(controller);
325329
expect(customUserAgent2, defaultPlatformUserAgent);
326-
});
330+
}, skip: Platform.isAndroid);
327331

328332
group('Video playback policy', () {
329333
late String videoTestBase64;
@@ -532,6 +536,7 @@ void main() {
532536
expect(fullScreen, _webviewBool(false));
533537
});
534538

539+
// allowsInlineMediaPlayback is a noop on Android, so it is skipped.
535540
testWidgets(
536541
'Video plays full screen when allowsInlineMediaPlayback is false',
537542
(WidgetTester tester) async {
@@ -581,7 +586,7 @@ void main() {
581586
String fullScreen =
582587
await controller.evaluateJavascript('isFullScreen();');
583588
expect(fullScreen, _webviewBool(true));
584-
});
589+
}, skip: Platform.isAndroid);
585590
});
586591

587592
group('Audio playback policy', () {
@@ -796,6 +801,7 @@ void main() {
796801
});
797802

798803
group('Programmatic Scroll', () {
804+
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757.
799805
testWidgets('setAndGetScrollPosition', (WidgetTester tester) async {
800806
final String scrollTestPage = '''
801807
<!DOCTYPE html>
@@ -870,7 +876,7 @@ void main() {
870876
scrollPosY = await controller.getScrollY();
871877
expect(scrollPosX, X_SCROLL * 2);
872878
expect(scrollPosY, Y_SCROLL * 2);
873-
});
879+
}, skip: Platform.isAndroid);
874880
});
875881

876882
group('SurfaceAndroidWebView', () {
@@ -882,6 +888,7 @@ void main() {
882888
WebView.platform = null;
883889
});
884890

891+
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757.
885892
testWidgets('setAndGetScrollPosition', (WidgetTester tester) async {
886893
final String scrollTestPage = '''
887894
<!DOCTYPE html>
@@ -948,8 +955,9 @@ void main() {
948955
scrollPosY = await controller.getScrollY();
949956
expect(X_SCROLL * 2, scrollPosX);
950957
expect(Y_SCROLL * 2, scrollPosY);
951-
}, skip: !Platform.isAndroid);
958+
}, skip: true);
952959

960+
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757.
953961
testWidgets('inputs are scrolled into view when focused',
954962
(WidgetTester tester) async {
955963
final String scrollTestPage = '''
@@ -1053,7 +1061,7 @@ void main() {
10531061
lastInputClientRectRelativeToViewport['right'] <=
10541062
viewportRectRelativeToViewport['right'],
10551063
isTrue);
1056-
}, skip: !Platform.isAndroid);
1064+
}, skip: true);
10571065
});
10581066

10591067
group('NavigationDelegate', () {
@@ -1272,18 +1280,20 @@ void main() {
12721280
),
12731281
);
12741282
final WebViewController controller = await controllerCompleter.future;
1275-
await controller.evaluateJavascript('window.open("about:blank", "_blank")');
1283+
await controller
1284+
.evaluateJavascript('window.open("https://flutter.dev/", "_blank")');
12761285
await pageLoaded.future;
12771286
final String? currentUrl = await controller.currentUrl();
1278-
expect(currentUrl, 'about:blank');
1287+
expect(currentUrl, 'https://flutter.dev/');
12791288
});
12801289

1290+
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757.
12811291
testWidgets(
12821292
'can open new window and go back',
12831293
(WidgetTester tester) async {
12841294
final Completer<WebViewController> controllerCompleter =
12851295
Completer<WebViewController>();
1286-
final Completer<void> pageLoaded = Completer<void>();
1296+
Completer<void> pageLoaded = Completer<void>();
12871297
await tester.pumpWidget(
12881298
Directionality(
12891299
textDirection: TextDirection.ltr,
@@ -1301,15 +1311,22 @@ void main() {
13011311
),
13021312
);
13031313
final WebViewController controller = await controllerCompleter.future;
1314+
expect(controller.currentUrl(), completion('https://flutter.dev/'));
1315+
await pageLoaded.future;
1316+
pageLoaded = Completer<void>();
1317+
13041318
await controller
1305-
.evaluateJavascript('window.open("https://www.google.com")');
1319+
.evaluateJavascript('window.open("https://www.google.com/")');
13061320
await pageLoaded.future;
1321+
pageLoaded = Completer<void>();
13071322
expect(controller.currentUrl(), completion('https://www.google.com/'));
13081323

1324+
expect(controller.canGoBack(), completion(true));
13091325
await controller.goBack();
1310-
expect(controller.currentUrl(), completion('https://www.flutter.dev'));
1326+
await pageLoaded.future;
1327+
expect(controller.currentUrl(), completion('https://flutter.dev/'));
13111328
},
1312-
skip: !Platform.isAndroid,
1329+
skip: true,
13131330
);
13141331

13151332
testWidgets(

packages/webview_flutter/webview_flutter/example/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ dependencies:
1717
path: ../
1818

1919
dev_dependencies:
20+
espresso: ^0.1.0+2
2021
flutter_test:
2122
sdk: flutter
2223
flutter_driver:

script/configs/exclude_integration_android.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
- shared_preferences/shared_preferences
88
- url_launcher/url_launcher
99
- video_player/video_player
10-
- webview_flutter
1110

1211
# Deprecated; no plan to backfill the missing files
1312
- android_intent

0 commit comments

Comments
 (0)