Skip to content

Commit 04a2d2f

Browse files
authored
Reland "[webview_flutter] Add a getTitle method to WebViewController" (flutter#1981)" (flutter#2056)
This reverts commit e4feab6.
1 parent 096da0a commit 04a2d2f

8 files changed

Lines changed: 70 additions & 1 deletion

File tree

packages/webview_flutter/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.3.14
2+
3+
* Added a getTitle getter to WebViewController.
4+
15
## 0.3.13
26

37
* Add an optional `userAgent` property to set a custom User Agent.

packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ public void onMethodCall(MethodCall methodCall, Result result) {
134134
case "clearCache":
135135
clearCache(result);
136136
break;
137+
case "getTitle":
138+
getTitle(result);
139+
break;
137140
default:
138141
result.notImplemented();
139142
}
@@ -226,6 +229,10 @@ private void clearCache(Result result) {
226229
result.success(null);
227230
}
228231

232+
private void getTitle(Result result) {
233+
result.success(webView.getTitle());
234+
}
235+
229236
private void applySettings(Map<String, Object> settings) {
230237
for (String key : settings.keySet()) {
231238
switch (key) {

packages/webview_flutter/example/test_driver/webview.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,43 @@ void main() {
457457
expect(isPaused, _webviewBool(false));
458458
});
459459
});
460+
461+
test('getTitle', () async {
462+
final String getTitleTest = '''
463+
<!DOCTYPE html><html>
464+
<head><title>Some title</title>
465+
</head>
466+
<body>
467+
</body>
468+
</html>
469+
''';
470+
final String getTitleTestBase64 =
471+
base64Encode(const Utf8Encoder().convert(getTitleTest));
472+
final Completer<void> pageLoaded = Completer<void>();
473+
final Completer<WebViewController> controllerCompleter =
474+
Completer<WebViewController>();
475+
476+
await pumpWidget(
477+
Directionality(
478+
textDirection: TextDirection.ltr,
479+
child: WebView(
480+
initialUrl: 'data:text/html;charset=utf-8;base64,$getTitleTestBase64',
481+
onWebViewCreated: (WebViewController controller) {
482+
controllerCompleter.complete(controller);
483+
},
484+
onPageFinished: (String url) {
485+
pageLoaded.complete(null);
486+
},
487+
),
488+
),
489+
);
490+
491+
final WebViewController controller = await controllerCompleter.future;
492+
await pageLoaded.future;
493+
494+
final String title = await controller.getTitle();
495+
expect(title, 'Some title');
496+
});
460497
}
461498

462499
Future<void> pumpWidget(Widget widget) {

packages/webview_flutter/ios/Classes/FlutterWebView.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
118118
[self onRemoveJavaScriptChannels:call result:result];
119119
} else if ([[call method] isEqualToString:@"clearCache"]) {
120120
[self clearCache:result];
121+
} else if ([[call method] isEqualToString:@"getTitle"]) {
122+
[self onGetTitle:result];
121123
} else {
122124
result(FlutterMethodNotImplemented);
123125
}
@@ -238,6 +240,11 @@ - (void)clearCache:(FlutterResult)result {
238240
}
239241
}
240242

243+
- (void)onGetTitle:(FlutterResult)result {
244+
NSString* title = _webView.title;
245+
result(title);
246+
}
247+
241248
// Returns nil when successful, or an error message when one or more keys are unknown.
242249
- (NSString*)applySettings:(NSDictionary<NSString*, id>*)settings {
243250
NSMutableArray<NSString*>* unknownKeys = [[NSMutableArray alloc] init];

packages/webview_flutter/lib/platform_interface.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ abstract class WebViewPlatformController {
158158
throw UnimplementedError(
159159
"WebView removeJavascriptChannels is not implemented on the current platform");
160160
}
161+
162+
/// Returns the title of the currently loaded page.
163+
Future<String> getTitle() {
164+
throw UnimplementedError(
165+
"WebView getTitle is not implemented on the current platform");
166+
}
161167
}
162168

163169
/// A single setting for configuring a WebViewPlatform which may be absent.

packages/webview_flutter/lib/src/webview_method_channel.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController {
103103
'removeJavascriptChannels', javascriptChannelNames.toList());
104104
}
105105

106+
@override
107+
Future<String> getTitle() => _channel.invokeMethod<String>("getTitle");
108+
106109
/// Method channel implementation for [WebViewPlatform.clearCookies].
107110
static Future<bool> clearCookies() {
108111
return _cookieManagerChannel

packages/webview_flutter/lib/webview_flutter.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,11 @@ class WebViewController {
625625
// ignore: strong_mode_implicit_dynamic_method
626626
return _webViewPlatformController.evaluateJavascript(javascriptString);
627627
}
628+
629+
/// Returns the title of the currently loaded page.
630+
Future<String> getTitle() {
631+
return _webViewPlatformController.getTitle();
632+
}
628633
}
629634

630635
/// Manages cookies pertaining to all [WebView]s.

packages/webview_flutter/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: webview_flutter
22
description: A Flutter plugin that provides a WebView widget on Android and iOS.
3-
version: 0.3.13
3+
version: 0.3.14
44
author: Flutter Team <[email protected]>
55
homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter
66

0 commit comments

Comments
 (0)