Skip to content

Commit f68661d

Browse files
[webview_flutter] Add a method for getting the user agent (#4472)
Aggregate PR for adding a method for retrieving the user agent. Internal: b/272582342
1 parent 41a3ec2 commit f68661d

11 files changed

+104
-26
lines changed

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+
## 4.3.0
2+
3+
* Adds support to retrieve the user agent. See `WebViewController.getUserAgent`.
4+
15
## 4.2.4
26

37
* Adds pub topics to package metadata.

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

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ Future<void> main() async {
179179

180180
await pageFinished.future;
181181

182-
final String customUserAgent = await _getUserAgent(controller);
182+
final String? customUserAgent = await controller.getUserAgent();
183183
expect(customUserAgent, 'Custom_User_Agent1');
184184
});
185185

@@ -876,22 +876,6 @@ String _webViewString(String value) {
876876
return '"$value"';
877877
}
878878

879-
/// Returns the value used for the HTTP User-Agent: request header in subsequent HTTP requests.
880-
Future<String> _getUserAgent(WebViewController controller) async {
881-
return _runJavascriptReturningResult(controller, 'navigator.userAgent;');
882-
}
883-
884-
Future<String> _runJavascriptReturningResult(
885-
WebViewController controller,
886-
String js,
887-
) async {
888-
if (defaultTargetPlatform == TargetPlatform.iOS) {
889-
return await controller.runJavaScriptReturningResult(js) as String;
890-
}
891-
return jsonDecode(await controller.runJavaScriptReturningResult(js) as String)
892-
as String;
893-
}
894-
895879
class ResizableWebView extends StatefulWidget {
896880
const ResizableWebView({
897881
super.key,

packages/webview_flutter/webview_flutter/example/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ dependencies:
1717
# The example app is bundled with the plugin so we use a path dependency on
1818
# the parent directory to use the current plugin's version.
1919
path: ../
20-
webview_flutter_android: ^3.6.0
21-
webview_flutter_wkwebview: ^3.4.0
20+
webview_flutter_android: ^3.12.0
21+
webview_flutter_wkwebview: ^3.9.0
2222

2323
dev_dependencies:
2424
build_runner: ^2.1.5

packages/webview_flutter/webview_flutter/lib/src/webview_controller.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,11 @@ class WebViewController {
353353
Future<void> setUserAgent(String? userAgent) {
354354
return platform.setUserAgent(userAgent);
355355
}
356+
357+
/// Gets the value used for the HTTP `User-Agent:` request header.
358+
Future<String?> getUserAgent() {
359+
return platform.getUserAgent();
360+
}
356361
}
357362

358363
/// Permissions request when web content requests access to protected resources.

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/packages/tree/main/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: 4.2.4
5+
version: 4.3.0
66

77
environment:
88
sdk: ">=2.19.0 <4.0.0"
@@ -20,7 +20,7 @@ dependencies:
2020
flutter:
2121
sdk: flutter
2222
webview_flutter_android: ^3.0.0
23-
webview_flutter_platform_interface: ^2.3.0
23+
webview_flutter_platform_interface: ^2.6.0
2424
webview_flutter_wkwebview: ^3.0.0
2525

2626
dev_dependencies:

packages/webview_flutter/webview_flutter/test/legacy/webview_flutter_test.mocks.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
// Mocks generated by Mockito 5.4.0 from annotations
1+
// Mocks generated by Mockito 5.4.1 from annotations
22
// in webview_flutter/test/legacy/webview_flutter_test.dart.
33
// Do not manually edit this file.
44

5+
// @dart=2.19
6+
57
// ignore_for_file: no_leading_underscores_for_library_prefixes
68
import 'dart:async' as _i9;
79

packages/webview_flutter/webview_flutter/test/navigation_delegate_test.mocks.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
// Mocks generated by Mockito 5.4.0 from annotations
1+
// Mocks generated by Mockito 5.4.1 from annotations
22
// in webview_flutter/test/navigation_delegate_test.dart.
33
// Do not manually edit this file.
44

5+
// @dart=2.19
6+
57
// ignore_for_file: no_leading_underscores_for_library_prefixes
68
import 'dart:async' as _i8;
79

@@ -208,6 +210,16 @@ class MockPlatformNavigationDelegate extends _i1.Mock
208210
returnValueForMissingStub: _i8.Future<void>.value(),
209211
) as _i8.Future<void>);
210212
@override
213+
_i8.Future<void> setOnHttpError(_i3.HttpResponseErrorCallback? onHttpError) =>
214+
(super.noSuchMethod(
215+
Invocation.method(
216+
#setOnHttpError,
217+
[onHttpError],
218+
),
219+
returnValue: _i8.Future<void>.value(),
220+
returnValueForMissingStub: _i8.Future<void>.value(),
221+
) as _i8.Future<void>);
222+
@override
211223
_i8.Future<void> setOnProgress(_i3.ProgressCallback? onProgress) =>
212224
(super.noSuchMethod(
213225
Invocation.method(

packages/webview_flutter/webview_flutter/test/webview_controller_test.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,23 @@ void main() {
387387
requestCallback(const TestPlatformWebViewPermissionRequest());
388388
expect(permissionRequestCallbackCalled, isTrue);
389389
});
390+
391+
test('getUserAgent', () async {
392+
final MockPlatformWebViewController mockPlatformWebViewController =
393+
MockPlatformWebViewController();
394+
395+
const String userAgent = 'str';
396+
397+
when(mockPlatformWebViewController.getUserAgent()).thenAnswer(
398+
(_) => Future<String?>.value(userAgent),
399+
);
400+
401+
final WebViewController webViewController = WebViewController.fromPlatform(
402+
mockPlatformWebViewController,
403+
);
404+
405+
await expectLater(webViewController.getUserAgent(), completion(userAgent));
406+
});
390407
}
391408

392409
class TestPlatformWebViewPermissionRequest

packages/webview_flutter/webview_flutter/test/webview_controller_test.mocks.dart

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
// Mocks generated by Mockito 5.4.0 from annotations
1+
// Mocks generated by Mockito 5.4.1 from annotations
22
// in webview_flutter/test/webview_controller_test.dart.
33
// Do not manually edit this file.
44

5+
// @dart=2.19
6+
57
// ignore_for_file: no_leading_underscores_for_library_prefixes
68
import 'dart:async' as _i5;
79
import 'dart:ui' as _i3;
@@ -353,6 +355,25 @@ class MockPlatformWebViewController extends _i1.Mock
353355
returnValue: _i5.Future<void>.value(),
354356
returnValueForMissingStub: _i5.Future<void>.value(),
355357
) as _i5.Future<void>);
358+
@override
359+
_i5.Future<String?> getUserAgent() => (super.noSuchMethod(
360+
Invocation.method(
361+
#getUserAgent,
362+
[],
363+
),
364+
returnValue: _i5.Future<String?>.value(),
365+
) as _i5.Future<String?>);
366+
@override
367+
_i5.Future<void> setOnConsoleMessage(
368+
void Function(_i2.JavaScriptConsoleMessage)? onConsoleMessage) =>
369+
(super.noSuchMethod(
370+
Invocation.method(
371+
#setOnConsoleMessage,
372+
[onConsoleMessage],
373+
),
374+
returnValue: _i5.Future<void>.value(),
375+
returnValueForMissingStub: _i5.Future<void>.value(),
376+
) as _i5.Future<void>);
356377
}
357378

358379
/// A class which mocks [PlatformNavigationDelegate].
@@ -405,6 +426,16 @@ class MockPlatformNavigationDelegate extends _i1.Mock
405426
returnValueForMissingStub: _i5.Future<void>.value(),
406427
) as _i5.Future<void>);
407428
@override
429+
_i5.Future<void> setOnHttpError(_i6.HttpResponseErrorCallback? onHttpError) =>
430+
(super.noSuchMethod(
431+
Invocation.method(
432+
#setOnHttpError,
433+
[onHttpError],
434+
),
435+
returnValue: _i5.Future<void>.value(),
436+
returnValueForMissingStub: _i5.Future<void>.value(),
437+
) as _i5.Future<void>);
438+
@override
408439
_i5.Future<void> setOnProgress(_i6.ProgressCallback? onProgress) =>
409440
(super.noSuchMethod(
410441
Invocation.method(

packages/webview_flutter/webview_flutter/test/webview_cookie_manager_test.mocks.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
// Mocks generated by Mockito 5.4.0 from annotations
1+
// Mocks generated by Mockito 5.4.1 from annotations
22
// in webview_flutter/test/webview_cookie_manager_test.dart.
33
// Do not manually edit this file.
44

5+
// @dart=2.19
6+
57
// ignore_for_file: no_leading_underscores_for_library_prefixes
68
import 'dart:async' as _i4;
79

packages/webview_flutter/webview_flutter/test/webview_widget_test.mocks.dart

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
// Mocks generated by Mockito 5.4.0 from annotations
1+
// Mocks generated by Mockito 5.4.1 from annotations
22
// in webview_flutter/test/webview_widget_test.dart.
33
// Do not manually edit this file.
44

5+
// @dart=2.19
6+
57
// ignore_for_file: no_leading_underscores_for_library_prefixes
68
import 'dart:async' as _i7;
79
import 'dart:ui' as _i3;
@@ -371,6 +373,25 @@ class MockPlatformWebViewController extends _i1.Mock
371373
returnValue: _i7.Future<void>.value(),
372374
returnValueForMissingStub: _i7.Future<void>.value(),
373375
) as _i7.Future<void>);
376+
@override
377+
_i7.Future<String?> getUserAgent() => (super.noSuchMethod(
378+
Invocation.method(
379+
#getUserAgent,
380+
[],
381+
),
382+
returnValue: _i7.Future<String?>.value(),
383+
) as _i7.Future<String?>);
384+
@override
385+
_i7.Future<void> setOnConsoleMessage(
386+
void Function(_i2.JavaScriptConsoleMessage)? onConsoleMessage) =>
387+
(super.noSuchMethod(
388+
Invocation.method(
389+
#setOnConsoleMessage,
390+
[onConsoleMessage],
391+
),
392+
returnValue: _i7.Future<void>.value(),
393+
returnValueForMissingStub: _i7.Future<void>.value(),
394+
) as _i7.Future<void>);
374395
}
375396

376397
/// A class which mocks [PlatformWebViewWidget].

0 commit comments

Comments
 (0)