From 23dc0cc267d1e9e795c61f9e85ed20f125f020c8 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 30 Mar 2023 14:22:35 +0900 Subject: [PATCH 1/3] [webview_flutter] Implements LoadRequestMethod.post feature --- packages/webview_flutter/CHANGELOG.md | 4 +- packages/webview_flutter/README.md | 2 +- .../webview_flutter_test.dart | 26 ++++++++++ .../lib/src/tizen_webview.dart | 11 ++++ .../lib/src/tizen_webview_controller.dart | 17 +++---- packages/webview_flutter/pubspec.yaml | 2 +- packages/webview_flutter/tizen/src/webview.cc | 50 +++++++++++++++++++ packages/webview_flutter/tizen/src/webview.h | 3 ++ 8 files changed, 102 insertions(+), 13 deletions(-) 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..8cb374cdf 100644 --- a/packages/webview_flutter/tizen/src/webview.cc +++ b/packages/webview_flutter/tizen/src/webview.cc @@ -337,6 +337,46 @@ 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; + GetValueFromEncodableMap(arguments, "method", &method); + if (method == 1) { // Post request. + ewk_method = EWK_HTTP_METHOD_POST; + } + Eina_Hash* ewk_headers = eina_hash_new( + EINA_KEY_LENGTH(&WebView::OnLoadRequestHashKeyLength), + EINA_KEY_CMP(&WebView::OnPostLoadRequestHashKeyCompare), + EINA_KEY_HASH(eina_hash_superfast), [](void* data) { free(data); }, 10); + + flutter::EncodableMap headers_map; + GetValueFromEncodableMap(arguments, "headers", &headers_map); + for (const auto& headers : headers_map) { + auto key = std::get_if(&headers.first); + auto value = std::get_if(&headers.second); + if (key && value) { + eina_hash_add(ewk_headers, key->c_str(), strdup(value->c_str())); + } + } + + std::vector body; + 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("Invalid argument", "Failed to url request."); + } } else if (method_name == "canGoBack") { result->Success(flutter::EncodableValue( static_cast(ewk_view_back_possible(webview_instance_)))); @@ -648,3 +688,13 @@ void WebView::OnJavaScriptMessage(Evas_Object* obj, } } } + +unsigned int WebView::OnLoadRequestHashKeyLength(const char* key) { + return key ? strlen(key) + 1 : 0; +} + +int WebView::OnPostLoadRequestHashKeyCompare(const char* key1, int key1_length, + const char* key2, + int key2_length) { + return strcmp(key1, key2); +} \ No newline at end of file diff --git a/packages/webview_flutter/tizen/src/webview.h b/packages/webview_flutter/tizen/src/webview.h index 7f5a1d0b0..bcda67fb1 100644 --- a/packages/webview_flutter/tizen/src/webview.h +++ b/packages/webview_flutter/tizen/src/webview.h @@ -78,6 +78,9 @@ class WebView : public PlatformView { static void OnEvaluateJavaScript(Evas_Object* obj, const char* result_value, void* user_data); static void OnJavaScriptMessage(Evas_Object* obj, Ewk_Script_Message message); + static unsigned int OnLoadRequestHashKeyLength(const char* key); + static int OnPostLoadRequestHashKeyCompare(const char* key1, int key1_length, + const char* key2, int key2_length); Evas_Object* webview_instance_ = nullptr; flutter::TextureRegistrar* texture_registrar_; From e1c840d7f1e9a4c4c97147d92b4192389d0b1a98 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 13 Apr 2023 11:04:25 +0900 Subject: [PATCH 2/3] [webview_flutter] Modify based on review --- packages/webview_flutter/tizen/src/webview.cc | 42 +++++++++---------- packages/webview_flutter/tizen/src/webview.h | 3 -- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/packages/webview_flutter/tizen/src/webview.cc b/packages/webview_flutter/tizen/src/webview.cc index 8cb374cdf..2a98ff4e5 100644 --- a/packages/webview_flutter/tizen/src/webview.cc +++ b/packages/webview_flutter/tizen/src/webview.cc @@ -343,22 +343,29 @@ void WebView::HandleWebViewMethodCall(const FlMethodCall& method_call, result->Error("Invalid argument", "No url provided."); return; } + Ewk_Http_Method ewk_method = EWK_HTTP_METHOD_GET; int32_t method; GetValueFromEncodableMap(arguments, "method", &method); if (method == 1) { // Post request. ewk_method = EWK_HTTP_METHOD_POST; } + Eina_Hash* ewk_headers = eina_hash_new( - EINA_KEY_LENGTH(&WebView::OnLoadRequestHashKeyLength), - EINA_KEY_CMP(&WebView::OnPostLoadRequestHashKeyCompare), + [](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_map; - GetValueFromEncodableMap(arguments, "headers", &headers_map); - for (const auto& headers : headers_map) { - auto key = std::get_if(&headers.first); - auto value = std::get_if(&headers.second); + 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())); } @@ -368,14 +375,15 @@ void WebView::HandleWebViewMethodCall(const FlMethodCall& method_call, 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())); + 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("Invalid argument", "Failed to url request."); + result->Error("Operation failed", + "Failed to load request with parameters."); } } else if (method_name == "canGoBack") { result->Success(flutter::EncodableValue( @@ -688,13 +696,3 @@ void WebView::OnJavaScriptMessage(Evas_Object* obj, } } } - -unsigned int WebView::OnLoadRequestHashKeyLength(const char* key) { - return key ? strlen(key) + 1 : 0; -} - -int WebView::OnPostLoadRequestHashKeyCompare(const char* key1, int key1_length, - const char* key2, - int key2_length) { - return strcmp(key1, key2); -} \ No newline at end of file diff --git a/packages/webview_flutter/tizen/src/webview.h b/packages/webview_flutter/tizen/src/webview.h index bcda67fb1..7f5a1d0b0 100644 --- a/packages/webview_flutter/tizen/src/webview.h +++ b/packages/webview_flutter/tizen/src/webview.h @@ -78,9 +78,6 @@ class WebView : public PlatformView { static void OnEvaluateJavaScript(Evas_Object* obj, const char* result_value, void* user_data); static void OnJavaScriptMessage(Evas_Object* obj, Ewk_Script_Message message); - static unsigned int OnLoadRequestHashKeyLength(const char* key); - static int OnPostLoadRequestHashKeyCompare(const char* key1, int key1_length, - const char* key2, int key2_length); Evas_Object* webview_instance_ = nullptr; flutter::TextureRegistrar* texture_registrar_; From 66befeda94a6f9d0c4d18b4c2ace44ac1c09feba Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 14 Apr 2023 18:27:11 +0900 Subject: [PATCH 3/3] [webview_flutter] Modify based on review --- packages/webview_flutter/tizen/src/webview.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/tizen/src/webview.cc b/packages/webview_flutter/tizen/src/webview.cc index 2a98ff4e5..67c7a6fdf 100644 --- a/packages/webview_flutter/tizen/src/webview.cc +++ b/packages/webview_flutter/tizen/src/webview.cc @@ -345,7 +345,7 @@ void WebView::HandleWebViewMethodCall(const FlMethodCall& method_call, } Ewk_Http_Method ewk_method = EWK_HTTP_METHOD_GET; - int32_t method; + int32_t method = 0; GetValueFromEncodableMap(arguments, "method", &method); if (method == 1) { // Post request. ewk_method = EWK_HTTP_METHOD_POST; @@ -372,8 +372,9 @@ void WebView::HandleWebViewMethodCall(const FlMethodCall& method_call, } std::vector body; - GetValueFromEncodableMap(arguments, "body", &body); - body.push_back('\0'); + 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,