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

Commit 647c19b

Browse files
committed
Add test case for scroll listener on Android side
1 parent eca290f commit 647c19b

File tree

12 files changed

+167
-77
lines changed

12 files changed

+167
-77
lines changed

packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@
33

44
package io.flutter.plugins.webviewflutter;
55

6+
import io.flutter.plugin.common.BasicMessageChannel;
7+
import io.flutter.plugin.common.BinaryMessenger;
8+
import io.flutter.plugin.common.MessageCodec;
9+
import io.flutter.plugin.common.StandardMessageCodec;
610
import java.io.ByteArrayOutputStream;
711
import java.nio.ByteBuffer;
8-
import java.util.ArrayList;
912
import java.util.Arrays;
10-
import java.util.HashMap;
13+
import java.util.ArrayList;
1114
import java.util.List;
1215
import java.util.Map;
13-
14-
import io.flutter.plugin.common.BasicMessageChannel;
15-
import io.flutter.plugin.common.BinaryMessenger;
16-
import io.flutter.plugin.common.MessageCodec;
17-
import io.flutter.plugin.common.StandardMessageCodec;
16+
import java.util.HashMap;
1817

1918
/** Generated class from Pigeon. */
2019
@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"})

packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313
import android.webkit.WebView;
1414
import android.webkit.WebViewClient;
1515

16+
import androidx.annotation.NonNull;
17+
import androidx.annotation.Nullable;
18+
1619
import java.util.HashMap;
1720
import java.util.Map;
1821

