Skip to content

Commit c933398

Browse files
authored
[webview_flutter] Adds app facing implementation to override console log (flutter#4705)
Adds the app facing implementation for registering a JavaScript console callback. This will allow developers to receive JavaScript console messages in a Dart callback. This PR contains the `webview_flutter` specific changes from PR flutter#4541. Fixes flutter#32908 *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 e5fedee commit c933398

File tree

6 files changed

+91
-4
lines changed

6 files changed

+91
-4
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.4.0
2+
3+
* Adds support to register a callback to receive JavaScript console messages. See `WebViewController.setConsoleLogCallback`.
4+
15
## 4.3.0
26

37
* Adds support to retrieve the user agent. See `WebViewController.getUserAgent`.

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,40 @@ const String kTransparentBackgroundPage = '''
7676
</html>
7777
''';
7878

79+
const String kLogExamplePage = '''
80+
<!DOCTYPE html>
81+
<html lang="en">
82+
<head>
83+
<title>Load file or HTML string example</title>
84+
</head>
85+
<body onload="console.log('Logging that the page is loading.')">
86+
87+
<h1>Local demo page</h1>
88+
<p>
89+
This page is used to test the forwarding of console logs to Dart.
90+
</p>
91+
92+
<style>
93+
.btn-group button {
94+
padding: 24px; 24px;
95+
display: block;
96+
width: 25%;
97+
margin: 5px 0px 0px 0px;
98+
}
99+
</style>
100+
101+
<div class="btn-group">
102+
<button onclick="console.error('This is an error message.')">Error</button>
103+
<button onclick="console.warn('This is a warning message.')">Warning</button>
104+
<button onclick="console.info('This is a info message.')">Info</button>
105+
<button onclick="console.debug('This is a debug message.')">Debug</button>
106+
<button onclick="console.log('This is a log message.')">Log</button>
107+
</div>
108+
109+
</body>
110+
</html>
111+
''';
112+
79113
class WebViewExample extends StatefulWidget {
80114
const WebViewExample({super.key});
81115

@@ -208,6 +242,7 @@ enum MenuOptions {
208242
loadHtmlString,
209243
transparentBackground,
210244
setCookie,
245+
logExample,
211246
}
212247

213248
class SampleMenu extends StatelessWidget {
@@ -264,6 +299,9 @@ class SampleMenu extends StatelessWidget {
264299
case MenuOptions.setCookie:
265300
_onSetCookie();
266301
break;
302+
case MenuOptions.logExample:
303+
_onLogExample();
304+
break;
267305
}
268306
},
269307
itemBuilder: (BuildContext context) => <PopupMenuItem<MenuOptions>>[
@@ -320,6 +358,10 @@ class SampleMenu extends StatelessWidget {
320358
value: MenuOptions.setCookie,
321359
child: Text('Set cookie'),
322360
),
361+
const PopupMenuItem<MenuOptions>(
362+
value: MenuOptions.logExample,
363+
child: Text('Log example'),
364+
),
323365
],
324366
);
325367
}
@@ -463,6 +505,16 @@ class SampleMenu extends StatelessWidget {
463505

464506
return indexFile.path;
465507
}
508+
509+
Future<void> _onLogExample() {
510+
webViewController
511+
.setOnConsoleMessage((JavaScriptConsoleMessage consoleMessage) {
512+
debugPrint(
513+
'== JS == ${consoleMessage.level.name}: ${consoleMessage.message}');
514+
});
515+
516+
return webViewController.loadHtmlString(kLogExamplePage);
517+
}
466518
}
467519

468520
class NavigationControls extends StatelessWidget {

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,22 @@ class WebViewController {
354354
return platform.setUserAgent(userAgent);
355355
}
356356

357+
/// Sets a callback that notifies the host application on any log messages
358+
/// written to the JavaScript console.
359+
///
360+
/// Platforms may not preserve all the log level information so clients should
361+
/// not rely on a 1:1 mapping between the JavaScript calls.
362+
///
363+
/// On iOS setting this callback will inject a custom [WKUserScript] which
364+
/// overrides the default implementation of `console.debug`, `console.error`,
365+
/// `console.info`, `console.log` and `console.warning` methods. The iOS
366+
/// WebKit framework unfortunately doesn't provide a built-in method to
367+
/// forward console messages.
368+
Future<void> setOnConsoleMessage(
369+
void Function(JavaScriptConsoleMessage message) onConsoleMessage) {
370+
return platform.setOnConsoleMessage(onConsoleMessage);
371+
}
372+
357373
/// Gets the value used for the HTTP `User-Agent:` request header.
358374
Future<String?> getUserAgent() {
359375
return platform.getUserAgent();

packages/webview_flutter/webview_flutter/lib/webview_flutter.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ library webview_flutter;
66

77
export 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'
88
show
9+
JavaScriptConsoleMessage,
910
JavaScriptMessage,
1011
JavaScriptMode,
1112
LoadRequestMethod,

packages/webview_flutter/webview_flutter/pubspec.yaml

Lines changed: 3 additions & 3 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.3.0
5+
version: 4.4.0
66

77
environment:
88
sdk: ">=2.19.0 <4.0.0"
@@ -19,9 +19,9 @@ flutter:
1919
dependencies:
2020
flutter:
2121
sdk: flutter
22-
webview_flutter_android: ^3.0.0
22+
webview_flutter_android: ^3.12.0
2323
webview_flutter_platform_interface: ^2.6.0
24-
webview_flutter_wkwebview: ^3.0.0
24+
webview_flutter_wkwebview: ^3.9.0
2525

2626
dev_dependencies:
2727
build_runner: ^2.1.5

packages/webview_flutter/webview_flutter/test/webview_controller_test.dart

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,21 @@ void main() {
388388
expect(permissionRequestCallbackCalled, isTrue);
389389
});
390390

391+
test('setConsoleLogCallback', () async {
392+
final MockPlatformWebViewController mockPlatformWebViewController =
393+
MockPlatformWebViewController();
394+
395+
final WebViewController webViewController = WebViewController.fromPlatform(
396+
mockPlatformWebViewController,
397+
);
398+
399+
void onConsoleMessage(JavaScriptConsoleMessage message) {}
400+
401+
await webViewController.setOnConsoleMessage(onConsoleMessage);
402+
403+
verify(mockPlatformWebViewController.setOnConsoleMessage(onConsoleMessage));
404+
});
405+
391406
test('getUserAgent', () async {
392407
final MockPlatformWebViewController mockPlatformWebViewController =
393408
MockPlatformWebViewController();
@@ -401,7 +416,6 @@ void main() {
401416
final WebViewController webViewController = WebViewController.fromPlatform(
402417
mockPlatformWebViewController,
403418
);
404-
405419
await expectLater(webViewController.getUserAgent(), completion(userAgent));
406420
});
407421
}

0 commit comments

Comments
 (0)