react-native-windows 0.70.17 → 0.70.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/PropertySheets/JSEngine.props +1 -1
- package/Shared/JSI/NapiJsiV8RuntimeHolder.cpp +58 -40
- package/Shared/JSI/NapiJsiV8RuntimeHolder.h +0 -8
- package/Shared/Networking/IWebSocketResource.h +1 -0
- package/Shared/Networking/OriginPolicyHttpFilter.cpp +17 -13
- package/Shared/Networking/OriginPolicyHttpFilter.h +12 -11
- package/package.json +1 -1
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
-->
|
|
11
11
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
12
12
|
<PropertyGroup>
|
|
13
|
-
<ReactNativeWindowsVersion>0.70.
|
|
13
|
+
<ReactNativeWindowsVersion>0.70.19</ReactNativeWindowsVersion>
|
|
14
14
|
<ReactNativeWindowsMajor>0</ReactNativeWindowsMajor>
|
|
15
15
|
<ReactNativeWindowsMinor>70</ReactNativeWindowsMinor>
|
|
16
|
-
<ReactNativeWindowsPatch>
|
|
16
|
+
<ReactNativeWindowsPatch>19</ReactNativeWindowsPatch>
|
|
17
17
|
<ReactNativeWindowsCanary>false</ReactNativeWindowsCanary>
|
|
18
|
-
<ReactNativeWindowsCommitId>
|
|
18
|
+
<ReactNativeWindowsCommitId>c17217ec1dae6533fdc9c1b229d8308a1f61d792</ReactNativeWindowsCommitId>
|
|
19
19
|
</PropertyGroup>
|
|
20
20
|
</Project>
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<EnableDevServerHBCBundles Condition="'$(EnableDevServerHBCBundles)' == ''">false</EnableDevServerHBCBundles>
|
|
19
19
|
|
|
20
20
|
<UseV8 Condition="'$(UseV8)' == ''">false</UseV8>
|
|
21
|
-
<V8Version Condition="'$(V8Version)' == ''">0.70.
|
|
21
|
+
<V8Version Condition="'$(V8Version)' == ''">0.70.3</V8Version>
|
|
22
22
|
<V8PackageName>ReactNative.V8Jsi.Windows</V8PackageName>
|
|
23
23
|
<V8PackageName Condition="'$(V8AppPlatform)' != 'win32'">$(V8PackageName).UWP</V8PackageName>
|
|
24
24
|
</PropertyGroup>
|
|
@@ -11,57 +11,75 @@ using std::unique_ptr;
|
|
|
11
11
|
|
|
12
12
|
namespace Microsoft::JSI {
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
14
|
+
class NapiTask {
|
|
15
|
+
public:
|
|
16
|
+
NapiTask(void *task, v8_task_run_cb onTaskRun, v8_task_release_cb onTaskRelease)
|
|
17
|
+
: task_(task), onTaskRun_(onTaskRun), onTaskRelease_(onTaskRelease) {}
|
|
18
|
+
|
|
19
|
+
NapiTask(NapiTask &&other)
|
|
20
|
+
: task_(std::exchange(other.task_, nullptr)),
|
|
21
|
+
onTaskRun_(std::exchange(other.onTaskRun_, nullptr)),
|
|
22
|
+
onTaskRelease_(std::exchange(other.onTaskRelease_, nullptr)) {}
|
|
23
|
+
|
|
24
|
+
NapiTask &operator=(NapiTask &&other) {
|
|
25
|
+
if (this != &other) {
|
|
26
|
+
NapiTask taskToDelete(std::move(*this));
|
|
27
|
+
task_ = std::exchange(other.task_, nullptr);
|
|
28
|
+
onTaskRun_ = std::exchange(other.onTaskRun_, nullptr);
|
|
29
|
+
onTaskRelease_ = std::exchange(other.onTaskRelease_, nullptr);
|
|
30
|
+
}
|
|
31
|
+
return *this;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
NapiTask(const NapiTask &other) = delete;
|
|
35
|
+
NapiTask &operator=(const NapiTask &other) = delete;
|
|
29
36
|
|
|
30
37
|
~NapiTask() {
|
|
31
|
-
if (
|
|
32
|
-
|
|
38
|
+
if (task_ != nullptr) {
|
|
39
|
+
onTaskRelease_(task_);
|
|
33
40
|
}
|
|
34
41
|
}
|
|
35
42
|
|
|
36
|
-
void
|
|
37
|
-
|
|
43
|
+
void Run() const {
|
|
44
|
+
if (task_ != nullptr) {
|
|
45
|
+
onTaskRun_(task_);
|
|
46
|
+
}
|
|
38
47
|
}
|
|
39
48
|
|
|
40
49
|
private:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
napi_finalize m_finalizeCallback;
|
|
45
|
-
void *m_finalizeHint;
|
|
50
|
+
void *task_;
|
|
51
|
+
v8_task_run_cb onTaskRun_;
|
|
52
|
+
v8_task_release_cb onTaskRelease_;
|
|
46
53
|
};
|
|
47
54
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
void *finalizeHint) {
|
|
56
|
-
NapiJsiV8RuntimeHolder *holder;
|
|
57
|
-
auto result = napi_get_instance_data(env, (void **)&holder);
|
|
58
|
-
if (result != napi_status::napi_ok) {
|
|
59
|
-
std::terminate();
|
|
55
|
+
class NapiTaskRunner {
|
|
56
|
+
public:
|
|
57
|
+
NapiTaskRunner(std::shared_ptr<facebook::react::MessageQueueThread> jsQueue) : m_jsQueue(std::move(jsQueue)) {}
|
|
58
|
+
|
|
59
|
+
static v8_task_runner_t Create(std::shared_ptr<facebook::react::MessageQueueThread> jsQueue) {
|
|
60
|
+
NapiTaskRunner *taskRunner = new NapiTaskRunner(std::move(jsQueue));
|
|
61
|
+
return v8_create_task_runner(reinterpret_cast<void *>(taskRunner), &PostTask, &Release);
|
|
60
62
|
}
|
|
61
63
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
private:
|
|
65
|
+
static void __cdecl PostTask(
|
|
66
|
+
void *taskRunner,
|
|
67
|
+
void *task,
|
|
68
|
+
v8_task_run_cb onTaskRun,
|
|
69
|
+
v8_task_release_cb onTaskRelease) {
|
|
70
|
+
auto napiTask = std::make_shared<NapiTask>(task, onTaskRun, onTaskRelease);
|
|
71
|
+
reinterpret_cast<NapiTaskRunner *>(taskRunner)->m_jsQueue->runOnQueue([napiTask = std::move(napiTask)] {
|
|
72
|
+
napiTask->Run();
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static void __cdecl Release(void *taskRunner) {
|
|
77
|
+
delete reinterpret_cast<NapiTaskRunner *>(taskRunner);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private:
|
|
81
|
+
std::shared_ptr<facebook::react::MessageQueueThread> m_jsQueue;
|
|
82
|
+
};
|
|
65
83
|
|
|
66
84
|
NapiJsiV8RuntimeHolder::NapiJsiV8RuntimeHolder(
|
|
67
85
|
shared_ptr<DevSettings> devSettings,
|
|
@@ -85,7 +103,7 @@ void NapiJsiV8RuntimeHolder::InitRuntime() noexcept {
|
|
|
85
103
|
settings.flags.enable_inspector = m_useDirectDebugger;
|
|
86
104
|
settings.flags.wait_for_debugger = m_debuggerBreakOnNextLine;
|
|
87
105
|
// TODO: args.debuggerRuntimeName = debuggerRuntimeName_;
|
|
88
|
-
settings.
|
|
106
|
+
settings.foreground_task_runner = NapiTaskRunner::Create(m_jsQueue);
|
|
89
107
|
|
|
90
108
|
napi_ext_script_cache scriptCache = InitScriptCache(std::move(m_preparedScriptStore));
|
|
91
109
|
settings.script_cache = &scriptCache;
|
|
@@ -24,14 +24,6 @@ class NapiJsiV8RuntimeHolder : public Microsoft::JSI::RuntimeHolderLazyInit {
|
|
|
24
24
|
std::unique_ptr<facebook::jsi::PreparedScriptStore> &&preparedScriptStore) noexcept;
|
|
25
25
|
|
|
26
26
|
private:
|
|
27
|
-
static void __cdecl ScheduleTaskCallback(
|
|
28
|
-
napi_env env,
|
|
29
|
-
napi_ext_task_callback taskCb,
|
|
30
|
-
void *taskData,
|
|
31
|
-
uint32_t delayMs,
|
|
32
|
-
napi_finalize finalizeCb,
|
|
33
|
-
void *finalizeHint);
|
|
34
|
-
|
|
35
27
|
void InitRuntime() noexcept;
|
|
36
28
|
napi_ext_script_cache InitScriptCache(
|
|
37
29
|
std::unique_ptr<facebook::jsi::PreparedScriptStore> &&preparedScriptStore) noexcept;
|
|
@@ -37,22 +37,26 @@ namespace Microsoft::React::Networking {
|
|
|
37
37
|
|
|
38
38
|
#pragma region OriginPolicyHttpFilter
|
|
39
39
|
|
|
40
|
-
#pragma region
|
|
40
|
+
#pragma region CaseInsensitiveComparer
|
|
41
41
|
|
|
42
|
-
bool OriginPolicyHttpFilter::
|
|
42
|
+
bool OriginPolicyHttpFilter::CaseInsensitiveComparer::operator()(const wchar_t *a, const wchar_t *b) const {
|
|
43
43
|
return _wcsicmp(a, b) < 0;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
bool OriginPolicyHttpFilter::CaseInsensitiveComparer::operator()(const wstring &a, const wstring &b) const {
|
|
47
|
+
return _wcsicmp(a.c_str(), b.c_str()) < 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#pragma endregion CaseInsensitiveComparer
|
|
47
51
|
|
|
48
52
|
// https://fetch.spec.whatwg.org/#forbidden-method
|
|
49
|
-
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::
|
|
50
|
-
{L"CONNECT", L"TRACE", L"TRACK"};
|
|
53
|
+
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::CaseInsensitiveComparer>
|
|
54
|
+
OriginPolicyHttpFilter::s_forbiddenMethods = {L"CONNECT", L"TRACE", L"TRACK"};
|
|
51
55
|
|
|
52
|
-
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::
|
|
56
|
+
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::CaseInsensitiveComparer>
|
|
53
57
|
OriginPolicyHttpFilter::s_simpleCorsMethods = {L"GET", L"HEAD", L"POST"};
|
|
54
58
|
|
|
55
|
-
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::
|
|
59
|
+
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::CaseInsensitiveComparer>
|
|
56
60
|
OriginPolicyHttpFilter::s_simpleCorsRequestHeaderNames = {
|
|
57
61
|
L"Accept",
|
|
58
62
|
L"Accept-Language",
|
|
@@ -64,11 +68,11 @@ bool OriginPolicyHttpFilter::ConstWcharComparer::operator()(const wchar_t *a, co
|
|
|
64
68
|
L"Viewport-Width",
|
|
65
69
|
L"Width"};
|
|
66
70
|
|
|
67
|
-
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::
|
|
71
|
+
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::CaseInsensitiveComparer>
|
|
68
72
|
OriginPolicyHttpFilter::s_simpleCorsResponseHeaderNames =
|
|
69
73
|
{L"Cache-Control", L"Content-Language", L"Content-Type", L"Expires", L"Last-Modified", L"Pragma"};
|
|
70
74
|
|
|
71
|
-
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::
|
|
75
|
+
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::CaseInsensitiveComparer>
|
|
72
76
|
OriginPolicyHttpFilter::s_simpleCorsContentTypeValues = {
|
|
73
77
|
L"application/x-www-form-urlencoded",
|
|
74
78
|
L"multipart/form-data",
|
|
@@ -76,7 +80,7 @@ bool OriginPolicyHttpFilter::ConstWcharComparer::operator()(const wchar_t *a, co
|
|
|
76
80
|
|
|
77
81
|
// https://fetch.spec.whatwg.org/#forbidden-header-name
|
|
78
82
|
// Chromium still bans "User-Agent" due to https://crbug.com/571722
|
|
79
|
-
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::
|
|
83
|
+
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::CaseInsensitiveComparer>
|
|
80
84
|
OriginPolicyHttpFilter::s_corsForbiddenRequestHeaderNames = {
|
|
81
85
|
L"Accept-Charset",
|
|
82
86
|
L"Accept-Encoding",
|
|
@@ -99,13 +103,13 @@ bool OriginPolicyHttpFilter::ConstWcharComparer::operator()(const wchar_t *a, co
|
|
|
99
103
|
L"Upgrade",
|
|
100
104
|
L"Via"};
|
|
101
105
|
|
|
102
|
-
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::
|
|
106
|
+
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::CaseInsensitiveComparer>
|
|
103
107
|
OriginPolicyHttpFilter::s_cookieSettingResponseHeaders = {
|
|
104
108
|
L"Set-Cookie",
|
|
105
109
|
L"Set-Cookie2", // Deprecated by the spec, but probably still used
|
|
106
110
|
};
|
|
107
111
|
|
|
108
|
-
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::
|
|
112
|
+
/*static*/ set<const wchar_t *, OriginPolicyHttpFilter::CaseInsensitiveComparer>
|
|
109
113
|
OriginPolicyHttpFilter::s_corsForbiddenRequestHeaderNamePrefixes = {L"Proxy-", L"Sec-"};
|
|
110
114
|
|
|
111
115
|
/*static*/ Uri OriginPolicyHttpFilter::s_origin{nullptr};
|
|
@@ -293,7 +297,7 @@ bool OriginPolicyHttpFilter::ConstWcharComparer::operator()(const wchar_t *a, co
|
|
|
293
297
|
}
|
|
294
298
|
|
|
295
299
|
/*static*/ OriginPolicyHttpFilter::AccessControlValues OriginPolicyHttpFilter::ExtractAccessControlValues(
|
|
296
|
-
|
|
300
|
+
IMap<hstring, hstring> const &headers) {
|
|
297
301
|
using std::wregex;
|
|
298
302
|
using std::wsregex_token_iterator;
|
|
299
303
|
|
|
@@ -22,19 +22,20 @@ class OriginPolicyHttpFilter
|
|
|
22
22
|
: public winrt::
|
|
23
23
|
implements<OriginPolicyHttpFilter, winrt::Windows::Web::Http::Filters::IHttpFilter, IRedirectEventSource> {
|
|
24
24
|
public:
|
|
25
|
-
struct
|
|
25
|
+
struct CaseInsensitiveComparer {
|
|
26
26
|
bool operator()(const wchar_t *, const wchar_t *) const;
|
|
27
|
+
bool operator()(const std::wstring &, const std::wstring &) const;
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
private:
|
|
30
|
-
static std::set<const wchar_t *,
|
|
31
|
-
static std::set<const wchar_t *,
|
|
32
|
-
static std::set<const wchar_t *,
|
|
33
|
-
static std::set<const wchar_t *,
|
|
34
|
-
static std::set<const wchar_t *,
|
|
35
|
-
static std::set<const wchar_t *,
|
|
36
|
-
static std::set<const wchar_t *,
|
|
37
|
-
static std::set<const wchar_t *,
|
|
31
|
+
static std::set<const wchar_t *, CaseInsensitiveComparer> s_forbiddenMethods;
|
|
32
|
+
static std::set<const wchar_t *, CaseInsensitiveComparer> s_simpleCorsMethods;
|
|
33
|
+
static std::set<const wchar_t *, CaseInsensitiveComparer> s_simpleCorsRequestHeaderNames;
|
|
34
|
+
static std::set<const wchar_t *, CaseInsensitiveComparer> s_simpleCorsResponseHeaderNames;
|
|
35
|
+
static std::set<const wchar_t *, CaseInsensitiveComparer> s_simpleCorsContentTypeValues;
|
|
36
|
+
static std::set<const wchar_t *, CaseInsensitiveComparer> s_corsForbiddenRequestHeaderNames;
|
|
37
|
+
static std::set<const wchar_t *, CaseInsensitiveComparer> s_corsForbiddenRequestHeaderNamePrefixes;
|
|
38
|
+
static std::set<const wchar_t *, CaseInsensitiveComparer> s_cookieSettingResponseHeaders;
|
|
38
39
|
|
|
39
40
|
// NOTE: Assumes static origin through owning client/resource/module/(React) instance's lifetime.
|
|
40
41
|
static winrt::Windows::Foundation::Uri s_origin;
|
|
@@ -42,9 +43,9 @@ class OriginPolicyHttpFilter
|
|
|
42
43
|
struct AccessControlValues {
|
|
43
44
|
winrt::hstring AllowedOrigin;
|
|
44
45
|
winrt::hstring AllowedCredentials;
|
|
45
|
-
std::set<std::wstring> AllowedHeaders;
|
|
46
|
+
std::set<std::wstring, CaseInsensitiveComparer> AllowedHeaders;
|
|
46
47
|
std::set<std::wstring> AllowedMethods;
|
|
47
|
-
std::set<std::wstring> ExposedHeaders;
|
|
48
|
+
std::set<std::wstring, CaseInsensitiveComparer> ExposedHeaders;
|
|
48
49
|
size_t MaxAge;
|
|
49
50
|
};
|
|
50
51
|
|