Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/webview_flutter/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
## 0.1.1

* Added a `currentUrl` accessor for the WebView controller to look up what URL
is being displayed.

## 0.1.0+1

* Fix null crash when initialUrl is unset on iOS.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ public void onMethodCall(MethodCall methodCall, Result result) {
case "goForward":
goForward(methodCall, result);
break;
case "currentUrl":
currentUrl(methodCall, result);
break;
default:
result.notImplemented();
}
Expand Down Expand Up @@ -86,6 +89,10 @@ private void goForward(MethodCall methodCall, Result result) {
result.success(null);
}

private void currentUrl(MethodCall methodCall, Result result) {
result.success(webView.getUrl());
}

@SuppressWarnings("unchecked")
private void updateSettings(MethodCall methodCall, Result result) {
applySettings((Map<String, Object>) methodCall.arguments);
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
21 changes: 21 additions & 0 deletions packages/webview_flutter/example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,29 @@ class WebViewExample extends StatelessWidget {
_controller.complete(webViewController);
},
),
floatingActionButton: favoriteButton(),
);
}

Widget favoriteButton() {
return FutureBuilder<WebViewController>(
future: _controller.future,
builder: (BuildContext context,
AsyncSnapshot<WebViewController> controller) {
if (controller.hasData) {
return FloatingActionButton(
onPressed: () async {
final String url = await controller.data.currentUrl();
Scaffold.of(context).showSnackBar(
SnackBar(content: Text("Favorited $url")),
);
},
child: const Icon(Icons.favorite),
);
}
return Container();
});
}
}

class SampleMenu extends StatelessWidget {
Expand Down
8 changes: 8 additions & 0 deletions packages/webview_flutter/ios/Classes/FlutterWebView.m
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ @implementation FLTWebViewController {
WKWebView* _webView;
int64_t _viewId;
FlutterMethodChannel* _channel;
NSString* _currentUrl;
}

- (instancetype)initWithFrame:(CGRect)frame
Expand Down Expand Up @@ -74,6 +75,8 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
[self onGoBack:call result:result];
} else if ([[call method] isEqualToString:@"goForward"]) {
[self onGoForward:call result:result];
} else if ([[call method] isEqualToString:@"currentUrl"]) {
[self onCurrentUrl:call result:result];
} else {
result(FlutterMethodNotImplemented);
}
Expand Down Expand Up @@ -115,6 +118,11 @@ - (void)onGoForward:(FlutterMethodCall*)call result:(FlutterResult)result {
result(nil);
}

- (void)onCurrentUrl:(FlutterMethodCall*)call result:(FlutterResult)result {
_currentUrl = [[_webView URL] absoluteString];
result(_currentUrl);
}

