Fix crash in AccessibilityManager
Summary: Fix this crash by making sure the RCTDeviceInfo is doing things on the main thread. This fixes #14043. Reviewed By: ashwinb Differential Revision: D5286746 fbshipit-source-id: cce3426a6e7e7221cff82f8bca663d9a060dd358
This commit is contained in:
parent
b1e64a448a
commit
112e3767ce
|
@ -0,0 +1,52 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2015-present, Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD-style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*
|
||||||
|
* @flow
|
||||||
|
* @providesModule AccessibilityManagerTest
|
||||||
|
*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const React = require('react');
|
||||||
|
const ReactNative = require('react-native');
|
||||||
|
const { View } = ReactNative;
|
||||||
|
const RCTDeviceEventEmitter = require('RCTDeviceEventEmitter');
|
||||||
|
const {
|
||||||
|
TestModule,
|
||||||
|
AccessibilityManager,
|
||||||
|
} = ReactNative.NativeModules;
|
||||||
|
|
||||||
|
|
||||||
|
class AccessibilityManagerTest extends React.Component {
|
||||||
|
componentDidMount() {
|
||||||
|
AccessibilityManager.setAccessibilityContentSizeMultipliers({
|
||||||
|
'extraSmall': 1.0,
|
||||||
|
'small': 2.0,
|
||||||
|
'medium': 3.0,
|
||||||
|
'large': 4.0,
|
||||||
|
'extraLarge': 5.0,
|
||||||
|
'extraExtraLarge': 6.0,
|
||||||
|
'extraExtraExtraLarge': 7.0,
|
||||||
|
'accessibilityMedium': 8.0,
|
||||||
|
'accessibilityLarge': 9.0,
|
||||||
|
'accessibilityExtraLarge': 10.0,
|
||||||
|
'accessibilityExtraExtraLarge': 11.0,
|
||||||
|
'accessibilityExtraExtraExtraLarge': 12.0,
|
||||||
|
});
|
||||||
|
RCTDeviceEventEmitter.addListener('didUpdateDimensions', update => {
|
||||||
|
TestModule.markTestPassed(update.window.fontScale === 4.0);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
render(): React.Element<any> {
|
||||||
|
return <View />;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AccessibilityManagerTest.displayName = 'AccessibilityManagerTest';
|
||||||
|
|
||||||
|
module.exports = AccessibilityManagerTest;
|
|
@ -35,6 +35,7 @@ var TESTS = [
|
||||||
require('./PromiseTest'),
|
require('./PromiseTest'),
|
||||||
require('./SyncMethodTest'),
|
require('./SyncMethodTest'),
|
||||||
require('./WebSocketTest'),
|
require('./WebSocketTest'),
|
||||||
|
require('./AccessibilityManagerTest'),
|
||||||
];
|
];
|
||||||
|
|
||||||
TESTS.forEach(
|
TESTS.forEach(
|
||||||
|
|
|
@ -74,6 +74,7 @@ RCT_TEST(SimpleSnapshotTest)
|
||||||
RCT_TEST(SyncMethodTest)
|
RCT_TEST(SyncMethodTest)
|
||||||
RCT_TEST(PromiseTest)
|
RCT_TEST(PromiseTest)
|
||||||
RCT_TEST_ONLY_WITH_PACKAGER(WebSocketTest)
|
RCT_TEST_ONLY_WITH_PACKAGER(WebSocketTest)
|
||||||
|
RCT_TEST(AccessibilityManagerTest)
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -67,7 +67,7 @@ static NSDictionary *RCTExportedDimensions(RCTBridge *bridge)
|
||||||
|
|
||||||
- (void)invalidate
|
- (void)invalidate
|
||||||
{
|
{
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
RCTExecuteOnMainQueue(^{
|
||||||
self->_bridge = nil;
|
self->_bridge = nil;
|
||||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||||
});
|
});
|
||||||
|
@ -82,18 +82,30 @@ static NSDictionary *RCTExportedDimensions(RCTBridge *bridge)
|
||||||
|
|
||||||
- (void)didReceiveNewContentSizeMultiplier
|
- (void)didReceiveNewContentSizeMultiplier
|
||||||
{
|
{
|
||||||
// Report the event across the bridge.
|
RCTBridge *bridge = _bridge;
|
||||||
|
RCTExecuteOnMainQueue(^{
|
||||||
|
// Report the event across the bridge.
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||||
[_bridge.eventDispatcher sendDeviceEventWithName:@"didUpdateDimensions"
|
[bridge.eventDispatcher sendDeviceEventWithName:@"didUpdateDimensions"
|
||||||
body:RCTExportedDimensions(_bridge)];
|
body:RCTExportedDimensions(bridge)];
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)interfaceOrientationDidChange
|
- (void)interfaceOrientationDidChange
|
||||||
{
|
{
|
||||||
#if !TARGET_OS_TV
|
#if !TARGET_OS_TV
|
||||||
|
__weak typeof(self) weakSelf = self;
|
||||||
|
RCTExecuteOnMainQueue(^{
|
||||||
|
[weakSelf _interfaceOrientationDidChange];
|
||||||
|
});
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void)_interfaceOrientationDidChange
|
||||||
|
{
|
||||||
UIInterfaceOrientation nextOrientation = [RCTSharedApplication() statusBarOrientation];
|
UIInterfaceOrientation nextOrientation = [RCTSharedApplication() statusBarOrientation];
|
||||||
|
|
||||||
// Update when we go from portrait to landscape, or landscape to portrait
|
// Update when we go from portrait to landscape, or landscape to portrait
|
||||||
|
@ -109,7 +121,6 @@ static NSDictionary *RCTExportedDimensions(RCTBridge *bridge)
|
||||||
}
|
}
|
||||||
|
|
||||||
_currentInterfaceOrientation = nextOrientation;
|
_currentInterfaceOrientation = nextOrientation;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue