react-native 0.86.2 → 0.86.3

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.
@@ -28,7 +28,7 @@
28
28
  export default class ReactNativeVersion {
29
29
  static major: number = 0;
30
30
  static minor: number = 86;
31
- static patch: number = 2;
31
+ static patch: number = 3;
32
32
  static prerelease: string | null = null;
33
33
 
34
34
  static getVersionString(): string {
@@ -23,7 +23,7 @@ NSDictionary* RCTGetReactNativeVersion(void)
23
23
  __rnVersion = @{
24
24
  RCTVersionMajor: @(0),
25
25
  RCTVersionMinor: @(86),
26
- RCTVersionPatch: @(2),
26
+ RCTVersionPatch: @(3),
27
27
  RCTVersionPrerelease: [NSNull null],
28
28
  };
29
29
  });
@@ -1,4 +1,4 @@
1
- VERSION_NAME=0.86.2
1
+ VERSION_NAME=0.86.3
2
2
  react.internal.publishingGroup=com.facebook.react
3
3
  react.internal.hermesPublishingGroup=com.facebook.hermes
4
4
 
@@ -900,7 +900,16 @@ internal constructor(
900
900
  return
901
901
  }
902
902
 
903
- val viewState = getViewState(reactTag)
903
+ val viewState = getNullableViewState(reactTag)
904
+ if (viewState == null) {
905
+ ReactSoftExceptionLogger.logSoftException(
906
+ ReactSoftExceptionLogger.Categories.SURFACE_MOUNTING_MANAGER_MISSING_VIEWSTATE,
907
+ ReactNoCrashSoftException(
908
+ "Unable to find viewState for tag $reactTag for updateOverflowInset"
909
+ ),
910
+ )
911
+ return
912
+ }
904
913
  // Do not layout Root Views
