Skip to content

Commit 58d4016

Browse files
authored
[webview_flutter_android] feat: Expose setUseWideViewPort on Android (#106999) (flutter#9151)
The option to set whether the webview should use the wide viewport should be available. Also the default is changed to false, because this is the expected behavior on Android devices: https://developer.android.com/develop/ui/views/layout/webapps/targeting On iOS also the default behavior is to NOT use wide viewport, so this is aligned. > Note: When your page is rendered in a WebView, it doesn't use wide viewport mode by default. You can enable wide viewport mode with setUseWideViewPort(). This also partically solves flutter/flutter#106999, as then the correct height is returned from `document.documentElement.scrollHeight;` property. *If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].*
1 parent 8b7ef20 commit 58d4016

File tree

5 files changed

+62
-3
lines changed

5 files changed

+62
-3
lines changed

packages/webview_flutter/webview_flutter_android/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 4.6.0
2+
3+
* Adds support to set using wide view port. See `AndroidWebViewController.setUseWideViewPort`.
4+
* Changes default of `WebSettings.setUseWideViewPort` to `false` to align with native WebViews.
5+
16
## 4.5.0
27

38
* Adds support to set whether to draw the scrollbar. See

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,26 @@ const String kAlertTestPage = '''
139139
</html>
140140
''';
141141

142+
const String kViewportMetaPage = '''
143+
<!DOCTYPE html>
144+
<html>
145+
<head>
146+
<title>Viewport meta example</title>
147+
</head>
148+
<meta name="viewport" content="width=1000, initial-scale=1" />
149+
<style type="text/css">
150+
body { background: transparent; margin: 0; padding: 0; }
151+
#shape { background: red; width: 50vw; height: 50vw; }
152+
</style>
153+
<body>
154+
<div>
155+
<p>Viewport meta example</p>
156+
<img id="shape" src="https://storage.googleapis.com/cms-storage-bucket/4fd5520fe28ebf839174.svg"/>
157+
</div>
158+
</body>
159+
</html>
160+
''';
161+
142162
class WebViewExample extends StatefulWidget {
143163
const WebViewExample({super.key, this.cookieManager});
144164

@@ -325,6 +345,7 @@ enum MenuOptions {
325345
logExample,
326346
basicAuthentication,
327347
javaScriptAlert,
348+
viewportMeta,
328349
}
329350

330351
class SampleMenu extends StatelessWidget {
@@ -380,6 +401,8 @@ class SampleMenu extends StatelessWidget {
380401
_promptForUrl(context);
381402
case MenuOptions.javaScriptAlert:
382403
_onJavaScriptAlertExample(context);
404+
case MenuOptions.viewportMeta:
405+
_onViewportMetaExample();
383406
}
384407
},
385408
itemBuilder: (BuildContext context) => <PopupMenuItem<MenuOptions>>[
@@ -452,6 +475,10 @@ class SampleMenu extends StatelessWidget {
452475
value: MenuOptions.javaScriptAlert,
453476
child: Text('JavaScript Alert Example'),
454477
),
478+
const PopupMenuItem<MenuOptions>(
479+
value: MenuOptions.viewportMeta,
480+
child: Text('Viewport meta example'),
481+
),
455482
],
456483
);
457484
}
@@ -748,6 +775,10 @@ class SampleMenu extends StatelessWidget {
748775
}) ??
749776
'';
750777
}
778+
779+
Future<void> _onViewportMetaExample() {
780+
return webViewController.loadHtmlString(kViewportMetaPage);
781+
}
751782
}
752783

753784
class NavigationControls extends StatelessWidget {

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class AndroidWebViewController extends PlatformWebViewController {
8686
_webView.settings.setJavaScriptCanOpenWindowsAutomatically(true);
8787
_webView.settings.setSupportMultipleWindows(true);
8888
_webView.settings.setLoadWithOverviewMode(true);
89-
_webView.settings.setUseWideViewPort(true);
89+
_webView.settings.setUseWideViewPort(false);
9090
_webView.settings.setDisplayZoomControls(false);
9191
_webView.settings.setBuiltInZoomControls(true);
9292

@@ -599,6 +599,13 @@ class AndroidWebViewController extends PlatformWebViewController {
599599
Future<void> setTextZoom(int textZoom) =>
600600
_webView.settings.setTextZoom(textZoom);
601601

602+
/// Sets whether the WebView should enable support for the "viewport" HTML
603+
/// meta tag or should use a wide viewport.
604+
///
605+
/// The default is false.
606+
Future<void> setUseWideViewPort(bool use) =>
607+
_webView.settings.setUseWideViewPort(use);
608+
602609
/// Enables or disables content URL access.
603610
///
604611
/// The default is true.

packages/webview_flutter/webview_flutter_android/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: webview_flutter_android
22
description: A Flutter plugin that provides a WebView widget on Android.
33
repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_android
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
5-
version: 4.5.0
5+
version: 4.6.0
66

77
environment:
88
sdk: ^3.6.0

packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ void main() {
289289
.called(1);
290290
verify(mockWebSettings.setLoadWithOverviewMode(true)).called(1);
291291
verify(mockWebSettings.setSupportMultipleWindows(true)).called(1);
292-
verify(mockWebSettings.setUseWideViewPort(true)).called(1);
292+
verify(mockWebSettings.setUseWideViewPort(false)).called(1);
293293
});
294294

295295
test('loadFile without file prefix', () async {
@@ -1598,6 +1598,22 @@ void main() {
15981598
verify(mockSettings.setMediaPlaybackRequiresUserGesture(true)).called(1);
15991599
});
16001600

1601+
test('setUseWideViewPort', () async {
1602+
final MockWebView mockWebView = MockWebView();
1603+
final MockWebSettings mockSettings = MockWebSettings();
1604+
final AndroidWebViewController controller = createControllerWithMocks(
1605+
mockWebView: mockWebView,
1606+
mockSettings: mockSettings,
1607+
);
1608+
1609+
clearInteractions(mockWebView);
1610+
1611+
await controller.setUseWideViewPort(true);
1612+
1613+
verify(mockWebView.settings).called(1);
1614+
verify(mockSettings.setUseWideViewPort(true)).called(1);
1615+
});
1616+
16011617
test('setAllowContentAccess', () async {
16021618
final MockWebView mockWebView = MockWebView();
16031619
final MockWebSettings mockSettings = MockWebSettings();

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy