Skip to content
This repository has been archived by the owner on Feb 22, 2023. It is now read-only.

[webview_flutter] Implement loadRequest in iOS package. #4480

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
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 2.3.0

* Implemented new `loadRequest` method from platform interface.

## 2.2.0

* Implemented new `runJavascript` and `runJavascriptReturningResult` methods in platform interface.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,6 @@
C370F140C3A19241FD8C5E64 /* Pods-RunnerTests.debug.xcconfig */,
5C776D27D0DDA247ED5EA72B /* Pods-RunnerTests.release.xcconfig */,
);
name = Pods;
path = Pods;
sourceTree = "<group>";
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
@import Flutter;
@import XCTest;
@import webview_flutter_wkwebview;
@import webview_flutter_wkwebview.Test;

// OCMock library doesn't generate a valid modulemap.
#import <OCMock/OCMock.h>
Expand Down Expand Up @@ -301,4 +302,196 @@ - (void)testRunJavascriptReturningResultReturnsErrorResultForWKError {
[self waitForExpectationsWithTimeout:30.0 handler:nil];
}

- (void)testBuildNSURLRequestReturnsNilForNonDictionaryValue {
// Setup
FLTWebViewController *controller =
[[FLTWebViewController alloc] initWithFrame:CGRectMake(0, 0, 300, 400)
viewIdentifier:1
arguments:nil
binaryMessenger:self.mockBinaryMessenger];

// Run
NSURLRequest *request = [controller buildNSURLRequest:@{@"request" : @"Non Dictionary Value"}];

// Verify
XCTAssertNil(request);
}

- (void)testBuildNSURLRequestReturnsNilForMissingURI {
// Setup
FLTWebViewController *controller =
[[FLTWebViewController alloc] initWithFrame:CGRectMake(0, 0, 300, 400)
viewIdentifier:1
arguments:nil
binaryMessenger:self.mockBinaryMessenger];

// Run
NSURLRequest *request = [controller buildNSURLRequest:@{@"request" : @{}}];

// Verify
XCTAssertNil(request);
}

- (void)testBuildNSURLRequestReturnsNilForInvalidURI {
// Setup
FLTWebViewController *controller =
[[FLTWebViewController alloc] initWithFrame:CGRectMake(0, 0, 300, 400)
viewIdentifier:1
arguments:nil
binaryMessenger:self.mockBinaryMessenger];

// Run
NSDictionary *requestData = @{@"uri" : @"invalid uri"};
NSURLRequest *request = [controller buildNSURLRequest:@{@"request" : requestData}];

// Verify
XCTAssertNil(request);
}

- (void)testBuildNSURLRequestBuildsNSMutableURLRequestWithOptionalParameters {
// Setup
FLTWebViewController *controller =
[[FLTWebViewController alloc] initWithFrame:CGRectMake(0, 0, 300, 400)
viewIdentifier:1
arguments:nil
binaryMessenger:self.mockBinaryMessenger];

// Run
NSDictionary *requestData = @{
@"uri" : @"https://flutter.dev",
@"method" : @"POST",
@"headers" : @{@"Foo" : @"Bar"},
@"body" : [FlutterStandardTypedData
typedDataWithBytes:[@"Test Data" dataUsingEncoding:NSUTF8StringEncoding]],
};
NSURLRequest *request = [controller buildNSURLRequest:@{@"request" : requestData}];

// Verify
XCTAssertNotNil(request);
XCTAssertEqualObjects(request.URL.absoluteString, @"https://flutter.dev");
XCTAssertEqualObjects(request.HTTPMethod, @"POST");
XCTAssertEqualObjects(request.allHTTPHeaderFields, @{@"Foo" : @"Bar"});
XCTAssertEqualObjects(request.HTTPBody, [@"Test Data" dataUsingEncoding:NSUTF8StringEncoding]);
}

- (void)testBuildNSURLRequestBuildsNSMutableURLRequestWithoutOptionalParameters {
// Setup
FLTWebViewController *controller =
[[FLTWebViewController alloc] initWithFrame:CGRectMake(0, 0, 300, 400)
viewIdentifier:1
arguments:nil
binaryMessenger:self.mockBinaryMessenger];

// Run
NSDictionary *requestData = @{
@"uri" : @"https://flutter.dev",
};
NSURLRequest *request = [controller buildNSURLRequest:@{@"request" : requestData}];

// Verify
XCTAssertNotNil(request);
XCTAssertEqualObjects(request.URL.absoluteString, @"https://flutter.dev");
XCTAssertEqualObjects(request.HTTPMethod, @"GET");
XCTAssertNil(request.allHTTPHeaderFields);
XCTAssertNil(request.HTTPBody);
}

- (void)testOnLoadUrlReturnsErrorResultForInvalidRequest {
// Setup
FLTWebViewController *controller =
[[FLTWebViewController alloc] initWithFrame:CGRectMake(0, 0, 300, 400)
viewIdentifier:1
arguments:nil
binaryMessenger:self.mockBinaryMessenger];
XCTestExpectation *resultExpectation =
[self expectationWithDescription:@"Should return error result when request cannot be built"];

// Run
FlutterMethodCall *methodCall = [FlutterMethodCall methodCallWithMethodName:@"loadUrl"
arguments:@{}];
[controller onLoadUrl:methodCall
result:^(id _Nullable result) {
XCTAssertTrue([result class] == [FlutterError class]);
[resultExpectation fulfill];
}];

// Verify
[self waitForExpectationsWithTimeout:30.0 handler:nil];
}