905
914
  if (viewState.isRoot) {
906
915
  return
@@ -87,11 +87,15 @@ public open class IntentModule(reactContext: ReactApplicationContext) :
87
87
  override fun onHostResume() {
88
88
  reactApplicationContext.removeLifecycleEventListener(this)
89
89
  synchronized(this@IntentModule) {
90
- for (pendingPromise in pendingOpenURLPromises) {
90
+ // getInitialURL can re-enter and re-add to pendingOpenURLPromises when the activity
91
+ // is still null at resume, so drain a snapshot (after clearing the list and listener)
92
+ // to avoid mutating the list being iterated (ConcurrentModificationException).
93
+ val pendingPromises = ArrayList(pendingOpenURLPromises)
94
+ pendingOpenURLPromises.clear()
95
+ initialURLListener = null
96
+ for (pendingPromise in pendingPromises) {
91
97
  getInitialURL(pendingPromise)
92
98
  }
93
- initialURLListener = null
94
- pendingOpenURLPromises.clear()
95
99
  }
96
100
  }
97
101
 
@@ -14,7 +14,7 @@ public object ReactNativeVersion {
14
14
  public val VERSION: Map<String, Any?> = mapOf(
15
15
  "major" to 0,
16
16
  "minor" to 86,
17
- "patch" to 2,
17
+ "patch" to 3,
18
18
  "prerelease" to null
19
19
  )
20
20
  }
@@ -14,14 +14,14 @@
14
14
 
15
15
  #define REACT_NATIVE_VERSION_MAJOR 0
16
16
  #define REACT_NATIVE_VERSION_MINOR 86
17
- #define REACT_NATIVE_VERSION_PATCH 2
17
+ #define REACT_NATIVE_VERSION_PATCH 3
18
18
 
19
19
  namespace facebook::react {
20
20
 
21
21
  struct ReactNativeVersionType {
22
22
  int32_t Major = 0;
23
23
  int32_t Minor = 86;
24
- int32_t Patch = 2;
24
+ int32_t Patch = 3;
25
25
  std::string_view Prerelease = "";
26
26
  };
27
27
 
@@ -198,10 +198,6 @@ jsi::Value NativeDOM::getParentNode(
198
198
  }
199
199
 
200
200
  auto shadowNode = getShadowNode(rt, nativeNodeReference);
201
- if (isRootShadowNode(*shadowNode)) {
202
- // The parent of the root node is the document.
203
- return jsi::Value{shadowNode->getSurfaceId()};
204
- }
205
201
 
206
202
  auto currentRevision =
207
203
  getCurrentShadowTreeRevision(rt, shadowNode->getSurfaceId());
@@ -209,6 +205,16 @@ jsi::Value NativeDOM::getParentNode(
209
205
  return jsi::Value::undefined();
210
206
  }
211
207
 
208
+ // The parent of the surface's root node is the document. Only the actual
209
+ // root node qualifies: nested nodes that carry the `RootNodeKind` trait
210
+ // (e.g. <Modal>, portals/overlays) still have a real parent in the shadow
211
+ // tree and must report it. Otherwise capture/bubble event propagation is
212
+ // silently severed at that boundary (a listener on an ancestor rendered
213
+ // above the modal would never receive descendant focus/blur, etc.).
214
+ if (ShadowNode::sameFamily(*currentRevision, *shadowNode)) {
215
+ return jsi::Value{shadowNode->getSurfaceId()};
216
+ }
217
+
212
218
  auto parentShadowNode = dom::getParentNode(currentRevision, *shadowNode);
213
219
  if (parentShadowNode == nullptr) {
214
220
  return jsi::Value::undefined();
@@ -134,11 +134,19 @@ void EventEmitter::dispatchEvent(
134
134
  return;
135
135
  }
136
136
 
137
+ SharedEventTarget eventTarget;
138
+ std::weak_ptr<const ShadowNodeFamily> shadowNodeFamily;
139
+ {
140
+ std::scoped_lock lock(DispatchMutex());
141
+ eventTarget = eventTarget_;
142
+ shadowNodeFamily = shadowNodeFamily_;
143
+ }
144
+
137
145
  eventDispatcher->dispatchEvent(RawEvent(
138
146
  normalizeEventType(std::move(type)),
139
147
  std::move(payload),
140
- eventTarget_,
141
- shadowNodeFamily_,
148
+ std::move(eventTarget),
149
+ std::move(shadowNodeFamily),
142
150
  category,
143
151
  false,
144
152
  eventTimestamp));
@@ -180,11 +188,19 @@ void EventEmitter::dispatchUniqueEvent(
180
188
  return;
181
189
  }
182
190
 
191
+ SharedEventTarget eventTarget;
192
+ std::weak_ptr<const ShadowNodeFamily> shadowNodeFamily;
193
+ {
194
+ std::scoped_lock lock(DispatchMutex());
195
+ eventTarget = eventTarget_;
196
+ shadowNodeFamily = shadowNodeFamily_;
197
+ }
198
+
183
199
  eventDispatcher->dispatchUniqueEvent(RawEvent(
184
200
  normalizeEventType(std::move(type)),
185
201
  std::move(payload),
186
- eventTarget_,
187
- shadowNodeFamily_,
202
+ std::move(eventTarget),
203
+ std::move(shadowNodeFamily),
188
204
  RawEvent::Category::Continuous,
189
205
  true,
190
206
  eventTimestamp));
@@ -361,7 +361,7 @@ UIFont *RCTFontWithFontProperties(RCTFontProperties fontProperties)
361
361
  font = [UIFont fontWithName:fontProperties.family size:effectiveFontSize];
362
362
  if (font != nullptr) {
363
363
  fontNames = [UIFont fontNamesForFamilyName:font.familyName];
364
- fontWeight = (fontWeight != 0.0) ?: RCTGetFontWeight(font);
364
+ fontWeight = (fontWeight != 0.0) ? fontWeight : RCTGetFontWeight(font);
365
365
  } else {
366
366
  // Failback to system font.
367
367
  font = RCTDefaultFontWithFontProperties(fontProperties);
@@ -61,6 +61,6 @@ Pod::Spec.new do |spec|
61
61
  # Fabric must be able to access private headers (which should not be included in the umbrella header)
62
62
  all_header_files = 'yoga/**/*.h'
63
63
  all_header_files = File.join('ReactCommon/yoga', all_header_files) if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION']
64
- spec.private_header_files = Dir.glob(all_header_files) - Dir.glob(public_header_files)
64
+ spec.private_header_files = Dir.glob(all_header_files).sort - Dir.glob(public_header_files).sort
65
65
  spec.preserve_paths = [all_header_files]
66
66
  end
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native",
3
- "version": "0.86.2",
3
+ "version": "0.86.3",
4
4
  "description": "A framework for building native apps using React",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -149,7 +149,7 @@
149
149
  "featureflags": "node ./scripts/featureflags/index.js"
150
150
  },
151
151
  "peerDependencies": {
152
- "@react-native/jest-preset": "0.86.2",
152
+ "@react-native/jest-preset": "0.86.3",
153
153
  "@types/react": "^19.1.1",
154
154
  "react": "^19.2.3"
155
155
  },
@@ -162,13 +162,13 @@
162
162
  }
163
163
  },
164
164
  "dependencies": {
165
- "@react-native/assets-registry": "0.86.2",
166
- "@react-native/codegen": "0.86.2",
167
- "@react-native/community-cli-plugin": "0.86.2",
168
- "@react-native/gradle-plugin": "0.86.2",
169
- "@react-native/js-polyfills": "0.86.2",
170
- "@react-native/normalize-colors": "0.86.2",
171
- "@react-native/virtualized-lists": "0.86.2",
165
+ "@react-native/assets-registry": "0.86.3",
166
+ "@react-native/codegen": "0.86.3",
167
+ "@react-native/community-cli-plugin": "0.86.3",
168
+ "@react-native/gradle-plugin": "0.86.3",
169
+ "@react-native/js-polyfills": "0.86.3",
170
+ "@react-native/normalize-colors": "0.86.3",
171
+ "@react-native/virtualized-lists": "0.86.3",
172
172
  "abort-controller": "^3.0.0",
173
173
  "anser": "^1.4.9",
174
174
  "ansi-regex": "^5.0.0",
@@ -176,7 +176,7 @@
176
176
  "base64-js": "^1.5.1",
177
177
  "commander": "^12.0.0",
178
178
  "flow-enums-runtime": "^0.0.6",
179
- "hermes-compiler": "250829098.0.16",
179
+ "hermes-compiler": "250829098.0.17",
180
180
  "invariant": "^2.2.4",
181
181
  "memoize-one": "^5.0.0",
182
182
  "metro-runtime": "^0.84.3",
@@ -1 +1 @@
1
- hermes-v250829098.0.16
1
+ hermes-v250829098.0.17
@@ -4,6 +4,7 @@
4
4
  # LICENSE file in the root directory of this source tree.
5
5
 
6
6
  require "json"
7
+ require "pathname"
7
8
  require_relative "./hermes-utils.rb"
8
9
 
9
10
  begin
@@ -91,9 +92,13 @@ Pod::Spec.new do |spec|
91
92
  hermes_compiler_path = File.dirname(Pod::Executable.execute_command('node', ['-p',
92
93
  "require.resolve(\"hermes-compiler\", {paths: [\"#{react_native_path}\"]})", __dir__]).strip
93
94
  )
95
+ hermesc_path = File.join(hermes_compiler_path, 'hermesc', 'osx-bin', 'hermesc')
96
+
97
+ pods_root = Pod::Config.instance.sandbox.root
98
+ relative_hermesc = Pathname.new(hermesc_path).relative_path_from(pods_root)
94
99
 
95
100
  spec.user_target_xcconfig = {
96
- 'HERMES_CLI_PATH' => "#{hermes_compiler_path}/hermesc/osx-bin/hermesc"
101
+ 'HERMES_CLI_PATH' => "$(PODS_ROOT)/#{relative_hermesc}"
97
102
  }
98
103
  end
99
104
 
@@ -1,2 +1,2 @@
1
1
  HERMES_VERSION_NAME=0.17.0
2
- HERMES_V1_VERSION_NAME=250829098.0.16
2
+ HERMES_V1_VERSION_NAME=250829098.0.17