From 81e0360edea465db9cba97240f37e8e29e0d6f1b Mon Sep 17 00:00:00 2001 From: Ben Hamlin Date: Fri, 8 May 2020 12:54:16 -0700 Subject: [PATCH] fix(windows): Fixes ScriptNotify and InvokeScript (#1354 by @benhamlin) [skip ci] --- windows/ReactNativeWebView/ReactWebView.cpp | 30 +++++++++---------- .../ReactWebViewManager.cpp | 3 +- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/windows/ReactNativeWebView/ReactWebView.cpp b/windows/ReactNativeWebView/ReactWebView.cpp index 48730c6..2a1c2ce 100644 --- a/windows/ReactNativeWebView/ReactWebView.cpp +++ b/windows/ReactNativeWebView/ReactWebView.cpp @@ -97,7 +97,7 @@ namespace winrt::ReactNativeWebView::implementation { eventDataWriter.WriteObjectEnd(); }); - winrt::hstring windowAlert = L"window.alert = function (msg) {window.external.notify(`{\"type\":\"alert\",\"message\":\"${msg}\"}`)};"; + winrt::hstring windowAlert = L"window.alert = function (msg) {window.external.notify(`{\"type\":\"__alert\",\"message\":\"${msg}\"}`)};"; winrt::hstring postMessage = L"window.ReactNativeWebView = {postMessage: function (data) {window.external.notify(String(data))}};"; m_webView.InvokeScriptAsync(L"eval", { windowAlert + postMessage }); } @@ -119,26 +119,26 @@ namespace winrt::ReactNativeWebView::implementation { void ReactWebView::OnScriptNotify(winrt::IInspectable const& /*sender*/, winrt::Windows::UI::Xaml::Controls::NotifyEventArgs const& args) { winrt::JsonObject jsonObject; - if (winrt::JsonObject::TryParse(args.Value(), jsonObject)) { + if (winrt::JsonObject::TryParse(args.Value(), jsonObject) && jsonObject.HasKey(L"type")) { auto type = jsonObject.GetNamedString(L"type"); - if (type == L"alert") { + if (type == L"__alert") { auto dialog = winrt::MessageDialog(jsonObject.GetNamedString(L"message")); dialog.Commands().Append(winrt::UICommand(L"OK")); dialog.ShowAsync(); + return; } } - else { - m_reactContext.DispatchEvent( - m_webView, - L"topMessage", - [&](winrt::Microsoft::ReactNative::IJSValueWriter const& eventDataWriter) noexcept { - eventDataWriter.WriteObjectBegin(); - { - WriteProperty(eventDataWriter, L"data", winrt::to_string(args.Value())); - } - eventDataWriter.WriteObjectEnd(); - }); - } + + m_reactContext.DispatchEvent( + m_webView, + L"topMessage", + [&](winrt::Microsoft::ReactNative::IJSValueWriter const& eventDataWriter) noexcept { + eventDataWriter.WriteObjectBegin(); + { + WriteProperty(eventDataWriter, L"data", winrt::to_string(args.Value())); + } + eventDataWriter.WriteObjectEnd(); + }); } } // namespace winrt::ReactNativeWebView::implementation \ No newline at end of file diff --git a/windows/ReactNativeWebView/ReactWebViewManager.cpp b/windows/ReactNativeWebView/ReactWebViewManager.cpp index 5bbea7c..8b04fe2 100644 --- a/windows/ReactNativeWebView/ReactWebViewManager.cpp +++ b/windows/ReactNativeWebView/ReactWebViewManager.cpp @@ -116,6 +116,7 @@ namespace winrt::ReactNativeWebView::implementation { FrameworkElement const& view, int64_t commandId, winrt::IJSValueReader const& commandArgsReader) noexcept { + auto commandArgs = JSValue::ReadArrayFrom(commandArgsReader); if (auto webView = view.try_as()) { switch (commandId) { case static_cast(WebViewCommands::GoForward) : @@ -135,7 +136,7 @@ namespace winrt::ReactNativeWebView::implementation { webView.Stop(); break; case static_cast(WebViewCommands::InjectJavaScript) : - webView.InvokeScriptAsync(L"eval", { commandArgsReader.GetString() }); + webView.InvokeScriptAsync(L"eval", { winrt::to_hstring(commandArgs[0].AsString()) }); break; } }