Skip to content

Commit ef51c4c

Browse files
NickalasBKyleFin
authored andcommitted
[webview_flutter]Add zoom to android webview (flutter#3325)
1 parent 06d272e commit ef51c4c

File tree

7 files changed

+77
-5
lines changed

7 files changed

+77
-5
lines changed

packages/webview_flutter/webview_flutter/AUTHORS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,5 @@ Aleksandr Yurkovskiy <[email protected]>
6464
Anton Borries <[email protected]>
6565
6666
Rahul Raj <[email protected]>
67+
Nick Bradshaw <[email protected]>
68+
Antonino Di Natale <[email protected]>

packages/webview_flutter/webview_flutter/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.3.0
2+
3+
* Add ability to enable/disable zoom functionality.
4+
15
## 2.2.0
26

37
* Added `runJavascript` and `runJavascriptForResult` to supersede `evaluateJavascript`.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import 'package:flutter/foundation.dart';
1111
import 'package:flutter/services.dart';
1212
import 'package:flutter/widgets.dart';
1313
import 'package:flutter_test/flutter_test.dart';
14+
import 'package:integration_test/integration_test.dart';
1415
import 'package:webview_flutter/platform_interface.dart';
1516
import 'package:webview_flutter/webview_flutter.dart';
16-
import 'package:integration_test/integration_test.dart';
1717

1818
void main() {
1919
IntegrationTestWidgetsFlutterBinding.ensureInitialized();

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import 'dart:async';
88
import 'dart:convert';
99
import 'dart:io';
10+
1011
import 'package:flutter/material.dart';
1112
import 'package:webview_flutter/webview_flutter.dart';
1213

packages/webview_flutter/webview_flutter/lib/src/webview.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class WebView extends StatefulWidget {
9090
this.debuggingEnabled = false,
9191
this.gestureNavigationEnabled = false,
9292
this.userAgent,
93+
this.zoomEnabled = true,
9394
this.initialMediaPlaybackPolicy =
9495
AutoMediaPlaybackPolicy.require_user_action_for_all_media_types,
9596
this.allowsInlineMediaPlayback = false,
@@ -268,6 +269,12 @@ class WebView extends StatefulWidget {
268269
/// By default `userAgent` is null.
269270
final String? userAgent;
270271

272+
/// A Boolean value indicating whether the WebView should support zooming
273+
/// using its on-screen zoom controls and gestures.
274+
///
275+
/// By default 'zoomEnabled' is true
276+
final bool zoomEnabled;
277+
271278
/// Which restrictions apply on automatic media playback.
272279
///
273280
/// This initial value is applied to the platform's webview upon creation. Any following
@@ -359,6 +366,7 @@ WebSettings _webSettingsFromWidget(WebView widget) {
359366
gestureNavigationEnabled: widget.gestureNavigationEnabled,
360367
allowsInlineMediaPlayback: widget.allowsInlineMediaPlayback,
361368
userAgent: WebSetting<String?>.of(widget.userAgent),
369+
zoomEnabled: widget.zoomEnabled,
362370
);
363371
}
364372

@@ -374,12 +382,14 @@ WebSettings _clearUnchangedWebSettings(
374382
assert(newValue.hasNavigationDelegate != null);
375383
assert(newValue.debuggingEnabled != null);
376384
assert(newValue.userAgent != null);
385+
assert(newValue.zoomEnabled != null);
377386

378387
JavascriptMode? javascriptMode;
379388
bool? hasNavigationDelegate;
380389
bool? hasProgressTracking;
381390
bool? debuggingEnabled;
382391
WebSetting<String?> userAgent = WebSetting.absent();
392+
bool? zoomEnabled;
383393
if (currentValue.javascriptMode != newValue.javascriptMode) {
384394
javascriptMode = newValue.javascriptMode;
385395
}
@@ -395,13 +405,17 @@ WebSettings _clearUnchangedWebSettings(
395405
if (currentValue.userAgent != newValue.userAgent) {
396406
userAgent = newValue.userAgent;
397407
}
408+
if (currentValue.zoomEnabled != newValue.zoomEnabled) {
409+
zoomEnabled = newValue.zoomEnabled;
410+
}
398411

399412
return WebSettings(
400413
javascriptMode: javascriptMode,
401414
hasNavigationDelegate: hasNavigationDelegate,
402415
hasProgressTracking: hasProgressTracking,
403416
debuggingEnabled: debuggingEnabled,
404417
userAgent: userAgent,
418+
zoomEnabled: zoomEnabled,
405419
);
406420
}
407421

packages/webview_flutter/webview_flutter/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: webview_flutter
22
description: A Flutter plugin that provides a WebView widget on Android and iOS.
33
repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
5-
version: 2.2.0
5+
version: 2.3.0
66

77
environment:
88
sdk: ">=2.14.0 <3.0.0"
@@ -19,8 +19,8 @@ flutter:
1919
dependencies:
2020
flutter:
2121
sdk: flutter
22-
webview_flutter_platform_interface: ^1.2.0
2322
webview_flutter_android: ^2.2.0
23+
webview_flutter_platform_interface: ^1.2.0
2424
webview_flutter_wkwebview: ^2.2.0
2525

2626
dev_dependencies:

packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import 'package:flutter/src/foundation/basic_types.dart';
1010
import 'package:flutter/src/gestures/recognizer.dart';
1111
import 'package:flutter/widgets.dart';
1212
import 'package:flutter_test/flutter_test.dart';
13-
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
1413
import 'package:webview_flutter/webview_flutter.dart';
14+
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
1515

1616
typedef void VoidCallback();
1717

@@ -915,6 +915,50 @@ void main() {
915915
});
916916
});
917917

918+
group('zoomEnabled', () {
919+
testWidgets('Enable zoom', (WidgetTester tester) async {
920+
await tester.pumpWidget(const WebView(
921+
zoomEnabled: true,
922+
));
923+
924+
final FakePlatformWebView platformWebView =
925+
fakePlatformViewsController.lastCreatedView!;
926+
927+
expect(platformWebView.zoomEnabled, isTrue);
928+
});
929+
930+
testWidgets('defaults to true', (WidgetTester tester) async {
931+
await tester.pumpWidget(const WebView());
932+
933+
final FakePlatformWebView platformWebView =
934+
fakePlatformViewsController.lastCreatedView!;
935+
936+
expect(platformWebView.zoomEnabled, isTrue);
937+
});
938+
939+
testWidgets('can be changed', (WidgetTester tester) async {
940+
final GlobalKey key = GlobalKey();
941+
await tester.pumpWidget(WebView(key: key));
942+
943+
final FakePlatformWebView platformWebView =
944+
fakePlatformViewsController.lastCreatedView!;
945+
946+
await tester.pumpWidget(WebView(
947+
key: key,
948+
zoomEnabled: true,
949+
));
950+
951+
expect(platformWebView.zoomEnabled, isTrue);
952+
953+
await tester.pumpWidget(WebView(
954+
key: key,
955+
zoomEnabled: false,
956+
));
957+
958+
expect(platformWebView.zoomEnabled, isFalse);
959+
});
960+
});
961+
918962
group('Custom platform implementation', () {
919963
setUpAll(() {
920964
WebView.platform = MyWebViewPlatform();
@@ -944,6 +988,7 @@ void main() {
944988
debuggingEnabled: false,
945989
userAgent: WebSetting<String?>.of(null),
946990
gestureNavigationEnabled: true,
991+
zoomEnabled: true,
947992
),
948993
)));
949994
});
@@ -1011,6 +1056,7 @@ class FakePlatformWebView {
10111056
params['settings']['hasNavigationDelegate'] ?? false;
10121057
debuggingEnabled = params['settings']['debuggingEnabled'];
10131058
userAgent = params['settings']['userAgent'];
1059+
zoomEnabled = params['settings']['zoomEnabled'] ?? true;
10141060
channel = MethodChannel(
10151061
'plugins.flutter.io/webview_$id', const StandardMethodCodec());
10161062
channel.setMockMethodCallHandler(onMethodCall);
@@ -1030,6 +1076,7 @@ class FakePlatformWebView {
10301076
bool? hasNavigationDelegate;
10311077
bool? debuggingEnabled;
10321078
String? userAgent;
1079+
bool? zoomEnabled;
10331080

10341081
String? lastRunJavaScriptString;
10351082

@@ -1050,6 +1097,9 @@ class FakePlatformWebView {
10501097
debuggingEnabled = call.arguments['debuggingEnabled'];
10511098
}
10521099
userAgent = call.arguments['userAgent'];
1100+
if (call.arguments['zoomEnabled'] != null) {
1101+
zoomEnabled = call.arguments['zoomEnabled'];
1102+
}
10531103
break;
10541104
case 'canGoBack':
10551105
return Future<bool>.sync(() => currentPosition > 0);
@@ -1307,7 +1357,8 @@ class MatchesWebSettings extends Matcher {
13071357
_webSettings!.debuggingEnabled == webSettings.debuggingEnabled &&
13081358
_webSettings!.gestureNavigationEnabled ==
13091359
webSettings.gestureNavigationEnabled &&
1310-
_webSettings!.userAgent == webSettings.userAgent;
1360+
_webSettings!.userAgent == webSettings.userAgent &&
1361+
_webSettings!.zoomEnabled == webSettings.zoomEnabled;
13111362
}
13121363
}
13131364

0 commit comments

Comments
 (0)