react-native-windows 0.74.7 → 0.74.8

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.
Files changed (49) hide show
  1. package/Libraries/ReactNative/AppContainer-dev.js +3 -2
  2. package/Libraries/ReactNative/AppContainer-prod.js +2 -1
  3. package/Libraries/ReactNative/AppContainer.js +2 -0
  4. package/Libraries/ReactNative/AppRegistry.d.ts +7 -0
  5. package/Libraries/ReactNative/AppRegistry.js +8 -0
  6. package/Libraries/ReactNative/renderApplication.js +3 -0
  7. package/Microsoft.ReactNative/AsynchronousEventBeat.cpp +1 -2
  8. package/Microsoft.ReactNative/CompositionHwndHost.idl +1 -1
  9. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +18 -18
  10. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.h +2 -2
  11. package/Microsoft.ReactNative/Fabric/Composition/CompositionHwndHost.cpp +4 -4
  12. package/Microsoft.ReactNative/Fabric/Composition/CompositionHwndHost.h +1 -1
  13. package/Microsoft.ReactNative/Fabric/Composition/CompositionRootAutomationProvider.cpp +3 -3
  14. package/Microsoft.ReactNative/Fabric/Composition/CompositionRootAutomationProvider.h +3 -3
  15. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +5 -5
  16. package/Microsoft.ReactNative/Fabric/Composition/{CompositionRootView.cpp → ReactNativeIsland.cpp} +59 -51
  17. package/Microsoft.ReactNative/Fabric/Composition/{CompositionRootView.h → ReactNativeIsland.h} +8 -8
  18. package/Microsoft.ReactNative/Fabric/Composition/RootComponentView.cpp +7 -8
  19. package/Microsoft.ReactNative/Fabric/Composition/RootComponentView.h +2 -2
  20. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +2 -2
  21. package/Microsoft.ReactNative/Fabric/Composition/UriImageManager.cpp +82 -17
  22. package/Microsoft.ReactNative/Fabric/Composition/UriImageManager.h +79 -0
  23. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.cpp +2 -2
  24. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.h +3 -3
  25. package/Microsoft.ReactNative/Fabric/WindowsImageManager.cpp +191 -119
  26. package/Microsoft.ReactNative/Fabric/WindowsImageManager.h +11 -0
  27. package/Microsoft.ReactNative/HttpSettings.idl +19 -0
  28. package/Microsoft.ReactNative/Modules/ImageViewManagerModule.cpp +15 -11
  29. package/Microsoft.ReactNative/{CompositionRootView.idl → ReactNativeIsland.idl} +10 -10
  30. package/Microsoft.ReactNative/UriImageManager.idl +35 -17
  31. package/Microsoft.ReactNative/Utils/ImageUtils.cpp +22 -3
  32. package/Microsoft.ReactNative/Utils/ImageUtils.h +3 -1
  33. package/Microsoft.ReactNative/Views/Image/ImageViewManager.cpp +1 -1
  34. package/Microsoft.ReactNative/Views/Image/ReactImage.cpp +13 -4
  35. package/Microsoft.ReactNative/Views/Image/ReactImage.h +4 -2
  36. package/PropertySheets/Generated/PackageVersion.g.props +3 -3
  37. package/Shared/Modules/FileReaderModule.cpp +3 -4
  38. package/Shared/Modules/WebSocketModule.cpp +14 -16
  39. package/Shared/Networking/DefaultBlobResource.cpp +6 -14
  40. package/Shared/Networking/NetworkPropertyIds.cpp +60 -0
  41. package/Shared/Networking/NetworkPropertyIds.h +41 -0
  42. package/Shared/Networking/RedirectHttpFilter.cpp +18 -9
  43. package/Shared/Networking/RedirectHttpFilter.h +6 -3
  44. package/Shared/Networking/WinRTHttpResource.cpp +36 -8
  45. package/Shared/Networking/WinRTHttpResource.h +17 -0
  46. package/Shared/Shared.vcxitems +6 -4
  47. package/Shared/Shared.vcxitems.filters +5 -3
  48. package/package.json +1 -1
  49. package/templates/cpp-app/windows/MyApp/MyApp.cpp +2 -2
@@ -5,11 +5,19 @@
5
5
  #include "UriImageManager.h"
6
6
 
7
7
  #include "Composition.ImageSource.g.h"
8
+ #include <Composition.Experimental.UriBrushFactoryImageResponse.g.cpp>
9
+ #include <Composition.ImageFailedResponse.g.cpp>
10
+ #include <Composition.ImageResponse.g.cpp>
11
+ #include <Composition.StreamImageResponse.g.cpp>
12
+ #include <Composition.UriBrushFactoryImageResponse.g.cpp>
8
13
  #include <AutoDraw.h>
14
+ #include <IBlobPersistor.h>
15
+ #include <Networking/NetworkPropertyIds.h>
9
16
  #include <ReactPropertyBag.h>
10
17
  #include <d2d1_3.h>
11
18
  #include <shcore.h>
12
19
  #include <winrt/Microsoft.ReactNative.Composition.Experimental.h>
20
+ #include <winrt/Microsoft.ReactNative.Composition.h>
13
21
  #include <winrt/Windows.Security.Cryptography.h>
14
22
  #include <winrt/Windows.Storage.Streams.h>
15
23
 
@@ -54,16 +62,14 @@ winrt::Microsoft::ReactNative::Composition::ImageSource MakeImageSource(
54
62
  * />
55
63
  *
56
64
  */
57
- struct SvgDataImageHandler : winrt::implements<
58
- SvgDataImageHandler,
59
- winrt::Microsoft::ReactNative::Composition::Experimental::IUriBrushProvider,
60
- winrt::Microsoft::ReactNative::Composition::IUriImageProvider> {
65
+ struct SvgDataImageHandler
66
+ : winrt::implements<SvgDataImageHandler, winrt::Microsoft::ReactNative::Composition::IUriImageProvider> {
61
67
  bool CanLoadImageUri(winrt::Microsoft::ReactNative::IReactContext context, winrt::Windows::Foundation::Uri uri) {
62
68
  return uri.SchemeName() == L"data" && std::wstring_view(uri.Path()).starts_with(L"image/svg+xml;base64,");
63
69
  }
64
70
 
65
- winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::ReactNative::Composition::Experimental::UriBrushFactory>
66
- GetSourceAsync(
71
+ winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::ReactNative::Composition::ImageResponse>
72
+ GetImageResponseAsync(
67
73
  const winrt::Microsoft::ReactNative::IReactContext &context,
68
74
  const winrt::Microsoft::ReactNative::Composition::ImageSource &imageSource) {
69
75
  auto path = winrt::to_string(imageSource.Uri().Path());
@@ -85,7 +91,7 @@ struct SvgDataImageHandler : winrt::implements<
85
91
  co_await memoryStream.WriteAsync(buffer);
86
92
  memoryStream.Seek(0);
87
93
 
88
- co_return
94
+ co_return winrt::Microsoft::ReactNative::Composition::Experimental::UriBrushFactoryImageResponse(
89
95
  [memoryStream, size, scale](
90
96
  const winrt::Microsoft::ReactNative::IReactContext &reactContext,
91
97
  const winrt::Microsoft::ReactNative::Composition::Experimental::ICompositionContext &compositionContext)
@@ -126,12 +132,13 @@ struct SvgDataImageHandler : winrt::implements<
126
132
  renderTarget->SetTransform(originalTransform);
127
133
 
128
134
  return drawingBrush;
129
- };
135
+ });
130
136
 
131
- } catch (winrt::hresult_error const &) {
137
+ } catch (winrt::hresult_error const &ex) {
138
+ co_return winrt::Microsoft::ReactNative::Composition::ImageFailedResponse(ex.message());
132
139
  }
133
140
 
134
- co_return nullptr;
141
+ winrt::throw_hresult(E_UNEXPECTED);
135
142
  }
136
143
  };
137
144
 
@@ -145,15 +152,14 @@ struct SvgDataImageHandler : winrt::implements<
145
152
  * />
146
153
  *
147
154
  */
148
- struct DataImageHandler : winrt::implements<
149
- DataImageHandler,
150
- winrt::Microsoft::ReactNative::Composition::IUriImageStreamProvider,
151
- winrt::Microsoft::ReactNative::Composition::IUriImageProvider> {
155
+ struct DataImageHandler
156
+ : winrt::implements<DataImageHandler, winrt::Microsoft::ReactNative::Composition::IUriImageProvider> {
152
157
  bool CanLoadImageUri(winrt::Microsoft::ReactNative::IReactContext context, winrt::Windows::Foundation::Uri uri) {
153
158
  return uri.SchemeName() == L"data";
154
159
  }
155
160
 
156
- winrt::Windows::Foundation::IAsyncOperation<winrt::Windows::Storage::Streams::IRandomAccessStream> GetSourceAsync(
161
+ winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::ReactNative::Composition::ImageResponse>
162
+ GetImageResponseAsync(
157
163
  const winrt::Microsoft::ReactNative::IReactContext &context,
158
164
  const winrt::Microsoft::ReactNative::Composition::ImageSource &imageSource) {
159
165
  auto path = winrt::to_string(imageSource.Uri().Path());
@@ -173,12 +179,57 @@ struct DataImageHandler : winrt::implements<
173
179
  co_await memoryStream.WriteAsync(buffer);
174
180
  memoryStream.Seek(0);
175
181
 
176
- co_return memoryStream;
182
+ co_return winrt::Microsoft::ReactNative::Composition::StreamImageResponse(memoryStream);
177
183
  } catch (winrt::hresult_error const &) {
178
184
  // Base64 decode failed
185
+ co_return winrt::Microsoft::ReactNative::Composition::ImageFailedResponse(
186
+ L"Invalid base64 encoding in inline image data");
179
187
  }
180
188
 
181
- co_return nullptr;
189
+ winrt::throw_hresult(E_UNEXPECTED);
190
+ }
191
+ };
192
+
193
+ /**
194
+ * This ImageHandler will handle uri loading data from blobs
195
+ *
196
+ * <Image
197
+ * style={{width: 400, height: 200}}
198
+ * source={{uri:'blob:<guid>?offset=<offset>&size=<size>'}}
199
+ * />
200
+ *
201
+ */
202
+ struct BlobImageHandler
203
+ : winrt::implements<BlobImageHandler, winrt::Microsoft::ReactNative::Composition::IUriImageProvider> {
204
+ bool CanLoadImageUri(winrt::Microsoft::ReactNative::IReactContext context, winrt::Windows::Foundation::Uri uri) {
205
+ return uri.SchemeName() == L"blob";
206
+ }
207
+
208
+ winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::ReactNative::Composition::ImageResponse>
209
+ GetImageResponseAsync(
210
+ const winrt::Microsoft::ReactNative::IReactContext &context,
211
+ const winrt::Microsoft::ReactNative::Composition::ImageSource &imageSource) {
212
+ if (auto prop = winrt::Microsoft::ReactNative::ReactPropertyBag(context.Properties())
213
+ .Get(::Microsoft::React::BlobModulePersistorPropertyId())) {
214
+ auto weakBlobPersistor = prop.Value();
215
+ if (auto persistor = weakBlobPersistor.lock()) {
216
+ auto queryParsed = imageSource.Uri().QueryParsed();
217
+ auto guid = winrt::to_string(imageSource.Uri().Path());
218
+ int64_t offset = _atoi64(winrt::to_string(queryParsed.GetFirstValueByName(L"offset")).c_str());
219
+ int64_t size = _atoi64(winrt::to_string(queryParsed.GetFirstValueByName(L"size")).c_str());
220
+
221
+ auto arr = persistor->ResolveMessage(std::move(guid), offset, size);
222
+ winrt::Windows::Storage::Streams::InMemoryRandomAccessStream memoryStream;
223
+ winrt::Windows::Storage::Streams::DataWriter dataWriter{memoryStream};
224
+ dataWriter.WriteBytes(arr);
225
+ co_await dataWriter.StoreAsync();
226
+ memoryStream.Seek(0);
227
+
228
+ co_return winrt::Microsoft::ReactNative::Composition::StreamImageResponse(memoryStream.CloneStream());
229
+ }
230
+ }
231
+
232
+ co_return winrt::Microsoft::ReactNative::Composition::ImageFailedResponse(L"Failed to load image from blob");
182
233
  }
183
234
  };
184
235
 
@@ -191,6 +242,7 @@ static const ReactPropertyId<ReactNonAbiValue<std::shared_ptr<UriImageManager>>>
191
242
  UriImageManager::UriImageManager() {
192
243
  m_providers.push_back(winrt::make<SvgDataImageHandler>());
193
244
  m_providers.push_back(winrt::make<DataImageHandler>());
245
+ m_providers.push_back(winrt::make<BlobImageHandler>());
194
246
  }
195
247
 
196
248
  void UriImageManager::Install(
@@ -227,4 +279,17 @@ IUriImageProvider UriImageManager::TryGetUriImageProvider(
227
279
  return nullptr;
228
280
  }
229
281
 
282
+ ImageResponseOrImageErrorInfo ImageResponse::ResolveImage() {
283
+ winrt::throw_hresult(E_NOTIMPL);
284
+ }
285
+
286
+ ImageResponseOrImageErrorInfo ImageFailedResponse::ResolveImage() {
287
+ ImageResponseOrImageErrorInfo imageOrError;
288
+ imageOrError.errorInfo = winrt::to_string(m_errorMessage);
289
+ if (imageOrError.errorInfo.empty()) {
290
+ imageOrError.errorInfo = "Failed to load image.";
291
+ }
292
+ return imageOrError;
293
+ }
294
+
230
295
  } // namespace winrt::Microsoft::ReactNative::Composition::implementation
@@ -3,10 +3,16 @@
3
3
 
4
4
  #pragma once
5
5
 
6
+ #include <Composition.Experimental.UriBrushFactoryImageResponse.g.h>
7
+ #include <Composition.ImageFailedResponse.g.h>
8
+ #include <Composition.ImageResponse.g.h>
9
+ #include <Composition.StreamImageResponse.g.h>
10
+ #include <Composition.UriBrushFactoryImageResponse.g.h>
6
11
  #include <ReactPropertyBag.h>
7
12
  #include <Utils/ImageUtils.h>
8
13
  #include <react/renderer/imagemanager/primitives.h>
9
14
  #include <winrt/Microsoft.ReactNative.Composition.h>
15
+ #include "ImageResponseImage.h"
10
16
 
11
17
  namespace winrt::Microsoft::ReactNative::Composition::implementation {
12
18
 
@@ -33,4 +39,77 @@ struct UriImageManager {
33
39
  winrt::Microsoft::ReactNative::Composition::ImageSource MakeImageSource(
34
40
  const facebook::react::ImageSource &source) noexcept;
35
41
 
42
+ struct ImageResponseOrImageErrorInfo {
43
+ std::shared_ptr<winrt::Microsoft::ReactNative::Composition::implementation::ImageResponseImage> image;
44
+ std::string errorInfo;
45
+ };
46
+
47
+ struct ImageResponse : ImageResponseT<ImageResponse /*, IResolveImage*/> {
48
+ ImageResponse() noexcept = default;
49
+ virtual ImageResponseOrImageErrorInfo ResolveImage();
50
+ };
51
+
52
+ struct ImageFailedResponse : ImageFailedResponseT<ImageFailedResponse, ImageResponse /*, IResolveImage*/> {
53
+ ImageFailedResponse(winrt::hstring errorMessage) noexcept : base_type(), m_errorMessage(errorMessage) {}
54
+ ImageFailedResponse(
55
+ winrt::hstring errorMessage,
56
+ winrt::Windows::Web::Http::HttpStatusCode statusCode,
57
+ const winrt::Windows::Web::Http::Headers::HttpResponseHeaderCollection &responseHeaders) noexcept
58
+ : base_type(), m_errorMessage(errorMessage), m_statusCode(statusCode), m_responseHeaders(responseHeaders) {}
59
+
60
+ virtual ImageResponseOrImageErrorInfo ResolveImage();
61
+
62
+ private:
63
+ const winrt::hstring m_errorMessage;
64
+ const winrt::Windows::Web::Http::HttpStatusCode m_statusCode{winrt::Windows::Web::Http::HttpStatusCode::None};
65
+ const winrt::Windows::Web::Http::Headers::HttpResponseHeaderCollection m_responseHeaders{nullptr};
66
+ };
67
+
68
+ struct StreamImageResponse : StreamImageResponseT<StreamImageResponse, ImageResponse /*, IResolveImage*/> {
69
+ StreamImageResponse(const winrt::Windows::Storage::Streams::IRandomAccessStream &stream) noexcept
70
+ : base_type(), m_stream(stream) {}
71
+ virtual ImageResponseOrImageErrorInfo ResolveImage();
72
+
73
+ private:
74
+ const winrt::Windows::Storage::Streams::IRandomAccessStream m_stream;
75
+ };
76
+
77
+ struct UriBrushFactoryImageResponse
78
+ : UriBrushFactoryImageResponseT<UriBrushFactoryImageResponse, ImageResponse /*, IResolveImage*/> {
79
+ UriBrushFactoryImageResponse(const winrt::Microsoft::ReactNative::Composition::UriBrushFactory &factory) noexcept
80
+ : base_type(), m_factory(factory) {}
81
+ virtual ImageResponseOrImageErrorInfo ResolveImage();
82
+
83
+ private:
84
+ const winrt::Microsoft::ReactNative::Composition::UriBrushFactory m_factory;
85
+ };
86
+
36
87
  } // namespace winrt::Microsoft::ReactNative::Composition::implementation
88
+
89
+ namespace winrt::Microsoft::ReactNative::Composition::Experimental::implementation {
90
+ struct UriBrushFactoryImageResponse
91
+ : UriBrushFactoryImageResponseT<
92
+ UriBrushFactoryImageResponse,
93
+ winrt::Microsoft::ReactNative::Composition::implementation::
94
+ ImageResponse /*, winrt::Microsoft::ReactNative::Composition::implementation::IResolveImage*/> {
95
+ UriBrushFactoryImageResponse(
96
+ const winrt::Microsoft::ReactNative::Composition::Experimental::UriBrushFactory &factory) noexcept
97
+ : base_type(), m_factory(factory) {}
98
+ virtual winrt::Microsoft::ReactNative::Composition::implementation::ImageResponseOrImageErrorInfo ResolveImage();
99
+
100
+ private:
101
+ const winrt::Microsoft::ReactNative::Composition::Experimental::UriBrushFactory m_factory;
102
+ };
103
+ } // namespace winrt::Microsoft::ReactNative::Composition::Experimental::implementation
104
+
105
+ namespace winrt::Microsoft::ReactNative::Composition::factory_implementation {
106
+ struct ImageFailedResponse : ImageFailedResponseT<ImageFailedResponse, implementation::ImageFailedResponse> {};
107
+ struct StreamImageResponse : StreamImageResponseT<StreamImageResponse, implementation::StreamImageResponse> {};
108
+ struct UriBrushFactoryImageResponse
109
+ : UriBrushFactoryImageResponseT<UriBrushFactoryImageResponse, implementation::UriBrushFactoryImageResponse> {};
110
+ } // namespace winrt::Microsoft::ReactNative::Composition::factory_implementation
111
+
112
+ namespace winrt::Microsoft::ReactNative::Composition::Experimental::factory_implementation {
113
+ struct UriBrushFactoryImageResponse
114
+ : UriBrushFactoryImageResponseT<UriBrushFactoryImageResponse, implementation::UriBrushFactoryImageResponse> {};
115
+ } // namespace winrt::Microsoft::ReactNative::Composition::Experimental::factory_implementation
@@ -141,7 +141,7 @@ const IComponentViewRegistry &FabricUIManager::GetViewRegistry() const noexcept
141
141
  }
142
142
 
143
143
  void FabricUIManager::startSurface(
144
- const winrt::Microsoft::ReactNative::CompositionRootView &rootView,
144
+ const winrt::Microsoft::ReactNative::ReactNativeIsland &rootView,
145
145
  facebook::react::SurfaceId surfaceId,
146
146
  const facebook::react::LayoutConstraints &layoutConstraints,
147
147
  const std::string &moduleName,
@@ -175,7 +175,7 @@ void FabricUIManager::stopSurface(facebook::react::SurfaceId surfaceId) noexcept
175
175
  m_surfaceManager->stopSurface(surfaceId);
176
176
  }
177
177
 
178
- winrt::Microsoft::ReactNative::CompositionRootView FabricUIManager::GetCompositionRootView(
178
+ winrt::Microsoft::ReactNative::ReactNativeIsland FabricUIManager::GetReactNativeIsland(
179
179
  facebook::react::SurfaceId surfaceId) const noexcept {
180
180
  return m_surfaceRegistry.at(surfaceId).wkRootView.get();
181
181
  }
@@ -29,7 +29,7 @@ struct FabricUIManager final : public std::enable_shared_from_this<FabricUIManag
29
29
  void Initialize(winrt::Microsoft::ReactNative::ReactContext const &reactContext) noexcept;
30
30
 
31
31
  void startSurface(
32
- const winrt::Microsoft::ReactNative::CompositionRootView &rootView,
32
+ const winrt::Microsoft::ReactNative::ReactNativeIsland &rootView,
33
33
  facebook::react::SurfaceId surfaceId,
34
34
  const facebook::react::LayoutConstraints &layoutConstraints,
35
35
  const std::string &moduleName,
@@ -49,7 +49,7 @@ struct FabricUIManager final : public std::enable_shared_from_this<FabricUIManag
49
49
 
50
50
  const IComponentViewRegistry &GetViewRegistry() const noexcept;
51
51
 
52
- winrt::Microsoft::ReactNative::CompositionRootView GetCompositionRootView(
52
+ winrt::Microsoft::ReactNative::ReactNativeIsland GetReactNativeIsland(
53
53
  facebook::react::SurfaceId surfaceId) const noexcept;
54
54
 
55
55
  private:
@@ -73,7 +73,7 @@ struct FabricUIManager final : public std::enable_shared_from_this<FabricUIManag
73
73
 
74
74
  ComponentViewRegistry m_registry;
75
75
  struct SurfaceInfo {
76
- winrt::weak_ref<winrt::Microsoft::ReactNative::CompositionRootView> wkRootView{nullptr};
76
+ winrt::weak_ref<winrt::Microsoft::ReactNative::ReactNativeIsland> wkRootView{nullptr};
77
77
  };
78
78
 
79
79
  std::unordered_map<facebook::react::SurfaceId, SurfaceInfo> m_surfaceRegistry;