- (void)applySettings:(NSDictionary<NSString*, id>*)settings {
for (NSString* key in settings) {
if ([key isEqualToString:@"jsMode"]) {
Expand Down
12 changes: 12 additions & 0 deletions packages/webview_flutter/lib/webview_flutter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,18 @@ class WebViewController {
return _channel.invokeMethod('loadUrl', url);
}

/// Accessor to the current URL that the WebView is displaying.
///
/// If [WebView.initialUrl] was never specified, returns `null`.
/// Note that this operation is asynchronous, and it is possible that the
/// current URL changes again by the time this function returns (in other
/// words, by the time this future completes, the WebView may be displaying a
/// different URL).
Future<String> currentUrl() async {
final String url = await _channel.invokeMethod('currentUrl');
return url;
}

/// Checks whether there's a back history item.
///
/// Note that this operation is asynchronous, and it is possible that the "canGoBack" state has
Expand Down
2 changes: 1 addition & 1 deletion packages/webview_flutter/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: webview_flutter
description: A Flutter plugin that provides a WebView widget on Android and iOS.
version: 0.1.0+1
version: 0.1.1
author: Flutter Team <flutter-dev@googlegroups.com>
homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter

Expand Down
81 changes: 50 additions & 31 deletions packages/webview_flutter/test/webview_flutter_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,17 @@ void main() {
});

testWidgets('Initial url', (WidgetTester tester) async {
await tester.pumpWidget(const WebView(
initialUrl: 'https://youtube.com',
));

final FakePlatformWebView platformWebView =
fakePlatformViewsController.lastCreatedView;
WebViewController controller;
await tester.pumpWidget(
WebView(
initialUrl: 'https://youtube.com',
onWebViewCreated: (WebViewController webViewController) {
controller = webViewController;
},
),
);

expect(platformWebView.currentUrl, 'https://youtube.com');
expect(await controller.currentUrl(), 'https://youtube.com');
});

testWidgets('JavaScript mode', (WidgetTester tester) async {
Expand Down Expand Up @@ -68,15 +71,12 @@ void main() {

expect(controller, isNotNull);

final FakePlatformWebView platformWebView =
fakePlatformViewsController.lastCreatedView;

controller.loadUrl('https://flutter.io');

expect(platformWebView.currentUrl, 'https://flutter.io');
expect(await controller.currentUrl(), 'https://flutter.io');
});

testWidgets('Invald urls', (WidgetTester tester) async {
testWidgets('Invalid urls', (WidgetTester tester) async {
WebViewController controller;
await tester.pumpWidget(
WebView(
Expand All @@ -88,18 +88,15 @@ void main() {

expect(controller, isNotNull);

final FakePlatformWebView platformWebView =
fakePlatformViewsController.lastCreatedView;

expect(() => controller.loadUrl(null), throwsA(anything));
expect(platformWebView.currentUrl, isNull);
expect(await controller.currentUrl(), isNull);

expect(() => controller.loadUrl(''), throwsA(anything));
expect(platformWebView.currentUrl, isNull);
expect(await controller.currentUrl(), isNull);

// Missing schema.
expect(() => controller.loadUrl('flutter.io'), throwsA(anything));
expect(platformWebView.currentUrl, isNull);
expect(await controller.currentUrl(), isNull);
});

testWidgets("Can't go back before loading a page",
Expand Down Expand Up @@ -224,18 +221,15 @@ void main() {

expect(controller, isNotNull);

final FakePlatformWebView platformWebView =
fakePlatformViewsController.lastCreatedView;

expect(platformWebView.currentUrl, 'https://youtube.com');
expect(await controller.currentUrl(), 'https://youtube.com');

controller.loadUrl('https://flutter.io');

expect(platformWebView.currentUrl, 'https://flutter.io');
expect(await controller.currentUrl(), 'https://flutter.io');

controller.goBack();

expect(platformWebView.currentUrl, 'https://youtube.com');
expect(await controller.currentUrl(), 'https://youtube.com');
});

testWidgets('Go forward', (WidgetTester tester) async {
Expand All @@ -251,22 +245,44 @@ void main() {

expect(controller, isNotNull);

final FakePlatformWebView platformWebView =
fakePlatformViewsController.lastCreatedView;

expect(platformWebView.currentUrl, 'https://youtube.com');
expect(await controller.currentUrl(), 'https://youtube.com');

controller.loadUrl('https://flutter.io');

expect(platformWebView.currentUrl, 'https://flutter.io');
expect(await controller.currentUrl(), 'https://flutter.io');

controller.goBack();

expect(platformWebView.currentUrl, 'https://youtube.com');
expect(await controller.currentUrl(), 'https://youtube.com');

controller.goForward();

expect(platformWebView.currentUrl, 'https://flutter.io');
expect(await controller.currentUrl(), 'https://flutter.io');
});

testWidgets('Current URL', (WidgetTester tester) async {
WebViewController controller;
await tester.pumpWidget(
WebView(
onWebViewCreated: (WebViewController webViewController) {
controller = webViewController;
},
),
);

expect(controller, isNotNull);

// Test a WebView without an explicitly set first URL.
expect(await controller.currentUrl(), isNull);

controller.loadUrl('https://youtube.com');
expect(await controller.currentUrl(), 'https://youtube.com');

controller.loadUrl('https://flutter.io');
expect(await controller.currentUrl(), 'https://flutter.io');

controller.goBack();
expect(await controller.currentUrl(), 'https://youtube.com');
});
}

Expand Down Expand Up @@ -321,6 +337,9 @@ class FakePlatformWebView {
currentPosition = min(history.length - 1, currentPosition + 1);
return Future<void>.sync(() {});
break;
case 'currentUrl':
return Future<String>.value(currentUrl);
break;
}
return Future<void>.sync(() {});
}
Expand Down