- (void)testOnLoadUrlLoadsRequestWithSuccessResult {
// Setup
FLTWebViewController *controller =
[[FLTWebViewController alloc] initWithFrame:CGRectMake(0, 0, 300, 400)
viewIdentifier:1
arguments:nil
binaryMessenger:self.mockBinaryMessenger];
XCTestExpectation *resultExpectation = [self expectationWithDescription:@"Should return nil"];
FLTWKWebView *mockView = OCMClassMock(FLTWKWebView.class);
controller.webView = mockView;

// Run
FlutterMethodCall *methodCall =
[FlutterMethodCall methodCallWithMethodName:@"loadUrl"
arguments:@{@"url" : @"https://flutter.dev/"}];
[controller onLoadUrl:methodCall
result:^(id _Nullable result) {
XCTAssertNil(result);
[resultExpectation fulfill];
}];

// Verify
OCMVerify([mockView loadRequest:[OCMArg any]]);
[self waitForExpectationsWithTimeout:30.0 handler:nil];
}

- (void)testOnLoadRequestReturnsErroResultForInvalidRequest {
// Setup
FLTWebViewController *controller =
[[FLTWebViewController alloc] initWithFrame:CGRectMake(0, 0, 300, 400)
viewIdentifier:1
arguments:nil
binaryMessenger:self.mockBinaryMessenger];
XCTestExpectation *resultExpectation =
[self expectationWithDescription:@"Should return error result when request cannot be built"];

// Run
FlutterMethodCall *methodCall = [FlutterMethodCall methodCallWithMethodName:@"loadRequest"
arguments:@{}];
[controller onLoadRequest:methodCall
result:^(id _Nullable result) {
XCTAssertTrue([result class] == [FlutterError class]);
[resultExpectation fulfill];
}];

// Verify
[self waitForExpectationsWithTimeout:30.0 handler:nil];
}

- (void)testOnLoadRequestLoadsRequestWithSuccessResult {
// Setup
FLTWebViewController *controller =
[[FLTWebViewController alloc] initWithFrame:CGRectMake(0, 0, 300, 400)
viewIdentifier:1
arguments:nil
binaryMessenger:self.mockBinaryMessenger];
XCTestExpectation *resultExpectation = [self expectationWithDescription:@"Should return nil"];
FLTWKWebView *mockView = OCMClassMock(FLTWKWebView.class);
controller.webView = mockView;

// Run
FlutterMethodCall *methodCall = [FlutterMethodCall
methodCallWithMethodName:@"loadRequest"
arguments:@{@"request" : @{@"uri" : @"https://flutter.dev/"}}];
[controller onLoadRequest:methodCall
result:^(id _Nullable result) {
XCTAssertNil(result);
[resultExpectation fulfill];
}];

// Verify
OCMVerify([mockView loadRequest:[OCMArg any]]);
[self waitForExpectationsWithTimeout:30.0 handler:nil];
}

@end
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
Expand Down Expand Up @@ -120,6 +121,7 @@ enum _MenuOptions {
listCache,
clearCache,
navigationDelegate,
doPostRequest,
}

class _SampleMenu extends StatelessWidget {
Expand Down Expand Up @@ -157,6 +159,9 @@ class _SampleMenu extends StatelessWidget {
case _MenuOptions.navigationDelegate:
_onNavigationDelegateExample(controller.data!, context);
break;
case _MenuOptions.doPostRequest:
_onDoPostRequest(controller.data!, context);
break;
}
},
itemBuilder: (BuildContext context) => <PopupMenuItem<_MenuOptions>>[
Expand Down Expand Up @@ -189,6 +194,10 @@ class _SampleMenu extends StatelessWidget {
value: _MenuOptions.navigationDelegate,
child: Text('Navigation Delegate example'),
),
const PopupMenuItem<_MenuOptions>(
value: _MenuOptions.doPostRequest,
child: Text('Post Request'),
),
],
);
},
Expand Down Expand Up @@ -259,6 +268,17 @@ class _SampleMenu extends StatelessWidget {
await controller.loadUrl('data:text/html;base64,$contentBase64');
}

void _onDoPostRequest(
WebViewController controller, BuildContext context) async {
WebViewRequest request = WebViewRequest(
uri: Uri.parse('https://httpbin.org/post'),
method: WebViewRequestMethod.post,
headers: {'foo': 'bar', 'Content-Type': 'text/plain'},
body: Uint8List.fromList('Test Body'.codeUnits),
);
await controller.loadRequest(request);
}

Widget _getCookieList(String cookies) {
if (cookies == null || cookies == '""') {
return Container();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,11 @@ class WebViewController {
return _webViewPlatformController.loadUrl(url, headers);
}

/// Loads a page by making the specified request.
Future<void> loadRequest(WebViewRequest request) async {
return _webViewPlatformController.loadRequest(request);
}

/// Accessor to the current URL that the WebView is displaying.
///
/// If [WebView.initialUrl] was never specified, returns `null`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
- (UIView*)view;

- (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result;

@end

@interface FLTWebViewFactory : NSObject <FlutterPlatformViewFactory>
Expand Down
Loading