diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index 10bd622d985..cb79b683a75 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -1,3 +1,10 @@ +## 4.5.0 + +* Adds support to set whether to draw the scrollbar. See + `AndroidWebViewController.setVerticalScrollBarEnabled`, + `AndroidWebViewController.setHorizontalScrollBarEnabled`, + `AndroidWebViewController.supportsSetScrollBarsEnabled`. + ## 4.4.2 * Updates pigeon generated code to fix `ImplicitSamInstance` and `SyntheticAccessor` Kotlin lint diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/AndroidWebkitLibrary.g.kt b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/AndroidWebkitLibrary.g.kt index f48cf24608a..bd1c4de2327 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/AndroidWebkitLibrary.g.kt +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/AndroidWebkitLibrary.g.kt @@ -4840,6 +4840,20 @@ abstract class PigeonApiView( /** Return the scrolled position of this view. */ abstract fun getScrollPosition(pigeon_instance: android.view.View): WebViewPoint + /** + * Define whether the vertical scrollbar should be drawn or not. + * + * The scrollbar is not drawn by default. + */ + abstract fun setVerticalScrollBarEnabled(pigeon_instance: android.view.View, enabled: Boolean) + + /** + * Define whether the horizontal scrollbar should be drawn or not. + * + * The scrollbar is not drawn by default. + */ + abstract fun setHorizontalScrollBarEnabled(pigeon_instance: android.view.View, enabled: Boolean) + /** Set the over-scroll mode for this view. */ abstract fun setOverScrollMode(pigeon_instance: android.view.View, mode: OverScrollMode) @@ -4915,6 +4929,54 @@ abstract class PigeonApiView( channel.setMessageHandler(null) } } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.webview_flutter_android.View.setVerticalScrollBarEnabled", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val pigeon_instanceArg = args[0] as android.view.View + val enabledArg = args[1] as Boolean + val wrapped: List = + try { + api.setVerticalScrollBarEnabled(pigeon_instanceArg, enabledArg) + listOf(null) + } catch (exception: Throwable) { + AndroidWebkitLibraryPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.webview_flutter_android.View.setHorizontalScrollBarEnabled", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val pigeon_instanceArg = args[0] as android.view.View + val enabledArg = args[1] as Boolean + val wrapped: List = + try { + api.setHorizontalScrollBarEnabled(pigeon_instanceArg, enabledArg) + listOf(null) + } catch (exception: Throwable) { + AndroidWebkitLibraryPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } run { val channel = BasicMessageChannel( diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/ViewProxyApi.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/ViewProxyApi.java index e4925f9912d..c372c8e1dc7 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/ViewProxyApi.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/ViewProxyApi.java @@ -41,6 +41,16 @@ public WebViewPoint getScrollPosition(@NonNull View pigeon_instance) { return new WebViewPoint(pigeon_instance.getScrollX(), pigeon_instance.getScrollY()); } + @Override + public void setVerticalScrollBarEnabled(@NonNull View pigeon_instance, boolean enabled) { + pigeon_instance.setVerticalScrollBarEnabled(enabled); + } + + @Override + public void setHorizontalScrollBarEnabled(@NonNull View pigeon_instance, boolean enabled) { + pigeon_instance.setHorizontalScrollBarEnabled(enabled); + } + @Override public void setOverScrollMode(@NonNull View pigeon_instance, @NonNull OverScrollMode mode) { switch (mode) { diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/ViewTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/ViewTest.java index 4f806e5812d..70818df6424 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/ViewTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/ViewTest.java @@ -50,6 +50,28 @@ public void getScrollPosition() { assertEquals(value.getY(), api.getScrollPosition(instance).getY()); } + @Test + public void setVerticalScrollBarEnabled() { + final PigeonApiView api = new TestProxyApiRegistrar().getPigeonApiView(); + + final View instance = mock(View.class); + final boolean enabled = true; + api.setVerticalScrollBarEnabled(instance, enabled); + + verify(instance).setVerticalScrollBarEnabled(enabled); + } + + @Test + public void setHorizontalScrollBarEnabled() { + final PigeonApiView api = new TestProxyApiRegistrar().getPigeonApiView(); + + final View instance = mock(View.class); + final boolean enabled = false; + api.setHorizontalScrollBarEnabled(instance, enabled); + + verify(instance).setHorizontalScrollBarEnabled(enabled); + } + @Test public void setOverScrollMode() { final PigeonApiView api = new TestProxyApiRegistrar().getPigeonApiView(); diff --git a/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml index de6c69e7806..d5cd0d9827c 100644 --- a/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ - webview_flutter_platform_interface: ^2.11.0 + webview_flutter_platform_interface: ^2.12.0 dev_dependencies: espresso: ^0.4.0 diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webkit.g.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webkit.g.dart index c518f0a8432..93a23f43161 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webkit.g.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webkit.g.dart @@ -6611,6 +6611,70 @@ class View extends PigeonInternalProxyApiBaseClass { } } + /// Define whether the vertical scrollbar should be drawn or not. + /// + /// The scrollbar is not drawn by default. + Future setVerticalScrollBarEnabled(bool enabled) async { + final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = + _pigeonVar_codecView; + final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.webview_flutter_android.View.setVerticalScrollBarEnabled'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, enabled]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + /// Define whether the horizontal scrollbar should be drawn or not. + /// + /// The scrollbar is not drawn by default. + Future setHorizontalScrollBarEnabled(bool enabled) async { + final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = + _pigeonVar_codecView; + final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.webview_flutter_android.View.setHorizontalScrollBarEnabled'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, enabled]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + /// Set the over-scroll mode for this view. Future setOverScrollMode(OverScrollMode mode) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart index c8326529e59..92937665912 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart @@ -732,6 +732,17 @@ class AndroidWebViewController extends PlatformWebViewController { return _webChromeClient.setSynchronousReturnValueForOnJsPrompt(true); } + @override + Future setVerticalScrollBarEnabled(bool enabled) => + _webView.setVerticalScrollBarEnabled(enabled); + + @override + Future setHorizontalScrollBarEnabled(bool enabled) => + _webView.setHorizontalScrollBarEnabled(enabled); + + @override + bool supportsSetScrollBarsEnabled() => true; + @override Future setOverScrollMode(WebViewOverScrollMode mode) { return switch (mode) { diff --git a/packages/webview_flutter/webview_flutter_android/pigeons/android_webkit.dart b/packages/webview_flutter/webview_flutter_android/pigeons/android_webkit.dart index 42a15fc68bd..84a9140804b 100644 --- a/packages/webview_flutter/webview_flutter_android/pigeons/android_webkit.dart +++ b/packages/webview_flutter/webview_flutter_android/pigeons/android_webkit.dart @@ -852,6 +852,16 @@ abstract class View { /// Return the scrolled position of this view. WebViewPoint getScrollPosition(); + /// Define whether the vertical scrollbar should be drawn or not. + /// + /// The scrollbar is not drawn by default. + void setVerticalScrollBarEnabled(bool enabled); + + /// Define whether the horizontal scrollbar should be drawn or not. + /// + /// The scrollbar is not drawn by default. + void setHorizontalScrollBarEnabled(bool enabled); + /// Set the over-scroll mode for this view. void setOverScrollMode(OverScrollMode mode); } diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 5f6cb957df8..59cbf9fa2ee 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_android description: A Flutter plugin that provides a WebView widget on Android. repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 4.4.2 +version: 4.5.0 environment: sdk: ^3.6.0 @@ -20,7 +20,7 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^2.11.0 + webview_flutter_platform_interface: ^2.12.0 dev_dependencies: build_runner: ^2.1.4 diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart index 87bab7f8f5d..59aa998703c 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart @@ -1451,6 +1451,28 @@ void main() { verify(mockWebView.scrollBy(4, 2)).called(1); }); + test('verticalScrollBarEnabled', () async { + final MockWebView mockWebView = MockWebView(); + final AndroidWebViewController controller = createControllerWithMocks( + mockWebView: mockWebView, + ); + + await controller.setVerticalScrollBarEnabled(false); + + verify(mockWebView.setVerticalScrollBarEnabled(false)).called(1); + }); + + test('horizontalScrollBarEnabled', () async { + final MockWebView mockWebView = MockWebView(); + final AndroidWebViewController controller = createControllerWithMocks( + mockWebView: mockWebView, + ); + + await controller.setHorizontalScrollBarEnabled(false); + + verify(mockWebView.setHorizontalScrollBarEnabled(false)).called(1); + }); + test('getScrollPosition', () async { final MockWebView mockWebView = MockWebView(); final AndroidWebViewController controller = createControllerWithMocks( diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart index 10247006657..124fff5220f 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart @@ -689,6 +689,22 @@ class MockAndroidWebViewController extends _i1.Mock returnValueForMissingStub: _i8.Future.value(), ) as _i8.Future); + @override + _i8.Future setVerticalScrollBarEnabled(bool? enabled) => + (super.noSuchMethod( + Invocation.method(#setVerticalScrollBarEnabled, [enabled]), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + + @override + _i8.Future setHorizontalScrollBarEnabled(bool? enabled) => + (super.noSuchMethod( + Invocation.method(#setHorizontalScrollBarEnabled, [enabled]), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override _i8.Future setOverScrollMode(_i3.WebViewOverScrollMode? mode) => (super.noSuchMethod( @@ -2485,6 +2501,22 @@ class MockWebView extends _i1.Mock implements _i2.WebView { ), ) as _i8.Future<_i2.WebViewPoint>); + @override + _i8.Future setVerticalScrollBarEnabled(bool? enabled) => + (super.noSuchMethod( + Invocation.method(#setVerticalScrollBarEnabled, [enabled]), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + + @override + _i8.Future setHorizontalScrollBarEnabled(bool? enabled) => + (super.noSuchMethod( + Invocation.method(#setHorizontalScrollBarEnabled, [enabled]), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override _i8.Future setOverScrollMode(_i2.OverScrollMode? mode) => (super.noSuchMethod( diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_cookie_manager_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_cookie_manager_test.mocks.dart index b44e59a8c08..0bbed84ea8f 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_cookie_manager_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_cookie_manager_test.mocks.dart @@ -473,6 +473,22 @@ class MockAndroidWebViewController extends _i1.Mock returnValueForMissingStub: _i5.Future.value(), ) as _i5.Future); + @override + _i5.Future setVerticalScrollBarEnabled(bool? enabled) => + (super.noSuchMethod( + Invocation.method(#setVerticalScrollBarEnabled, [enabled]), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setHorizontalScrollBarEnabled(bool? enabled) => + (super.noSuchMethod( + Invocation.method(#setHorizontalScrollBarEnabled, [enabled]), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override _i5.Future setOverScrollMode(_i3.WebViewOverScrollMode? mode) => (super.noSuchMethod( diff --git a/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart index 6eebf3a56d8..8ad932452cc 100644 --- a/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart @@ -547,6 +547,22 @@ class MockWebView extends _i1.Mock implements _i2.WebView { ), ) as _i4.Future<_i2.WebViewPoint>); + @override + _i4.Future setVerticalScrollBarEnabled(bool? enabled) => + (super.noSuchMethod( + Invocation.method(#setVerticalScrollBarEnabled, [enabled]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + + @override + _i4.Future setHorizontalScrollBarEnabled(bool? enabled) => + (super.noSuchMethod( + Invocation.method(#setHorizontalScrollBarEnabled, [enabled]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override _i4.Future setOverScrollMode(_i2.OverScrollMode? mode) => (super.noSuchMethod( diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 2723c74a094..b049ab3e773 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,10 @@ +## 3.21.0 + +* Adds support to set whether to draw the scrollbar. See + `WebKitWebViewController.setVerticalScrollBarEnabled`, + `WebKitWebViewController.setHorizontalScrollBarEnabled`, + `WebKitWebViewController.supportsSetScrollBarsEnabled`. + ## 3.20.0 * Adds support to disable a preview of the destination for a link. See diff --git a/packages/webview_flutter/webview_flutter_wkwebview/darwin/Tests/ScrollViewProxyAPITests.swift b/packages/webview_flutter/webview_flutter_wkwebview/darwin/Tests/ScrollViewProxyAPITests.swift index 60f39d11f1b..e991cdf3747 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/darwin/Tests/ScrollViewProxyAPITests.swift +++ b/packages/webview_flutter/webview_flutter_wkwebview/darwin/Tests/ScrollViewProxyAPITests.swift @@ -125,6 +125,30 @@ class ScrollViewProxyAPITests: XCTestCase { XCTAssertEqual(instance.alwaysBounceHorizontal, value) } + + @MainActor func testSetShowsVerticalScrollIndicator() { + let registrar = TestProxyApiRegistrar() + let api = registrar.apiDelegate.pigeonApiUIScrollView(registrar) + + let instance = TestScrollView() + let value = true + try? api.pigeonDelegate.setShowsVerticalScrollIndicator( + pigeonApi: api, pigeonInstance: instance, value: value) + + XCTAssertEqual(instance.showsVerticalScrollIndicator, value) + } + + @MainActor func testSetShowsHorizontalScrollIndicator() { + let registrar = TestProxyApiRegistrar() + let api = registrar.apiDelegate.pigeonApiUIScrollView(registrar) + + let instance = TestScrollView() + let value = true + try? api.pigeonDelegate.setShowsHorizontalScrollIndicator( + pigeonApi: api, pigeonInstance: instance, value: value) + + XCTAssertEqual(instance.showsHorizontalScrollIndicator, value) + } #endif } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ScrollViewProxyAPIDelegate.swift b/packages/webview_flutter/webview_flutter_wkwebview/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ScrollViewProxyAPIDelegate.swift index bb098a29a0c..09084b1d10e 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ScrollViewProxyAPIDelegate.swift +++ b/packages/webview_flutter/webview_flutter_wkwebview/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ScrollViewProxyAPIDelegate.swift @@ -88,5 +88,17 @@ class ScrollViewProxyAPIDelegate: PigeonApiDelegateUIScrollView { ) throws { pigeonInstance.alwaysBounceHorizontal = value } + + func setShowsVerticalScrollIndicator( + pigeonApi: PigeonApiUIScrollView, pigeonInstance: UIScrollView, value: Bool + ) throws { + pigeonInstance.showsVerticalScrollIndicator = value + } + + func setShowsHorizontalScrollIndicator( + pigeonApi: PigeonApiUIScrollView, pigeonInstance: UIScrollView, value: Bool + ) throws { + pigeonInstance.showsHorizontalScrollIndicator = value + } #endif } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebKitLibrary.g.swift b/packages/webview_flutter/webview_flutter_wkwebview/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebKitLibrary.g.swift index d99e60eb5d5..74b4fecc955 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebKitLibrary.g.swift +++ b/packages/webview_flutter/webview_flutter_wkwebview/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebKitLibrary.g.swift @@ -3024,6 +3024,20 @@ protocol PigeonApiDelegateUIScrollView { func setAlwaysBounceHorizontal( pigeonApi: PigeonApiUIScrollView, pigeonInstance: UIScrollView, value: Bool) throws #endif + #if !os(macOS) + /// Whether the vertical scroll indicator is visible. + /// + /// The default value is true. + func setShowsVerticalScrollIndicator( + pigeonApi: PigeonApiUIScrollView, pigeonInstance: UIScrollView, value: Bool) throws + #endif + #if !os(macOS) + /// Whether the horizontal scroll indicator is visible. + /// + /// The default value is true. + func setShowsHorizontalScrollIndicator( + pigeonApi: PigeonApiUIScrollView, pigeonInstance: UIScrollView, value: Bool) throws + #endif } protocol PigeonApiProtocolUIScrollView { @@ -3242,6 +3256,50 @@ final class PigeonApiUIScrollView: PigeonApiProtocolUIScrollView { setAlwaysBounceHorizontalChannel.setMessageHandler(nil) } #endif + #if !os(macOS) + let setShowsVerticalScrollIndicatorChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.webview_flutter_wkwebview.UIScrollView.setShowsVerticalScrollIndicator", + binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + setShowsVerticalScrollIndicatorChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let pigeonInstanceArg = args[0] as! UIScrollView + let valueArg = args[1] as! Bool + do { + try api.pigeonDelegate.setShowsVerticalScrollIndicator( + pigeonApi: api, pigeonInstance: pigeonInstanceArg, value: valueArg) + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + setShowsVerticalScrollIndicatorChannel.setMessageHandler(nil) + } + #endif + #if !os(macOS) + let setShowsHorizontalScrollIndicatorChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.webview_flutter_wkwebview.UIScrollView.setShowsHorizontalScrollIndicator", + binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + setShowsHorizontalScrollIndicatorChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let pigeonInstanceArg = args[0] as! UIScrollView + let valueArg = args[1] as! Bool + do { + try api.pigeonDelegate.setShowsHorizontalScrollIndicator( + pigeonApi: api, pigeonInstance: pigeonInstanceArg, value: valueArg) + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + setShowsHorizontalScrollIndicatorChannel.setMessageHandler(nil) + } + #endif } #if !os(macOS) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml index fa7f2114200..e9898b31e7d 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter path_provider: ^2.0.6 - webview_flutter_platform_interface: ^2.11.0 + webview_flutter_platform_interface: ^2.12.0 webview_flutter_wkwebview: # When depending on this package from a real application you should use: # webview_flutter: ^x.y.z diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart index 5d3f3ee1fe7..2df3a6c23cc 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart @@ -3174,6 +3174,70 @@ class UIScrollView extends UIView { } } + /// Whether the vertical scroll indicator is visible. + /// + /// The default value is true. + Future setShowsVerticalScrollIndicator(bool value) async { + final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = + _pigeonVar_codecUIScrollView; + final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.webview_flutter_wkwebview.UIScrollView.setShowsVerticalScrollIndicator'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, value]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + /// Whether the horizontal scroll indicator is visible. + /// + /// The default value is true. + Future setShowsHorizontalScrollIndicator(bool value) async { + final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = + _pigeonVar_codecUIScrollView; + final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.webview_flutter_wkwebview.UIScrollView.setShowsHorizontalScrollIndicator'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, value]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + @override UIScrollView pigeon_copy() { return UIScrollView.pigeon_detached( diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart index 57f188e9e71..2da49f04fae 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart @@ -580,6 +580,30 @@ class WebKitWebViewController extends PlatformWebViewController { return Offset(position[0], position[1]); } + @override + Future setVerticalScrollBarEnabled(bool enabled) { + return _webView.scrollView.setShowsVerticalScrollIndicator(enabled); + } + + @override + Future setHorizontalScrollBarEnabled(bool enabled) { + return _webView.scrollView.setShowsHorizontalScrollIndicator(enabled); + } + + @override + bool supportsSetScrollBarsEnabled() { + switch (defaultTargetPlatform) { + case TargetPlatform.iOS: + return true; + case TargetPlatform.macOS: + return false; + case _: + throw UnsupportedError( + 'This plugin does not support this platform: $defaultTargetPlatform', + ); + } + } + @override Future setBackgroundColor(Color color) { return Future.wait(>[ diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart b/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart index 0cf38a4e9ee..5a369d67315 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart @@ -642,6 +642,16 @@ abstract class UIScrollView extends UIView { /// the scroll view allows horizontal dragging even if the content is smaller /// than the bounds of the scroll view. void setAlwaysBounceHorizontal(bool value); + + /// Whether the vertical scroll indicator is visible. + /// + /// The default value is true. + void setShowsVerticalScrollIndicator(bool value); + + /// Whether the horizontal scroll indicator is visible. + /// + /// The default value is true. + void setShowsHorizontalScrollIndicator(bool value); } /// A collection of properties that you use to initialize a web view.. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 64bf86387d4..396beb70a5a 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_wkwebview description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control. repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 3.20.0 +version: 3.21.0 environment: sdk: ^3.5.0 @@ -25,7 +25,7 @@ dependencies: flutter: sdk: flutter path: ^1.8.0 - webview_flutter_platform_interface: ^2.11.0 + webview_flutter_platform_interface: ^2.12.0 dev_dependencies: build_runner: ^2.1.5 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart index 88df3f478fc..d6981859154 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart @@ -200,6 +200,22 @@ class MockUIScrollView extends _i1.Mock implements _i2.UIScrollView { returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); + @override + _i4.Future setShowsVerticalScrollIndicator(bool? value) => + (super.noSuchMethod( + Invocation.method(#setShowsVerticalScrollIndicator, [value]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + + @override + _i4.Future setShowsHorizontalScrollIndicator(bool? value) => + (super.noSuchMethod( + Invocation.method(#setShowsHorizontalScrollIndicator, [value]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override _i2.UIScrollView pigeon_copy() => (super.noSuchMethod( Invocation.method(#pigeon_copy, []), diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart index c31ee0f790f..767f35fdc03 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart @@ -679,6 +679,64 @@ void main() { debugDefaultTargetPlatformOverride = null; }); + test('setVerticalScrollBarEnabled', () async { + final MockUIScrollView mockScrollView = MockUIScrollView(); + + final WebKitWebViewController controller = createControllerWithMocks( + mockScrollView: mockScrollView, + ); + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + + await controller.setVerticalScrollBarEnabled(true); + verify(mockScrollView.setShowsVerticalScrollIndicator(true)); + + debugDefaultTargetPlatformOverride = null; + }); + + test('setHorizontalScrollBarEnabled', () async { + final MockUIScrollView mockScrollView = MockUIScrollView(); + + final WebKitWebViewController controller = createControllerWithMocks( + mockScrollView: mockScrollView, + ); + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + + await controller.setHorizontalScrollBarEnabled(false); + verify(mockScrollView.setShowsHorizontalScrollIndicator(false)); + + debugDefaultTargetPlatformOverride = null; + }); + + test('supportsSetScrollBarsEnabled returns true for iOS', () { + final MockUIScrollView mockScrollView = MockUIScrollView(); + + final WebKitWebViewController controller = createControllerWithMocks( + mockScrollView: mockScrollView, + ); + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + + expect(controller.supportsSetScrollBarsEnabled(), true); + + debugDefaultTargetPlatformOverride = null; + }); + + test('supportsSetScrollBarsEnabled returns false for macOS', () { + final MockUIScrollView mockScrollView = MockUIScrollView(); + + final WebKitWebViewController controller = createControllerWithMocks( + mockScrollView: mockScrollView, + ); + + debugDefaultTargetPlatformOverride = TargetPlatform.macOS; + + expect(controller.supportsSetScrollBarsEnabled(), false); + + debugDefaultTargetPlatformOverride = null; + }); + test('disable zoom', () async { final MockWKUserContentController mockUserContentController = MockWKUserContentController(); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.mocks.dart index 3bbeec9f6c3..f5f1ce191c0 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.mocks.dart @@ -193,6 +193,22 @@ class MockUIScrollView extends _i1.Mock implements _i2.UIScrollView { returnValueForMissingStub: _i3.Future.value(), ) as _i3.Future); + @override + _i3.Future setShowsVerticalScrollIndicator(bool? value) => + (super.noSuchMethod( + Invocation.method(#setShowsVerticalScrollIndicator, [value]), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setShowsHorizontalScrollIndicator(bool? value) => + (super.noSuchMethod( + Invocation.method(#setShowsHorizontalScrollIndicator, [value]), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override _i2.UIScrollView pigeon_copy() => (super.noSuchMethod( Invocation.method(#pigeon_copy, []),