diff --git a/packages/webview_flutter_lwe/CHANGELOG.md b/packages/webview_flutter_lwe/CHANGELOG.md index 9c852f592..18315103a 100644 --- a/packages/webview_flutter_lwe/CHANGELOG.md +++ b/packages/webview_flutter_lwe/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Fix an issue where platform channel isn't called on the main thread. + ## 0.3.4 * Update lightweight web engine(1.3.3). diff --git a/packages/webview_flutter_lwe/tizen/lib/armel/VERSION b/packages/webview_flutter_lwe/tizen/lib/armel/VERSION new file mode 100644 index 000000000..785cda807 --- /dev/null +++ b/packages/webview_flutter_lwe/tizen/lib/armel/VERSION @@ -0,0 +1 @@ +1.3.3 \ No newline at end of file diff --git a/packages/webview_flutter_lwe/tizen/src/message_dispatcher.cc b/packages/webview_flutter_lwe/tizen/src/message_dispatcher.cc index 113b061b1..26b8c8b63 100644 --- a/packages/webview_flutter_lwe/tizen/src/message_dispatcher.cc +++ b/packages/webview_flutter_lwe/tizen/src/message_dispatcher.cc @@ -10,19 +10,11 @@ MessageDispatcher::MessageDispatcher() { ecore_init(); } MessageDispatcher::~MessageDispatcher() { ecore_shutdown(); } void MessageDispatcher::dispatchTaskOnMainThread(std::function fn) { - struct Param { - std::function fn; - }; - - Param* p = new Param; - p->fn = fn; - ecore_main_loop_thread_safe_call_sync( [](void* data) -> void* { - Param* p = (Param*)data; - p->fn(); - delete p; + auto fn = static_cast*>(data); + if (fn) (*fn)(); return nullptr; }, - p); + &fn); } diff --git a/packages/webview_flutter_lwe/tizen/src/webview.cc b/packages/webview_flutter_lwe/tizen/src/webview.cc index a81363de2..118f82bbd 100644 --- a/packages/webview_flutter_lwe/tizen/src/webview.cc +++ b/packages/webview_flutter_lwe/tizen/src/webview.cc @@ -125,7 +125,7 @@ WebView::WebView(flutter::PluginRegistrar* registrar, int view_id, InitWebView(); - dispatcher = new MessageDispatcher(); + dispatcher_ = std::make_unique(); webview_channel_ = std::make_unique( GetPluginRegistrar()->messenger(), GetWebViewChannelName(), @@ -150,18 +150,20 @@ WebView::WebView(flutter::PluginRegistrar* registrar, int view_id, webview_instance_->RegisterOnPageStartedHandler( [this](LWE::WebContainer* container, const std::string& url) { - dispatcher->dispatchTaskOnMainThread([&]() { - flutter::EncodableMap args = { - {flutter::EncodableValue("url"), flutter::EncodableValue(url)}}; + flutter::EncodableMap args = { + {flutter::EncodableValue("url"), flutter::EncodableValue(url)}}; + + dispatcher_->dispatchTaskOnMainThread([this, &args]() { navigation_delegate_channel_->InvokeMethod( "onPageStarted", std::make_unique(args)); }); }); webview_instance_->RegisterOnPageLoadedHandler( [this](LWE::WebContainer* container, const std::string& url) { - dispatcher->dispatchTaskOnMainThread([&]() { - flutter::EncodableMap args = { - {flutter::EncodableValue("url"), flutter::EncodableValue(url)}}; + flutter::EncodableMap args = { + {flutter::EncodableValue("url"), flutter::EncodableValue(url)}}; + + dispatcher_->dispatchTaskOnMainThread([this, &args]() { navigation_delegate_channel_->InvokeMethod( "onPageFinished", std::make_unique(args)); @@ -169,24 +171,26 @@ WebView::WebView(flutter::PluginRegistrar* registrar, int view_id, }); webview_instance_->RegisterOnProgressChangedHandler( [this](LWE::WebContainer* container, int progress) { - dispatcher->dispatchTaskOnMainThread([&]() { - flutter::EncodableMap args = {{flutter::EncodableValue("progress"), - flutter::EncodableValue(progress)}}; + flutter::EncodableMap args = {{flutter::EncodableValue("progress"), + flutter::EncodableValue(progress)}}; + + dispatcher_->dispatchTaskOnMainThread([this, &args]() { navigation_delegate_channel_->InvokeMethod( "onProgress", std::make_unique(args)); }); }); webview_instance_->RegisterOnReceivedErrorHandler( [this](LWE::WebContainer* container, LWE::ResourceError error) { - dispatcher->dispatchTaskOnMainThread([&]() { - flutter::EncodableMap args = { - {flutter::EncodableValue("errorCode"), - flutter::EncodableValue(error.GetErrorCode())}, - {flutter::EncodableValue("description"), - flutter::EncodableValue(error.GetDescription())}, - {flutter::EncodableValue("failingUrl"), - flutter::EncodableValue(error.GetUrl())}, - }; + flutter::EncodableMap args = { + {flutter::EncodableValue("errorCode"), + flutter::EncodableValue(error.GetErrorCode())}, + {flutter::EncodableValue("description"), + flutter::EncodableValue(error.GetDescription())}, + {flutter::EncodableValue("failingUrl"), + flutter::EncodableValue(error.GetUrl())}, + }; + + dispatcher_->dispatchTaskOnMainThread([this, &args]() { navigation_delegate_channel_->InvokeMethod( "onWebResourceError", std::make_unique(args)); @@ -197,12 +201,13 @@ WebView::WebView(flutter::PluginRegistrar* registrar, int view_id, if (!has_navigation_delegate_) { return false; } - dispatcher->dispatchTaskOnMainThread([&]() { - flutter::EncodableMap args = { - {flutter::EncodableValue("url"), flutter::EncodableValue(url)}, - {flutter::EncodableValue("isForMainFrame"), - flutter::EncodableValue(true)}, - }; + flutter::EncodableMap args = { + {flutter::EncodableValue("url"), flutter::EncodableValue(url)}, + {flutter::EncodableValue("isForMainFrame"), + flutter::EncodableValue(true)}, + }; + + dispatcher_->dispatchTaskOnMainThread([this, &args, url]() { auto result = std::make_unique(url, this); navigation_delegate_channel_->InvokeMethod( "navigationRequest", @@ -226,7 +231,7 @@ void WebView::RegisterJavaScriptChannelName(const std::string& name) { {flutter::EncodableValue("channel"), flutter::EncodableValue(name)}, {flutter::EncodableValue("message"), flutter::EncodableValue(message)}, }; - dispatcher->dispatchTaskOnMainThread([&]() { + dispatcher_->dispatchTaskOnMainThread([this, &args]() { webview_channel_->InvokeMethod( "javaScriptChannelMessage", std::make_unique(args)); @@ -254,11 +259,6 @@ void WebView::Dispose() { webview_instance_->Destroy(); webview_instance_ = nullptr; } - - if (dispatcher) { - delete dispatcher; - dispatcher = nullptr; - } } void WebView::Resize(double width, double height) { diff --git a/packages/webview_flutter_lwe/tizen/src/webview.h b/packages/webview_flutter_lwe/tizen/src/webview.h index 5a70d1420..0f2064c87 100644 --- a/packages/webview_flutter_lwe/tizen/src/webview.h +++ b/packages/webview_flutter_lwe/tizen/src/webview.h @@ -68,7 +68,6 @@ class WebView : public PlatformView { void InitWebView(); LWE::WebContainer* webview_instance_ = nullptr; - MessageDispatcher* dispatcher = nullptr; flutter::TextureRegistrar* texture_registrar_; double width_; double height_; @@ -77,6 +76,7 @@ class WebView : public PlatformView { BufferUnit* rendered_surface_ = nullptr; bool is_mouse_lbutton_down_ = false; bool has_navigation_delegate_ = false; + std::unique_ptr dispatcher_; std::unique_ptr webview_channel_; std::unique_ptr navigation_delegate_channel_; std::unique_ptr texture_variant_;