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

Commit

Permalink
[webview_flutter] Implement loadRequest in iOS package. (#4480)
Browse files Browse the repository at this point in the history
  • Loading branch information
BeMacized committed Nov 10, 2021
1 parent 0cfbe17 commit 0f90d24
Show file tree
Hide file tree
Showing 12 changed files with 334 additions and 30 deletions.
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

0 comments on commit 0f90d24

Please sign in to comment.