Commit Graph
20274 Commits
Author SHA1 Message Date
David VaccaandFacebook GitHub Bot d676558a30 Add support for elevation prop in Fabric
Summary:
This diff adds support elevation prop in Fabric core, additionally it adds this prop as non collapsable on the view flattening algorithm

changelog: [Internal] internal change in fabric to support elevation prop

Reviewed By: JoshuaGross

Differential Revision: D21896465

fbshipit-source-id: e0854acc0b2ac30eaf3f82d615aab1cf378cc530
2020-06-05 02:36:26 -07:00
Samuel SuslaandFacebook GitHub Bot 851d01b0aa Move Collapsable into shared props
Summary:
Changelog: Move collapsable to Shared View props

I'm researching why `collapsable` isn't passed to Fabric UIManager in production build, I discovered that collapsable was Android only prop but in Fabric we use it in iOS as well.

This doesn't fix the collapsable not being passed through but I think this makes code semantically correct.

Reviewed By: mdvacca

Differential Revision: D21862770

fbshipit-source-id: 492c6a15955b907dbbeb8530c81f6a868cf379c3
2020-06-04 04:05:57 -07:00
Emily JanzerandFacebook GitHub Bot 5c474ac24c Convert JSEngineInstance into a runtime factory, move runtime ownership to ReactInstance (#29009)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/29009

OSS changes: Update RCTTurboModuleManager to accept a RuntimeExecutor instead of a `jsi::Runtime`.

Reviewed By: RSNara

Differential Revision: D21270243

fbshipit-source-id: e954e62ffd54cd57f6644de853e92f71c5e52e78
2020-06-03 22:06:39 -07:00
Ramanpreet NaraandFacebook GitHub Bot 96fdaa541e Cache constants for MP Search NativeModules
Summary: TurboModules doesn't cache invocations of getConstants(). This diff looks at which NativeModules' getConstants() methods gets repeated called in Marketplace, and caches those invocations in JS.

Reviewed By: fkgozali

Differential Revision: D21874123

fbshipit-source-id: a44b98b3ac8621f67c9c0f3b7c4003a561d1e15d
2020-06-03 20:48:28 -07:00
Ramanpreet NaraandFacebook GitHub Bot 4e9c428328 Cache constants for MP Home NativeModules
Summary: TurboModules doesn't cache invocations of getConstants(). This diff looks at which NativeModules' getConstants() methods gets repeated called in Marketplace, and caches those invocations in JS.

Reviewed By: fkgozali

Differential Revision: D21874124

fbshipit-source-id: 03d2318e1b6d00236ef707f9f19a640bf8c08786
2020-06-03 20:48:27 -07:00
Peter ArganyandFacebook GitHub Bot fdadff92ab RM stub function from MessageQueue.js
Summary:
Noticed this hanging around when reading MessageQueue, delete it.

Changelog: [internal]

Reviewed By: fkgozali

Differential Revision: D21874609

fbshipit-source-id: 627c6a18cdb859a1aaf2eb596f8744156d18393c
2020-06-03 18:22:36 -07:00
Marc HorowitzandFacebook GitHub Bot 9baf6f2140 Handle stack overflow in JSError construction gracefully
Summary:
JSError creation can lead to further errors.  Make sure these cases
are handled and don't cause weird crashes or other issues.

This solution has a few parts:
 * include a ScopedNativeDepthTracker in checkStatus
 * If an exception object message or stack property is already a String, don't
   call JS String ctor on it
 * Verify that a jsi::Value is a String before calling getString on it.
 * Add more tests for JSError construction

Changelog: [Internal]

Reviewed By: dulinriley

Differential Revision: D21851645

fbshipit-source-id: 2d10da0e741ad4ede93cd806320f68ad512e5138
2020-06-03 18:14:18 -07:00
Sam GoldmanandFacebook GitHub Bot 3b96b39ab3 Deploy Flow 0.126.1
Summary: Changelog: [Internal]

Reviewed By: dsainati1

Differential Revision: D21866638

fbshipit-source-id: de89fb4946a62f1b1d58ec6573f585c481834514
2020-06-03 16:20:53 -07:00
Ramanpreet NaraandFacebook GitHub Bot 976f51abd9 Execute sync methods on JS thread
Summary:
There are two ways to make a NativeModule method execute synchronously:
- Declare the NativeModule method to be synchronous (i.e: use `RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD`).
- Make the NativeModule synchronous (i.e: make its method queue `RCTJSThread`). This way, all its methods are synchronous.

`RCTNativeModule` executes all synchronous methods on the JS thread:
- Executing an async methods on a sync module: https://git.io/JfRPj
- Executing a sync method: https://git.io/JfRXe

However, in TurboModules we block the JS thread, execute the method on the NativeModule's method queue, and then unblock the JS thread. While this approach is thread-safe, and arguably the correct way to dispatch sync methods, it's also much slower than the alternative. Therefore, this diff migrates the legacy behaviour to the TurboModule system.

## Special Case: getConstants()
When an ObjC NativeModule requires main queue setup, and it exports constants, we execute its `constantsToExport` method on the main queue (see: [RCTModuleData gatherConstants](https://github.com/facebook/react-native/blob/c8d678abcf93fd3f6daf4bebfdf25937995c1fdf/React/Base/RCTModuleData.mm#L392-L402)). I replicated this behaviour with TurboModules.

Changelog:
[iOS][Fixed] - Execute ObjC TurboModule async method calls on JS thread for sync modules

Reviewed By: fkgozali

Differential Revision: D21602096

fbshipit-source-id: 42d07b7ad000abeac27091dc3ec440e3836d2eae
2020-06-02 23:01:35 -07:00
Ramanpreet NaraandFacebook GitHub Bot d7ac21cec5 Remove main queue execution of constantsToExport
Summary:
## Context
- If a NativeModule requires main queue setup, its `constantsToExport` method is executed on the main queue.
- In the TurboModule system, `constantsToExport` or `getConstants` is treated like a regular synchronous NativeModule method. Therefore, it's always executed on the JS thread.

This difference in behaviour is dangerous when we're A/B testing the TurboModule infra: One could write a NativeModule that requires main queue setup, and have it expose constants that access objects/state only accessible on the UI thread. This NativeModule would work fine in the legacy infra, which could be the case if the NativeModule author is testing locally. But once it ships to prod, it may run with the TurboModule system, and crash the application. To mitigate this risk, I'm removing this special main queue execution of `constantsToExport` from the legacy infrastructure.

## Consequences
- If a NativeModule's `constantsToExport` method accesses objects/state only accessible on the UI thread, it must do so by explicitly scheduling work on the main thread. I wrote up a codemod to fix this for our OSS modules: D21797048.
- Eagerly initialized NativeModules that required main queue setup had their constants calculated eagerly. After the changes in this diff, those NativeModules will have their constants calculated lazily. I don't think this is a big deal because only a handful of NativeModules are eagerly initialized, and eagerly initialized NativeModules are going away anyway.

Changelog:
[iOS][Removed] - Main queue execution of constantsToExport in NativeModules requiring main queue setup

Reviewed By: fkgozali

Differential Revision: D21829091

fbshipit-source-id: df21fd5fd2ef45a291c07400f360bba801ae290f
2020-06-02 23:01:35 -07:00
Ramanpreet NaraandFacebook GitHub Bot 39d67737c0 Run getConstants method statements on main queue
Summary:
If a NativeModule requires main queue setup, its `getConstants()` method must be executed on the main thead. The legacy NativeModule infra takes care of this for us. With TurboModules, however, all synchronous methods, including `getConstants()`, execute on the JS thread. Therefore, if a TurboModule requires main queue setup, and exports constants, we must execute its `getConstants()` method body on the main queue explicitly.

**Notes:**
- The changes in this diff should be a noop when TurboModules is off, because `RCTUnsafeExecuteOnMainQueueSync` synchronously execute its block on the current thread if the current thread is the main thread.
- If a NativeModule doens't have the `requiresMainQueueSetup` method, but has the `constantsToExport` method, both NativeModules and TurboModules assume that it requires main queue setup.

## Script
```
const exec = require("../lib/exec");
const abspath = require("../lib/abspath");
const relpath = require("../lib/relpath");
const readFile = (filename) => require("fs").readFileSync(filename, "utf8");
const writeFile = (filename, content) =>
  require("fs").writeFileSync(filename, content);

function main() {
  const tmFiles = exec("cd ~/fbsource && xbgs -n 10000 -l constantsToExport")
    .split("\n")
    .filter(Boolean);

  const filesWithoutConstantsToExport = [];
  const filesWithConstantsToExportButNotGetConstants = [];
  const filesExplicitlyNotRequiringMainQueueSetup = [];

  tmFiles
    .filter((filename) => {
      if (filename.includes("microsoft-fork-of-react-native")) {
        return false;
      }

      return /\.mm?$/.test(filename);
    })
    .map(abspath)
    .forEach((filename) => {
      const code = readFile(filename);
      const relFilename = relpath(filename);

      if (!/constantsToExport\s*{/.test(code)) {
        filesWithoutConstantsToExport.push(relFilename);
        return;
      }

      if (!/getConstants\s*{/.test(code)) {
        filesWithConstantsToExportButNotGetConstants.push(relFilename);
        return;
      }

      if (/requiresMainQueueSetup\s*{/.test(code)) {
        const requiresMainQueueSetupRegex = /requiresMainQueueSetup\s*{\s*return\s+(?<requiresMainQueueSetup>YES|NO)/;
        const requiresMainQueueSetupRegexMatch = requiresMainQueueSetupRegex.exec(
          code
        );

        if (!requiresMainQueueSetupRegexMatch) {
          throw new Error(
            "Detected requiresMainQueueSetup method in file " +
              relFilename +
              " but was unable to parse the method return value"
          );
        }

        const {
          requiresMainQueueSetup,
        } = requiresMainQueueSetupRegexMatch.groups;

        if (requiresMainQueueSetup == "NO") {
          filesExplicitlyNotRequiringMainQueueSetup.push(relFilename);
          return;
        }
      }

      const getConstantsTypeRegex = () => /-\s*\((?<type>.*)\)getConstants\s*{/;
      const getConstantsTypeRegexMatch = getConstantsTypeRegex().exec(code);

      if (!getConstantsTypeRegexMatch) {
        throw new Error(
          `Failed to parse return type of getConstants method in file ${relFilename}`
        );
      }

      const getConstantsType = getConstantsTypeRegexMatch.groups.type;

      const getConstantsBody = code
        .split(getConstantsTypeRegex())[2]
        .split("\n}")[0];

      const newGetConstantsBody = `
  __block ${getConstantsType} constants;
  RCTUnsafeExecuteOnMainQueueSync(^{${getConstantsBody
    .replace(/\n/g, "\n  ")
    .replace(/_bridge/g, "self->_bridge")
    .replace(/return /g, "constants = ")}
  });

  return constants;
`;

      writeFile(
        filename,
        code
          .replace(getConstantsBody, newGetConstantsBody)
          .replace("#import", "#import <React/RCTUtils.h>\n#import")
      );
    });

  console.log("Files without constantsToExport: ");
  filesWithoutConstantsToExport.forEach((file) => console.log(file));
  console.log();

  console.log("Files with constantsToExport but no getConstants: ");
  filesWithConstantsToExportButNotGetConstants.forEach((file) =>
    console.log(file)
  );
  console.log();

  console.log("Files with requiresMainQueueSetup = NO: ");
  filesExplicitlyNotRequiringMainQueueSetup.forEach((file) =>
    console.log(file)
  );
}

if (!module.parent) {
  main();
}

```

Changelog: [Internal]

Reviewed By: fkgozali

Differential Revision: D21797048

fbshipit-source-id: a822a858fecdbe976e6197f8339e509dc7cd917f
2020-06-02 23:01:35 -07:00
Ramanpreet NaraandFacebook GitHub Bot e5bef7338f Remove TurboModule debug logs
Summary:
These logs are no longer necessary, because data indicates that the TurboModule eager init crash was fixed.

Changelog: [Internal]

Reviewed By: fkgozali

Differential Revision: D21852743

fbshipit-source-id: ddeefd6396283ee5e15980a33fb006cb83a81532
2020-06-02 20:11:53 -07:00
Janic DuplessisandFacebook GitHub Bot d3b937f990 Make sure LogBox is not included in production bundles (#28984)
Summary:
I was doing some bundle inspection and noticed the LogBox module was included. It does amount to around 15kb so I think it is worth making sure it is not there.

To fix it I moved some imports to require inside __DEV__ blocks to make sure metro is able to remove these imports.

## Changelog

[General] [Fixed] - Make sure LogBox is not included in production bundles
Pull Request resolved: https://github.com/facebook/react-native/pull/28984

Test Plan: Tested using react-native-bundle-visualizer and made sure nothing from LogBox was included in the bundle after these changes.

Reviewed By: TheSavior

Differential Revision: D21794466

Pulled By: rickhanlonii

fbshipit-source-id: 6cb0c0a89633e9850019bd61478c35e9c21638dc
2020-06-02 18:00:45 -07:00
Luna WeiandFacebook GitHub Bot ceb6c3de54 Fix assertions
Summary:
Changelog:
[Internal][Fixed] - Fix non-null assertions

These assertions weren't asserting that these objects aren't null.

Reviewed By: mdvacca

Differential Revision: D21844260

fbshipit-source-id: 6102fb304ddb6db61411e15c32355e4c3d3effca
2020-06-02 13:43:36 -07:00
Satyajit SahooandFacebook GitHub Bot 29f0cedc0a Remove usage of legacy context API in modal (#29002)
Summary:
Remove usage of the legacy context API in Modal in favor of the new context API. Closes https://github.com/facebook/react-native/issues/28103
Pull Request resolved: https://github.com/facebook/react-native/pull/29002

Test Plan: Run RNTester app and test the Modal example. Also add a `console.warn` to make sure we get the correct context value.

Differential Revision: D21793993

Pulled By: TheSavior

fbshipit-source-id: de2a30cbd46507bfa73a563d2429c5a7f0e320c9
2020-06-02 11:15:34 -07:00
Christoph NakazawaandFacebook GitHub Bot 150d7f61c6 Remove docblock util from @fb-tools/transformer
Summary: Changelog: [Internal]

Reviewed By: motiz88

Differential Revision: D21718525

fbshipit-source-id: 38f44b45f30db71658fa969cd8bcf44638cb4ea7
2020-06-02 05:45:18 -07:00
Samuel SuslaandFacebook GitHub Bot ee3994530d Force JS inspector to form stacking context
Summary:
Changelog: [Internal]

# Problem

JS inspector overlay gets flattened, therefore `onResponderMove` callback isn't called. JS inspector depends on `onResponderMove` because that's how it knows where on screen user has tapped.

https://our.intern.facebook.com/intern/diffusion/FBS/browse/master/xplat/js/react-native-github/Libraries/Inspector/InspectorOverlay.js?commit=2e9ab04b039a&lines=58

# Workaround

This is just a hack to get it working, setting nativeID forces stacking context to be created and therefore view not being flattened.

Reviewed By: mdvacca

Differential Revision: D21816513

fbshipit-source-id: 83aedbfaecdce22cfe202241cbe91cecb914ed6b
2020-06-01 09:40:06 -07:00
Valentin SherginandFacebook GitHub Bot 9d6d39de86 A corner case check in Instance::handleMemoryPressure
Summary:
At some early stages of Instance initialization, it does not have a `nativeToJsBridge_`. At the same time, `handleMemoryPressure` can be called at any point in time, so we should check the pointer for not being null before calling on it.

Changelog: [Internal] Fabric-specific internal change.

Reviewed By: JoshuaGross, mdvacca

Differential Revision: D21798522

fbshipit-source-id: 6384da88784cceb493cf9810408cbb47777d3f4b
2020-05-29 20:38:25 -07:00
Valentin SherginandFacebook GitHub Bot b99bdaa218 Fabric: Calling JSVM GC on memory pressure event on iOS (second attempt)
Summary:
This change is especially important for Fabric when a lot of objects (mostly ShadowNodes) have shared ownership. Without this change, JSVM could not know that bunch of natively allocated objects should be deallocated.
Changelog: [Internal] Fabric-specific internal change.

Reviewed By: mdvacca

Differential Revision: D21798527

fbshipit-source-id: f2051721b074b99660cdfd6c5b75679b9792403e
2020-05-29 20:38:25 -07:00
simekandFacebook GitHub Bot ad2f98df8f mark 'force' as optional property of PressEvent object (#29006)
Summary:
Refs:
* https://github.com/facebook/react-native/blob/master/React/Fabric/RCTSurfaceTouchHandler.mm#L93
* https://github.com/facebook/react-native/blob/master/RNTester/js/examples/Pressable/PressableExample.js#L25

According to the current implementation `force` will be returned only on `iOS` platform, only on the devices which have a hardware 3D touch capabilities.

## Changelog

<!-- Help reviewers and the release process by writing your own changelog entry. For an example, see:
https://github.com/facebook/react-native/wiki/Changelog
-->

[General] [Fixed] - mark `force` as an optional property of the PressEvent object
Pull Request resolved: https://github.com/facebook/react-native/pull/29006

Test Plan: Go CI!

Reviewed By: cpojer

Differential Revision: D21797241

Pulled By: TheSavior

fbshipit-source-id: e66be6958a2251bc8585e87e6bad54484a067949
2020-05-29 17:36:59 -07:00
Danny YanandFacebook GitHub Bot f29238cc0c fix using deprecated constants in Android API Level 29
Summary:
Changelog: [Internal]

# Context

FB4A recently updated from [Android API level 28 to level 29](https://fb.workplace.com/groups/782862961920333/permalink/1409529345920355/). This [deprecated](https://developer.android.com/reference/android/provider/MediaStore.Images.ImageColumns#LATITUDE) the constants `Images.Media.Latitude` and `Image.Media.Longitude`, and we started to get the exception found in the attached task.

# This diff

Similar to this [pull request](https://github.com/react-native-community/react-native-cameraroll/pull/170), it removes the usage of the deprecated latitude and longitude constants. However for our case I don't know if latitude and longitude are being used or not, so for this diff I will check on the Android API level before adding the latitude and longitude in the project list. This is a similar implementation to the [first version](https://github.com/react-native-community/react-native-cameraroll/pull/170/commits/adeeb3ee0aaeb79be3c6917f973c993ab4079868) of the above pull request where it checks the api level before extracting the location data.

Differential Revision: D21774607

fbshipit-source-id: 632ea871b530b8e157f4ca74a5bc319b2abf7ba5
2020-05-29 16:16:44 -07:00
Joshua GrossandFacebook GitHub Bot 5d39bfa501 Fix crash in NativeAnimatedModule due to inlining and race between animation/teardown
Summary:
Fix NPE crashes in NativeAnimatedModule.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D21789500

fbshipit-source-id: be099543bc0552d49463b12216be196864e23d25
2020-05-29 15:48:24 -07:00
Joshua GrossandFacebook GitHub Bot 8a02450fbb Stop all surfaces when tearing down FabricUIManager
Summary:
Teardown any remaining surfaces when tearing down FabricUIManager.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D21774541

fbshipit-source-id: cfd544f1721599521e0fd6677d45208e51b8340d
2020-05-29 15:48:24 -07:00
Joshua GrossandFacebook GitHub Bot 983b0a0903 Remove logs related to T62192299
Summary:
Removing logs related to T62192299 that we don't need anymore.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D21773629

fbshipit-source-id: d16c01f87be3ed7512fe90b6e261b4c7efbd3068
2020-05-29 15:48:24 -07:00
Vojtech NovakandFacebook GitHub Bot 92160f3144 use React.Children.count for counting children (#28991)
Summary:
just a minor change - uses the [count api](https://reactjs.org/docs/react-api.html#reactchildrencount)

> Returns the total number of components in children, equal to the number of times that a callback passed to map or forEach would be invoked.

## Changelog

not needed I think
Pull Request resolved: https://github.com/facebook/react-native/pull/28991

Test Plan: tested locally

Differential Revision: D21794081

Pulled By: TheSavior

fbshipit-source-id: bf6d11b2bc854d938aed7268911f89a00bb3f596
2020-05-29 15:00:58 -07:00
Samuel SuslaandFacebook GitHub Bot 163ec924fb Disable restoreDefaultValues in Native Animated in Fabric
Summary:
Changelog: [Internal]

# Problem

Before every update, restoreDefaults is called on animated nodes. In paper this makes sure no stale properties are on animated nodes. In paper it works fine because restoreDefaults is called before mounting and animations are triggered after mounting within single commit.

Details: https://github.com/facebook/react-native/pull/11819

In Fabric however it is called outside of other mounting operations and it applies default values to the view and then re-applies animated values.

Reviewed By: JoshuaGross

Differential Revision: D21786765

fbshipit-source-id: a2cb6d6d9cbd39d4c403c97c2f51e7d92078102f
2020-05-29 13:57:38 -07:00
Christoph NakazawaandFacebook GitHub Bot a4757d2823 Update to eslint 6.8
Reviewed By: motiz88

Differential Revision: D21417675

fbshipit-source-id: 73c3e2a2dc07db30b9648111bbbdb7751ed3d258
2020-05-29 02:53:36 -07:00
Joshua GrossandFacebook GitHub Bot f438a6e8f6 Delete ReactViewPager
Summary:
All ReactViewPager functionality should now be possible by using a ScrollView.

Changelog: [Internal] ReactViewPager has been deprecated on Android and was removed from core as part of LeanCore

Reviewed By: mdvacca

Differential Revision: D21751774

fbshipit-source-id: 292475b9ffe7788b745329d13fd88dc3b613819e
2020-05-28 19:04:55 -07:00
Joshua GrossandFacebook GitHub Bot 3148d1746e Delete ViewPagerAndroid JS and BUCK targets
Summary:
After the experiment in D21198302 ships to 100% and that code is deleted, we no longer need ViewPagerAndroid anywhere in FB so it can be deleted.

This is distinct from deleting the native side of the component, which resides in open-source.

Changelog: [Internal]

Differential Revision: D21211134

fbshipit-source-id: 610e09792b079d34acbfcec836fde58a0b3648a7
2020-05-28 19:04:55 -07:00
Christoph NakazawaandFacebook GitHub Bot 3b7679bd35 Clean up Flow & lint errors
Summary: Changelog: [Internal]

Reviewed By: motiz88

Differential Revision: D21703338

fbshipit-source-id: f33cf6dfdf8884ae76500ec55f44411e34e8cb76
2020-05-28 16:17:57 -07:00
David VaccaandFacebook GitHub Bot dc357b859c Revert Virtual Text Press Bug workaround
Summary:
This diff reverts the workaround added as part of D21432793, now that D21432793 is released in production for FB4A / FBiOS

changelog:
[Internal]

Reviewed By: JoshuaGross

Differential Revision: D21772129

fbshipit-source-id: 3b39738cb8fc871ec85d87f347c7f0ef408ccc3e
2020-05-28 15:44:04 -07:00
David VaccaandFacebook GitHub Bot 4b596fd5b3 Extend Text to support measurement of empty Texts
Summary:
This diff extends the measurement of Text components in order to support empty strings.
This is required for parity with Paper.
I created a follow up task to analyze support of empty string as part of the Text infrastructure of Fabric in the future.

changelog: [Internal]

Reviewed By: sammy-SC

Differential Revision: D21761171

fbshipit-source-id: d2aa074052b09732af5d35723f19014090fcabbf
2020-05-28 15:10:47 -07:00
Rick HanlonandFacebook GitHub Bot 34b23c1220 Add new bundle loading strategy in FBiOS behind GK
Reviewed By: PeteTheHeat

Differential Revision: D21706223

fbshipit-source-id: 805628eed004e1469a4b1aa1e69fd2982e448b25
2020-05-28 13:54:15 -07:00
David VaccaandFacebook GitHub Bot 6f8fc40195 Add Fabric logs to TextLayoutManager
Summary:
This diff add logging on Text Layout Manager.

changelog: [Internal][Android] Internal changes to extend logging

Reviewed By: JoshuaGross

Differential Revision: D21737356

fbshipit-source-id: f34091722ff95f83ca41c9f17c49d31ce6618c9a
2020-05-28 13:41:56 -07:00
Riley DulinandFacebook GitHub Bot 9bb7e06747 Remove calls to AllocationLocationTracker for native memory
Summary:
`getStackTracesTreeNodeForAlloc` only works for memory that was tracked with `newAlloc`.
For now, that is only memory that goes through GC APIs.

Various places were calling this function on native memory which was allocated
with `malloc`, not GC memory. This led to SIGSEGV on nullptr when trying to take heap profiles
of these objects.

`newAlloc` could, in theory, work with native memory as well. But building out support for that
is outside the scope of this fix.

Changelog: [Internal]

Reviewed By: jbower-fb

Differential Revision: D21667842

fbshipit-source-id: 8403a6668e5ec607972ce6819f78fedb89da3f37
2020-05-28 12:15:48 -07:00
Rick HanlonandFacebook GitHub Bot f2b9ec7981 Refactor RCTKeyCommands, allow hotkeys to be used without command key
Summary:
This diff updates our RCTKeyCommands code to be more resilient by copying the [FLEX strategy for key commands](https://github.com/Flipboard/FLEX/blob/master/Classes/Utility/Keyboard/FLEXKeyboardShortcutManager.m).

This strategy swizzles UIApplication handleKeyUIEvent which is further upstream than our UIResponder. It also allows for single key hotkeys like pressing just `r` instead of `cmd+r`. It does this without interfering with typing input  by checking the first responder first.

I've also updated our hotkey handling to support using just the keys like `r` in addition to `cmd+r`. In addition to brining these hotkeys more in line with other iOS tools, they're also easier to use and do not suffer the same issues hotkeys with modifiers like `cmd` have where keys are dropped.

Changelog: [iOS] [Added] Allow hotkeys to be used without command key

Reviewed By: shergin

Differential Revision: D21635129

fbshipit-source-id: 36e0210a62b1f310473e152e8305165024cd338b
2020-05-28 11:25:45 -07:00
Joshua GrossandFacebook GitHub Bot 5cde6c5e7d Back out "Reset RootView ID when root view is detached from view hierarchy"
Summary:
Original commit changeset: 5e607f34cf42

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D21757847

fbshipit-source-id: 96caf39f2ee99f64c96ebac9836ca178a7513cf1
2020-05-27 22:58:46 -07:00
Joshua GrossandFacebook GitHub Bot 8da92d746b Fix crash in removeViewAt by fixing incorrect error-detection
Summary:
As a followup to D21750097 and D21735940, it seems that ANY uses of childCount will be incorrect as they are "often" reported, incorrectly, as just 0.

This is likely due to exotic cases like (1) the ViewManager childCount being overridden, or (2) special ViewManagers like BottomSheet where the childCount may actually be 1/0 even though many children are inserted.

Anyway, as a more generic fix, let's only rethrow an existing Exception with additional diagnostics instead of trying to detect when this /would/ crash.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D21756178

fbshipit-source-id: 17ffb2ed531978bae8d4db19d7b87ec62397e44b
2020-05-27 22:53:31 -07:00
Joshua GrossandFacebook GitHub Bot 7e559465bd Fix crash introduced by D21735940 in T67525923
Summary:
We cannot call `parentView.getChildCount()` directly, we must get the child count through the ViewManager:

A simple `Log.e` call shows:

```
MountingManager: parentView.getChildCount(): 0 // viewGroupManager.getChildCount(parentView): 7
```

This difference does not occur for ALL views, but it occurs for... enough that this will crash on basically ~every screen, at least on navigation when all views are removed.

Theory about why this is happening: some ViewGroup types compute childCount differently, especially if we do some sort of custom child management for some view type? By coercing to `T` which the ViewManager does, we call getChildCount on the correct class type. This is just a hypothesis, though. But the failing views are all `View`s and it does look like `ReactClippingViewManager` has custom `getChildCount` logic, so that's likely the answer.

There's no such thing as an easy diff!

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D21750097

fbshipit-source-id: 3d87d8f629a0c12101658050e57e09242dfc2a8c
2020-05-27 16:03:56 -07:00
Héctor RamosandFacebook GitHub Bot 97d3abf982 Do not use variable types for array elements
Summary:
When a property returns an array type, use the actual element type when generating structs and inlines.

Changelog: [Internal]

Reviewed By: TheSavior

Differential Revision: D21651351

fbshipit-source-id: 14cadf209c38a301c9c65fcaadd8a292c1936349
2020-05-27 14:34:14 -07:00
Joshua GrossandFacebook GitHub Bot bd314168dd Reset RootView ID when root view is detached from view hierarchy
Summary:
I have a theory that T53114059 can be caused by (1) other crashes, and/or (2) reloads. Clear out the ID of a RootView when it is detached.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D21732066

fbshipit-source-id: 5e607f34cf42ca26bdf199d5d3024fd49a60dc1e
2020-05-27 13:39:50 -07:00
Emily JanzerandFacebook GitHub Bot 0a12f3ea77 Always return an EventDispatcher in bridgeless mode
Summary:
This changes how we access the EventDispatcher from the FabricUIManager in bridgeless mode.

Currently, we have implemented a similar API to what we use for Fabric (used in UIManagerHelper): `BridgelessReactContext.getJSIModule(UIManager).getEventDispatcher()`. However, `getJSIModule` does not have a nullable return type, which means that we have to throw an exception if the UIManager can't be found - if, for example, the instance is not initialized yet (or has been destroyed). This is causing crashes when a view tries to access the EventDispatcher before the instance is initialized, which takes longer for Venice because we include JS bundle loading as part of initialization (we may need to revisit that).

Ideally, we'd like to create a first-class API for `getEventDispatcher()`, and make sure that it never crashes if the instance is destroyed, because we don't care if JS events aren't delivered at that point. However, there are some obstacles to making this change for the bridge - mostly related to avoiding circular dependencies between the bridge module and the uimanager module. (Also, this might be a behavior change for the bridge, because I think we currently start queueing events before it's initialized? and product code might be relying on that).

Reviewed By: mdvacca

Differential Revision: D21672949

fbshipit-source-id: a38e96cd40c6f70124b7ca2a5c9722988fe7fcf4
2020-05-27 12:16:21 -07:00
Christoph NakazawaandFacebook GitHub Bot fd97e955f8 Upgrade to Babel 7.10
Summary:
See https://github.com/babel/babel/releases/tag/v7.10.0 for changes

It includes a change I asked the Babel team for as they have been wrapping object spread calls with lots of extends call for spec compliance, but that only matters when you have side-effectful getters that affect the rest of the objects in the spread call and are order dependent. We should not be depending on such behavior in FB code so we can use loose mode and benefit from the app size wins.

Changelog: [Internal]

Reviewed By: motiz88

Differential Revision: D21738344

fbshipit-source-id: 5eeff47481e474bb41183119d990692b31751dd5
2020-05-27 08:20:10 -07:00
Jacek BurysandFacebook GitHub Bot c8fed9e385 Move TimePickerAndroid to FB internal
Summary:
Moving TimePickerAndroid to FB internal.

Changelog:
[Android][Changed] - Moved TimePickerAndroid to FB internal.

Reviewed By: cpojer

Differential Revision: D21504128

fbshipit-source-id: 400c6ee7cff96a0d6b4205f7806ef8951b611b8c
2020-05-27 03:40:35 -07:00
Joshua GrossandFacebook GitHub Bot 1a77943e8b Better error message when crashing because of an invalid Remove operation
Summary:
Error messages like P131885276 don't help debugging, even when all mount instructions are logged to logcat. This log would help identify the incorrect mount instruction.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D21735940

fbshipit-source-id: 16ff315c11ccafdd75d0ad9c7c60b7be2cd73202
2020-05-26 23:31:37 -07:00
Joshua SelboandFacebook GitHub Bot 6a78b32878 Migrate react-native Android tests to Robolectric v4 (#28927)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/28927

Changelog:
[Android] [Changed] Test Modernization

Reviewed By: mdvacca

Differential Revision: D21598788

fbshipit-source-id: 6fd9c30220d6d69cc68f13bf1f5ad5a4bc2b039a
2020-05-26 20:38:43 -07:00
Rick HanlonandFacebook GitHub Bot 6f75065d82 Remove unused double key press code
Summary:
This was added in D3343907 June 1st 2016, disabled in D3428043 June 16, 2016 and never re-enabled.

Changelog: [Internal]

Reviewed By: shergin

Differential Revision: D21635227

fbshipit-source-id: db51dfb6271359bea7da34b4e2a71931fc7c2a63
2020-05-26 20:18:02 -07:00
Rick HanlonandFacebook GitHub Bot 6ff6a79dd9 Add new swizzle method RCTSwapInstanceMethodWithBlock
Summary:
This diff adds a new swizzling method for replacing instance methods with blocks.

Changelog: [Internal]

Reviewed By: shergin

Differential Revision: D21635131

fbshipit-source-id: c8061817bed66dad160efffee5a13c8714134540
2020-05-26 20:18:01 -07:00
Joshua GrossandFacebook GitHub Bot 8b2eb3766b C++ LayoutAnimations: solve crash when "animating" virtual views
Summary:
Index adjustment doesn't work if virtual views are inserted, because those don't actually result in the view hierarchy being mutated, as such.

Add an Android-specific check to solve the crash.

I don't love adding platform-specific checks here, so I'm considering wrapping this logic in a platform-specific class, so that logic lives outside of the core of LayoutAnimations and entirely in platform code.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D21727805

fbshipit-source-id: 5af2cf479beaa4d0e9d94ea16ac989c4268920f8
2020-05-26 16:12:03 -07:00
Emily JanzerandFacebook GitHub Bot 68c0eddb71 Split EventDispatcher into interface and impl (#28983)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/28983

Creating an interface for EventDispatcher so I can implement it from a dummy/no-op EventDispatcher to use in bridgeless mode when the instance isn't alive.

Changelog: [Android] [Changed] Renamed EventDispatcher to EventDispatcherImpl and created EventDispatcher interface; calls to EventDispatcher contstructor need to be updated

Reviewed By: makovkastar

Differential Revision: D21695401

fbshipit-source-id: 46066a467efcf03a5f484bb9fb58c662d46a2c4e
2020-05-26 14:36:13 -07:00