Skip to content

Commit 650caec

Browse files
fix: avoid retaining dev settings during bundle load
1 parent 59248a4 commit 650caec

2 files changed

Lines changed: 20 additions & 8 deletions

File tree

packages/react-native/ReactCommon/react/runtime/iostests/RCTInstanceTests.mm

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#import <XCTest/XCTest.h>
99

1010
#import <OCMock/OCMock.h>
11+
#import <React/RCTAssert.h>
1112
#import <React/RCTBridgeModule.h>
1213
#import <React/RCTBundleManager.h>
1314
#import <React/RCTJavaScriptLoader.h>
@@ -202,23 +203,34 @@ - (void)testInstantiatesRequestedModuleOnMainQueue
202203
[instance invalidate];
203204
}
204205

205-
- (void)testInitializesDevSettingsBeforeLoadingBundle
206+
- (void)testInitializesDevSettingsAfterBundleLoadFailure
206207
{
207208
OCMStub([_mockDelegate unstableModulesRequiringMainQueueSetup]).andReturn(@[]);
208209

209210
XCTestExpectation *loadStarted = [self expectationWithDescription:@"bundle load started"];
210-
__block NSUInteger initializeCountAtBundleLoad = 0;
211+
__block RCTSourceLoadBlock loadComplete;
211212
OCMStub([_mockDelegate loadBundleAtURL:[OCMArg any] onProgress:[OCMArg any] onComplete:[OCMArg any]])
212-
.andDo(^(NSInvocation *_) {
213-
initializeCountAtBundleLoad = [FakeDevSettings.initCounts countForObject:FakeDevSettingsInitialize];
213+
.andDo(^(NSInvocation *invocation) {
214+
__unsafe_unretained RCTSourceLoadBlock completion;
215+
[invocation getArgument:&completion atIndex:4];
216+
loadComplete = [completion copy];
214217
[loadStarted fulfill];
215218
});
216219

217220
RCTInstance *instance = [self makeInstance];
218221
[self waitForExpectations:@[ loadStarted ] timeout:5.0];
219-
[instance invalidate];
220222

221-
XCTAssertEqual(initializeCountAtBundleLoad, 1u);
223+
XCTAssertEqual([FakeDevSettings.initCounts countForObject:FakeDevSettingsInitialize], 0u);
224+
225+
RCTFatalHandler previousFatalHandler = RCTGetFatalHandler();
226+
RCTSetFatalHandler(^(__unused NSError *error){
227+
});
228+
loadComplete([NSError errorWithDomain:@"RCTInstanceTests" code:1 userInfo:nil], nil);
229+
RCTSetFatalHandler(previousFatalHandler);
230+
231+
XCTAssertEqual([FakeDevSettings.initCounts countForObject:FakeDevSettingsInitialize], 1u);
232+
233+
[instance invalidate];
222234
}
223235

224236
- (void)testBundleLoadAwaitsMainQueueModuleSetup

packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -543,8 +543,6 @@ - (void)_loadJSBundle:(NSURL *)sourceURL
543543
}
544544
#endif
545545

546-
RCTDevSettings *const devSettings = (RCTDevSettings *)[_turboModuleManager moduleForName:"DevSettings"];
547-
548546
__weak __typeof(self) weakSelf = self;
549547
[_delegate loadBundleAtURL:sourceURL
550548
onProgress:^(RCTLoadingProgress *progressData) {
@@ -565,6 +563,8 @@ - (void)_loadJSBundle:(NSURL *)sourceURL
565563
return;
566564
}
567565

566+
RCTDevSettings *const devSettings =
567+
(RCTDevSettings *)[strongSelf->_turboModuleManager moduleForName:"DevSettings"];
568568
if (error) {
569569
[strongSelf handleBundleLoadingError:error];
570570
return;

0 commit comments

Comments
 (0)