diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 13028e68f..ec5ce1ded 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,7 +1,7 @@ -## NEXT - +## 0.7.1 * Remove unnecessary integration test. * Remove unused code. +* Implements `LoadRequestMethod.post` of `PlatformWebViewController.loadRequest`. ## 0.7.0 diff --git a/packages/webview_flutter/README.md b/packages/webview_flutter/README.md index 381b3209d..cab6b438b 100644 --- a/packages/webview_flutter/README.md +++ b/packages/webview_flutter/README.md @@ -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 diff --git a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart index e92333058..a3941c155 100644 --- a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -37,6 +37,7 @@ Future 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 pageFinished = Completer(); @@ -75,6 +76,31 @@ Future main() async { ); }); + testWidgets('loadRequest with headers', (WidgetTester tester) async { + final Map headers = { + 'test_header': 'flutter_test_header' + }; + + final StreamController pageLoads = StreamController(); + + 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 pageFinished = Completer(); final WebViewController controller = WebViewController() diff --git a/packages/webview_flutter/lib/src/tizen_webview.dart b/packages/webview_flutter/lib/src/tizen_webview.dart index 9ccf01c36..06c558356 100644 --- a/packages/webview_flutter/lib/src/tizen_webview.dart +++ b/packages/webview_flutter/lib/src/tizen_webview.dart @@ -105,6 +105,17 @@ class TizenWebView { 'loadRequest', {'url': uri}); } + /// Makes a specific HTTP request with params ands loads the response in the webview. + Future loadRequestWithParams(LoadRequestParams params) { + return _invokeChannelMethod( + 'loadRequestWithParams', { + '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 currentUrl() => _invokeChannelMethod('currentUrl'); diff --git a/packages/webview_flutter/lib/src/tizen_webview_controller.dart b/packages/webview_flutter/lib/src/tizen_webview_controller.dart index 713219723..af6307147 100644 --- a/packages/webview_flutter/lib/src/tizen_webview_controller.dart +++ b/packages/webview_flutter/lib/src/tizen_webview_controller.dart @@ -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 diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 2e7f889f8..d14d56c86 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -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" diff --git a/packages/webview_flutter/tizen/src/webview.cc b/packages/webview_flutter/tizen/src/webview.cc index d11ff5dd6..67c7a6fdf 100644 --- a/packages/webview_flutter/tizen/src/webview.cc +++ b/packages/webview_flutter/tizen/src/webview.cc @@ -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(key)) + 1 : 0; + }, + [](const void* key1, int key1_length, const void* key2, + int key2_length) -> int { + return strcmp(static_cast(key1), + static_cast(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(&header.first); + auto value = std::get_if(&header.second); + if (key && value) { + eina_hash_add(ewk_headers, key->c_str(), strdup(value->c_str())); + } + } + + std::vector 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(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(ewk_view_back_possible(webview_instance_))));