diff --git a/Libraries/WebSocket/RCTWebSocketExecutor.m b/Libraries/WebSocket/RCTWebSocketExecutor.m index 017df74b1..28333d2db 100644 --- a/Libraries/WebSocket/RCTWebSocketExecutor.m +++ b/Libraries/WebSocket/RCTWebSocketExecutor.m @@ -39,7 +39,10 @@ RCT_EXPORT_MODULE() - (instancetype)init { - return [self initWithURL:[RCTConvert NSURL:@"http://localhost:8081/debugger-proxy"]]; + NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; + NSInteger port = [standardDefaults integerForKey:@"websocket-executor-port"] ?: 8081; + NSString *URLString = [NSString stringWithFormat:@"http://localhost:%zd/debugger-proxy", port]; + return [self initWithURL:[RCTConvert NSURL:URLString]]; } - (instancetype)initWithURL:(NSURL *)URL diff --git a/React/Modules/RCTDevMenu.m b/React/Modules/RCTDevMenu.m index acad8b1da..165237ce0 100644 --- a/React/Modules/RCTDevMenu.m +++ b/React/Modules/RCTDevMenu.m @@ -140,6 +140,8 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) BOOL _jsLoaded; NSArray *_presentedItems; NSMutableArray *_extraMenuItems; + NSString *_webSocketExecutorName; + NSString *_executorOverride; } @synthesize bridge = _bridge; @@ -189,6 +191,13 @@ RCT_EXPORT_MODULE() [weakSelf.bridge.eventDispatcher sendDeviceEventWithName:@"toggleElementInspector" body:nil]; }]]; + _webSocketExecutorName = [_defaults objectForKey:@"websocket-executor-name"] ?: @"Chrome"; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _executorOverride = [_defaults objectForKey:@"executor-override"]; + }); + // Delay setup until after Bridge init dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf updateSettings:_settings]; @@ -266,7 +275,7 @@ RCT_EXPORT_MODULE() self.profilingEnabled = [_settings[@"profilingEnabled"] ?: @NO boolValue]; self.liveReloadEnabled = [_settings[@"liveReloadEnabled"] ?: @NO boolValue]; self.showFPS = [_settings[@"showFPS"] ?: @NO boolValue]; - self.executorClass = NSClassFromString(_settings[@"executorClass"]); + self.executorClass = NSClassFromString(_executorOverride ?: _settings[@"executorClass"]); } /** @@ -389,13 +398,18 @@ RCT_EXPORT_MODULE() Class chromeExecutorClass = NSClassFromString(@"RCTWebSocketExecutor"); if (!chromeExecutorClass) { - [items addObject:[RCTDevMenuItem buttonItemWithTitle:@"Chrome Debugger Unavailable" handler:^{ - UIAlertView *alert = RCTAlertView(@"Chrome Debugger Unavailable", @"You need to include the RCTWebSocket library to enable Chrome debugging", nil, @"OK", nil); + [items addObject:[RCTDevMenuItem buttonItemWithTitle:[NSString stringWithFormat:@"%@ Debugger Unavailable", _webSocketExecutorName] handler:^{ + UIAlertView *alert = RCTAlertView( + [NSString stringWithFormat:@"%@ Debugger Unavailable", _webSocketExecutorName], + [NSString stringWithFormat:@"You need to include the RCTWebSocket library to enable %@ debugging", _webSocketExecutorName], + nil, + @"OK", + nil); [alert show]; }]]; } else { BOOL isDebuggingInChrome = _executorClass && _executorClass == chromeExecutorClass; - NSString *debugTitleChrome = isDebuggingInChrome ? @"Disable Chrome Debugging" : @"Debug in Chrome"; + NSString *debugTitleChrome = isDebuggingInChrome ? [NSString stringWithFormat:@"Disable %@ Debugging", _webSocketExecutorName] : [NSString stringWithFormat:@"Debug in %@", _webSocketExecutorName]; [items addObject:[RCTDevMenuItem buttonItemWithTitle:debugTitleChrome handler:^{ weakSelf.executorClass = isDebuggingInChrome ? Nil : chromeExecutorClass; }]]; @@ -527,6 +541,7 @@ RCT_EXPORT_METHOD(reload) { if (_executorClass != executorClass) { _executorClass = executorClass; + _executorOverride = nil; [self updateSetting:@"executorClass" value:NSStringFromClass(executorClass)]; }