Skip to content
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
4 changes: 2 additions & 2 deletions packages/webview_flutter/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
## NEXT

## 0.7.1
* Remove unnecessary integration test.
* Remove unused code.
* Implements `LoadRequestMethod.post` of `PlatformWebViewController.loadRequest`.

## 0.7.0

Expand Down
2 changes: 1 addition & 1 deletion packages/webview_flutter/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ This package is not an _endorsed_ implementation of `webview_flutter`. Therefore
```yaml
dependencies:
webview_flutter: ^4.0.2
webview_flutter_tizen: ^0.7.0
webview_flutter_tizen: ^0.7.1
```

## Example
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ Future<void> main() async {
final String prefixUrl = 'http://${server.address.address}:${server.port}';
final String primaryUrl = '$prefixUrl/hello.txt';
final String secondaryUrl = '$prefixUrl/secondary.txt';
final String headersUrl = '$prefixUrl/headers';

testWidgets('loadRequest', (WidgetTester tester) async {
final Completer<void> pageFinished = Completer<void>();
Expand Down Expand Up @@ -75,6 +76,31 @@ Future<void> main() async {
);
});

testWidgets('loadRequest with headers', (WidgetTester tester) async {
final Map<String, String> headers = <String, String>{
'test_header': 'flutter_test_header'
};

final StreamController<String> pageLoads = StreamController<String>();

final WebViewController controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setNavigationDelegate(
NavigationDelegate(onPageFinished: (String url) => pageLoads.add(url)),
);

await tester.pumpWidget(WebViewWidget(controller: controller));

controller.loadRequest(Uri.parse(headersUrl), headers: headers);

await pageLoads.stream.firstWhere((String url) => url == headersUrl);

final String content = await controller.runJavaScriptReturningResult(
'document.documentElement.innerText',
) as String;
expect(content.contains('flutter_test_header'), isTrue);
});

testWidgets('JavascriptChannel', (WidgetTester tester) async {
final Completer<void> pageFinished = Completer<void>();
final WebViewController controller = WebViewController()
Expand Down
11 changes: 11 additions & 0 deletions packages/webview_flutter/lib/src/tizen_webview.dart
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,17 @@ class TizenWebView {
'loadRequest', <String?, String?>{'url': uri});
}

/// Makes a specific HTTP request with params ands loads the response in the webview.
Future<void> loadRequestWithParams(LoadRequestParams params) {
return _invokeChannelMethod<void>(
'loadRequestWithParams', <String?, Object?>{
'url': params.uri.toString(),
'body': params.body,
'method': params.method.index,
'headers': params.headers,
});
}

/// Accessor to the current URL that the WebView is displaying.
Future<String?> currentUrl() => _invokeChannelMethod<String>('currentUrl');

Expand Down
17 changes: 8 additions & 9 deletions packages/webview_flutter/lib/src/tizen_webview_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,20 +62,19 @@ class TizenWebViewController extends PlatformWebViewController {
'LoadRequestParams#uri is required to have a scheme.');
}

if (params.headers.isNotEmpty) {
throw ArgumentError('LoadRequestParams#headers is not supported.');
}

if (params.body != null) {
throw ArgumentError('LoadRequestParams#body is not supported.');
}

switch (params.method) {
case LoadRequestMethod.get:
if (params.headers.isNotEmpty) {
return _webview.loadRequestWithParams(params);
}
return _webview.loadRequest(params.uri.toString());
case LoadRequestMethod.post:
break;
if (params.headers.isNotEmpty || params.body != null) {
return _webview.loadRequestWithParams(params);
}
return _webview.loadRequest(params.uri.toString());
}

// The enum comes from a different package, which could get a new value at
// any time, so a fallback case is necessary. Since there is no reasonable
// default behavior, throw to alert the client that they need an updated
Expand Down
2 changes: 1 addition & 1 deletion packages/webview_flutter/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: webview_flutter_tizen
description: Tizen implementation of the webview_flutter plugin.
homepage: https://github.com/flutter-tizen/plugins
repository: https://github.com/flutter-tizen/plugins/tree/master/packages/webview_flutter
version: 0.7.0
version: 0.7.1

environment:
sdk: ">=2.17.0 <3.0.0"
Expand Down
49 changes: 49 additions & 0 deletions packages/webview_flutter/tizen/src/webview.cc
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,55 @@ void WebView::HandleWebViewMethodCall(const FlMethodCall& method_call,
} else {
result->Error("Invalid argument", "No url provided.");
}
} else if (method_name == "loadRequestWithParams") {
std::string url;
if (!GetValueFromEncodableMap(arguments, "url", &url)) {
result->Error("Invalid argument", "No url provided.");
return;
}

Ewk_Http_Method ewk_method = EWK_HTTP_METHOD_GET;
int32_t method = 0;
GetValueFromEncodableMap(arguments, "method", &method);
if (method == 1) { // Post request.
ewk_method = EWK_HTTP_METHOD_POST;
}

Eina_Hash* ewk_headers = eina_hash_new(
[](const void* key) -> unsigned int {
return key ? strlen(static_cast<const char*>(key)) + 1 : 0;
},
[](const void* key1, int key1_length, const void* key2,
int key2_length) -> int {
return strcmp(static_cast<const char*>(key1),
static_cast<const char*>(key2));
},
EINA_KEY_HASH(eina_hash_superfast), [](void* data) { free(data); }, 10);
flutter::EncodableMap headers;
GetValueFromEncodableMap(arguments, "headers", &headers);
for (const auto& header : headers) {
auto key = std::get_if<std::string>(&header.first);
auto value = std::get_if<std::string>(&header.second);
if (key && value) {
eina_hash_add(ewk_headers, key->c_str(), strdup(value->c_str()));
}
}

std::vector<uint8_t> body;
if (GetValueFromEncodableMap(arguments, "body", &body)) {
body.push_back('\0');
}

bool ret = ewk_view_url_request_set(
webview_instance_, url.c_str(), ewk_method, ewk_headers,
reinterpret_cast<const char*>(body.data()));
eina_hash_free(ewk_headers);
if (ret) {
result->Success();
} else {
result->Error("Operation failed",
"Failed to load request with parameters.");
}
} else if (method_name == "canGoBack") {
result->Success(flutter::EncodableValue(
static_cast<bool>(ewk_view_back_possible(webview_instance_))));
Expand Down