19-
import androidx.annotation.NonNull;
20-
import androidx.annotation.Nullable;
2122
import io.flutter.plugin.platform.PlatformView;
2223
import io.flutter.plugins.webviewflutter.DownloadListenerHostApiImpl.DownloadListenerImpl;
2324
import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.WebViewHostApi;
@@ -530,9 +531,14 @@ public void setWebChromeClient(Long instanceId, Long clientInstanceId) {
530531
@Override
531532
public void enableListenForScrollPos(Long instanceId, Long webViewClientInstanceId, Boolean enable) {
532533
final WebViewHostApiImpl.WebViewPlatformView webView = (WebViewHostApiImpl.WebViewPlatformView) instanceManager.getInstance(instanceId);
533-
webView.setOnScrollChangedCallback((l, t, oldl, oldt) -> flutterApi.onScrollPosChange(webViewClientInstanceId,
534-
instanceId,
535-
(long) l, (long) t, reply -> {}));
534+
if (enable) {
535+
webView.setOnScrollChangedCallback((l, t, oldl, oldt) -> flutterApi.onScrollPosChange(webViewClientInstanceId,
536+
instanceId,
537+
(long) l, (long) t, reply -> {
538+
}));
539+
} else {
540+
webView.setOnScrollChangedCallback(null);
541+
}
536542
}
537543

538544
@Override

packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java

Lines changed: 62 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
package io.flutter.plugins.webviewflutter;
66

77
import static org.junit.Assert.assertEquals;
8+
import static org.mockito.ArgumentMatchers.any;
89
import static org.mockito.ArgumentMatchers.eq;
910
import static org.mockito.Mockito.mock;
11+
import static org.mockito.Mockito.times;
1012
import static org.mockito.Mockito.verify;
1113
import static org.mockito.Mockito.when;
1214

@@ -15,12 +17,7 @@
1517
import android.webkit.ValueCallback;
1618
import android.webkit.WebChromeClient;
1719
import android.webkit.WebViewClient;
18-
import io.flutter.plugins.webviewflutter.DownloadListenerHostApiImpl.DownloadListenerImpl;
19-
import io.flutter.plugins.webviewflutter.WebChromeClientHostApiImpl.WebChromeClientImpl;
20-
import io.flutter.plugins.webviewflutter.WebViewClientHostApiImpl.WebViewClientImpl;
21-
import io.flutter.plugins.webviewflutter.WebViewHostApiImpl.InputAwareWebViewPlatformView;
22-
import io.flutter.plugins.webviewflutter.WebViewHostApiImpl.WebViewPlatformView;
23-
import java.util.HashMap;
20+
2421
import org.junit.Before;
2522
import org.junit.Rule;
2623
import org.junit.Test;
@@ -29,14 +26,29 @@
2926
import org.mockito.junit.MockitoJUnit;
3027
import org.mockito.junit.MockitoRule;
3128

29+
import java.util.HashMap;
30+
31+
import io.flutter.plugins.webviewflutter.DownloadListenerHostApiImpl.DownloadListenerImpl;
32+
import io.flutter.plugins.webviewflutter.WebChromeClientHostApiImpl.WebChromeClientImpl;
33+
import io.flutter.plugins.webviewflutter.WebViewClientHostApiImpl.WebViewClientImpl;
34+
import io.flutter.plugins.webviewflutter.WebViewHostApiImpl.InputAwareWebViewPlatformView;
35+
import io.flutter.plugins.webviewflutter.WebViewHostApiImpl.WebViewPlatformView;
36+
3237
public class WebViewTest {
33-
@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
38+
@Rule
39+
public MockitoRule mockitoRule = MockitoJUnit.rule();
3440

35-
@Mock public WebViewPlatformView mockWebView;
41+
@Mock
42+
public WebViewPlatformView mockWebView;
3643

37-
@Mock WebViewHostApiImpl.WebViewProxy mockWebViewProxy;
44+
@Mock
45+
WebViewHostApiImpl.WebViewProxy mockWebViewProxy;
3846

39-
@Mock Context mockContext;
47+
@Mock
48+
Context mockContext;
49+
50+
@Mock
51+
WebViewClientFlutterApiImpl mockFlutterApi;
4052

4153
InstanceManager testInstanceManager;
4254
WebViewHostApiImpl testHostApiImpl;
@@ -46,7 +58,7 @@ public void setUp() {
4658
testInstanceManager = new InstanceManager();
4759
when(mockWebViewProxy.createWebView(mockContext)).thenReturn(mockWebView);
4860
testHostApiImpl =
49-
new WebViewHostApiImpl(testInstanceManager, mockWebViewProxy, mockContext, null);
61+
new WebViewHostApiImpl(testInstanceManager, mockWebViewProxy, mockContext, null, mockFlutterApi);
5062
testHostApiImpl.create(0L, true);
5163
}
5264

@@ -311,6 +323,45 @@ public void getScrollY() {
311323
assertEquals((long) testHostApiImpl.getScrollY(0L), 23);
312324
}
313325

326+
@Test
327+
public void setOnScrollListener() {
328+
329+
final WebViewClient mockWebViewClient = mock(WebViewClient.class);
330+
331+
testInstanceManager.addInstance(mockWebViewClient, 1L);
332+
333+
testHostApiImpl.enableListenForScrollPos(0L, 1L, true);
334+
verify(mockWebView).setOnScrollChangedCallback(any(OnScrollChangedCallback.class));
335+
336+
testHostApiImpl.enableListenForScrollPos(0L, 1L, false);
337+
verify(mockWebView).setOnScrollChangedCallback(null);
338+
}
339+
340+
@Test
341+
public void onScrollChanged() {
342+
final WebViewPlatformView webView = new WebViewPlatformView(mockContext);
343+
final WebChromeClientImpl mockWebChromeClient = mock(WebChromeClientImpl.class);
344+
final DownloadListenerImpl mockDownloadListener = mock(DownloadListenerImpl.class);
345+
final JavaScriptChannel mockJavaScriptChannel = mock(JavaScriptChannel.class);
346+
final OnScrollChangedCallback mockOnScrollChangedCallback = mock(OnScrollChangedCallback.class);
347+
348+
webView.setWebViewClient(mock(WebViewClientImpl.class));
349+
webView.setWebChromeClient(mockWebChromeClient);
350+
webView.setDownloadListener(mockDownloadListener);
351+
webView.addJavascriptInterface(mockJavaScriptChannel, "jchannel");
352+
353+
webView.onScrollChanged(1, 2, 3, 4);
354+
verify(mockOnScrollChangedCallback, times(0)).onScroll(1, 2, 3, 4);
355+
356+
webView.setOnScrollChangedCallback(mockOnScrollChangedCallback);
357+
webView.onScrollChanged(1, 2, 3, 5);
358+
verify(mockOnScrollChangedCallback).onScroll(1, 2, 3, 5);
359+
360+
webView.setOnScrollChangedCallback(null);
361+
webView.onScrollChanged(1, 2, 3, 6);
362+
verify(mockOnScrollChangedCallback, times(0)).onScroll(1, 2, 3, 6);
363+
}
364+
314365
@Test
315366
public void setWebViewClient() {
316367
final WebViewClient mockWebViewClient = mock(WebViewClient.class);

packages/webview_flutter/webview_flutter_android/example/lib/main.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class _WebViewExampleState extends State<_WebViewExample> {
117117
initialUrl: 'https://flutter.dev',
118118
onWebViewCreated: (WebViewController controller) {
119119
_controller.complete(controller);
120+
print('set on scrolllll');
120121
controller.setOnScrollListener((int x, int y) {
121122
print('New scroll position: x = $x, y = $y');
122123
});

packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,6 @@ class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi {
688688
webViewInstance != null,
689689
'InstanceManager does not contain an WebView with instanceId: $webViewInstanceId',
690690
);
691-
print('onScrollPosChangeeee');
692691
instance!.onScrollPosChange(webViewInstance!, x, y);
693692
}
694693
}

packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ class WebViewAndroidWebViewClient extends android_webview.WebViewClient {
552552
loadUrl;
553553

554554
/// Callback when a scroll pos change.
555-
final void Function(int x, int y) onScrollPosChangeCallback;
555+
final void Function(int x, int y)? onScrollPosChangeCallback;
556556

557557

558558
static WebResourceErrorType _errorCodeToErrorType(int errorCode) {
@@ -665,7 +665,7 @@ class WebViewAndroidWebViewClient extends android_webview.WebViewClient {
665665

666666
@override
667667
void onScrollPosChange(android_webview.WebView webView, int x, int y) {
668-
onScrollPosChangeCallback(x, y);
668+
onScrollPosChangeCallback?.call(x, y);
669669
}
670670

671671
@override

packages/webview_flutter/webview_flutter_android/test/android_webview.pigeon.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import 'package:flutter/foundation.dart' show WriteBuffer, ReadBuffer;
88
import 'package:flutter/services.dart';
99
import 'package:flutter_test/flutter_test.dart';
1010

11-
import '..\\lib\\src\\android_webview.pigeon.dart';
12-
1311
class _TestWebViewHostApiCodec extends StandardMessageCodec {
1412
const _TestWebViewHostApiCodec();
1513
}

packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,38 @@ void main() {
312312
verify(mockWebSettingsPlatformHostApi.dispose(webSettingsInstanceId));
313313
verify(mockPlatformHostApi.dispose(webViewInstanceId));
314314
});
315+
316+
test('enableListenForScrollPos', () {
317+
TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi());
318+
WebViewClient.api = WebViewClientHostApiImpl(
319+
instanceManager: instanceManager,
320+
);
321+
322+
final WebViewClient mockWebViewClient = MockWebViewClient();
323+
when(mockWebViewClient.shouldOverrideUrlLoading).thenReturn(false);
324+
webView.setWebViewClient(mockWebViewClient);
325+
326+
final int webViewClientInstanceId =
327+
instanceManager.getInstanceId(mockWebViewClient)!;
328+
329+
when(mockPlatformHostApi.enableListenForScrollPos(
330+
webViewInstanceId, webViewClientInstanceId, true))
331+
.thenReturn(null);
332+
333+
webView.enableListenForScrollPos(true);
334+
335+
verify(mockPlatformHostApi.enableListenForScrollPos(
336+
webViewInstanceId, webViewClientInstanceId, true));
337+
338+
when(mockPlatformHostApi.enableListenForScrollPos(
339+
webViewInstanceId, webViewClientInstanceId, false))
340+
.thenReturn(null);
341+
342+
webView.enableListenForScrollPos(false);
343+
344+
verify(mockPlatformHostApi.enableListenForScrollPos(
345+
webViewInstanceId, webViewClientInstanceId, false));
346+
});
315347
});
316348

317349
group('$WebSettings', () {
@@ -581,6 +613,16 @@ void main() {
581613
'https://www.google.com',
582614
));
583615
});
616+
617+
test('onScrollPosChange', () {
618+
flutterApi.onScrollPosChange(mockWebViewClientInstanceId,
619+
mockWebViewInstanceId, 1, 2);
620+
621+
verify(mockWebViewClient.onScrollPosChange(
622+
mockWebView,
623+
1, 2
624+
));
625+
});
584626
});
585627

586628
group('$DownloadListener', () {

0 commit comments

Comments
 (0)