diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 8600d04b3ffb..80edcc8279f2 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.12 + +* Added a getTitle getter to WebViewController. + ## 0.3.11+6 * Calling destroy on Android webview when flutter webview is getting disposed. diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 67fdcc71b3df..333e7e8067bf 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -130,6 +130,9 @@ public void onMethodCall(MethodCall methodCall, Result result) { case "clearCache": clearCache(result); break; + case "getTitle": + getTitle(result); + break; default: result.notImplemented(); } @@ -222,6 +225,10 @@ private void clearCache(Result result) { result.success(null); } + private void getTitle(Result result) { + result.success(webView.getTitle()); + } + private void applySettings(Map settings) { for (String key : settings.keySet()) { switch (key) { diff --git a/packages/webview_flutter/example/test_driver/webview.dart b/packages/webview_flutter/example/test_driver/webview.dart index fefaf6d49bef..7e1440b71409 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview.dart @@ -369,6 +369,43 @@ void main() { expect(isPaused, _webviewBool(false)); }); }); + + test('getTitle', () async { + final String getTitleTest = ''' + + Some title + + + + + '''; + final String getTitleTestBase64 = + base64Encode(const Utf8Encoder().convert(getTitleTest)); + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); + + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + initialUrl: 'data:text/html;charset=utf-8;base64,$getTitleTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + ), + ), + ); + + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; + + final String title = await controller.getTitle(); + expect(title, 'Some title'); + }); } Future pumpWidget(Widget widget) { diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index c0aa7fd650f6..8fd855e2c8bd 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -118,6 +118,8 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { [self onRemoveJavaScriptChannels:call result:result]; } else if ([[call method] isEqualToString:@"clearCache"]) { [self clearCache:result]; + } else if ([[call method] isEqualToString:@"getTitle"]) { + [self onGetTitle:result]; } else { result(FlutterMethodNotImplemented); } @@ -238,6 +240,11 @@ - (void)clearCache:(FlutterResult)result { } } +- (void)onGetTitle:(FlutterResult)result { + NSString* title = _webView.title; + result(title); +} + // Returns nil when successful, or an error message when one or more keys are unknown. - (NSString*)applySettings:(NSDictionary*)settings { NSMutableArray* unknownKeys = [[NSMutableArray alloc] init]; diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 4e6b8b86cacf..644c33a4e014 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -152,6 +152,12 @@ abstract class WebViewPlatformController { throw UnimplementedError( "WebView removeJavascriptChannels is not implemented on the current platform"); } + + /// Returns the title of the currently loaded page. + Future getTitle() { + throw UnimplementedError( + "WebView getTitle is not implemented on the current platform"); + } } /// Settings for configuring a WebViewPlatform. diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index a914e1828b6b..337e871145aa 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -103,6 +103,9 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { 'removeJavascriptChannels', javascriptChannelNames.toList()); } + @override + Future getTitle() => _channel.invokeMethod("getTitle"); + /// Method channel implementation for [WebViewPlatform.clearCookies]. static Future clearCookies() { return _cookieManagerChannel diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 4335ed27ada8..8d81278955a0 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -600,6 +600,11 @@ class WebViewController { // ignore: strong_mode_implicit_dynamic_method return _webViewPlatformController.evaluateJavascript(javascriptString); } + + /// Returns the title of the currently loaded page. + Future getTitle() { + return _webViewPlatformController.getTitle(); + } } /// Manages cookies pertaining to all [WebView]s. diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index ce39caee2fd6..6c668033548b 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.11+6 +version: 0.3.12 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter