Commit Graph
13882 Commits
Author SHA1 Message Date
Toru Kobayashi 8fa0ccca00 fix: use SharedArrayBuffer only when cross-origin isolation is enabled (#20831)
* fix: check cross-origin isolation for SharedArrayBuffer

* chore: remove unused a $FlowFixMe comment

* prettier
2021-02-17 16:43:25 -05:00
Dan Abramov 0991647921 Use setImmediate when available over MessageChannel (#20834)
* Move direct port access into a function

* Fork based on presence of setImmediate

* Copy SchedulerDOM-test into another file

* Change the new test to use shimmed setImmediate

* Clarify comment

* Fix test to work with existing feature detection

* Add flags

* Disable OSS flag and skip tests

* Use VARIANT to reenable tests

* lol
2021-02-17 21:00:42 +00:00
Andrew Clark e2fd460cca Bailout in sync task if work is not sync (#20813)
Because we don't cancel synchronous tasks, sometimes more than one
synchronous task ends up being scheduled. This is an artifact of the
fact that we have two different lanes that schedule sync tasks: discrete
and sync. So what can happen is that a discrete update gets scheduled,
then a sync update right after that. Because sync is encoded as higher
priority than discrete, we schedule a second sync task. And since we
don't cancel the first one, there are now two separate sync tasks.

As a next step, what we should do is merge InputDiscreteLane with
SyncLane, then (I believe) this extra bailout wouldn't be necessary,
because there's nothing higher priority than sync that would cause us to
cancel it. Though we may want to add logging to be sure.
2021-02-16 12:38:11 -08:00
Andrew Clark 9e8f3c8955 [CI] Use constant commit sha (#20828)
When running the publish workflow, either via the command line or
via the daily cron job, we should use a constant SHA instead of
whatever happens to be at the head of the main branch at the time the
workflow is run.

The difference is subtle: currently, the SHA is read at runtime,
each time the workflow is run. With this change, the SHA is read right
before the workflow is created and passed in as a constant parameter.

In practical terms, this means if a workflow is re-run via the CircleCI
web UI, it will always re-run using the same commit SHA as the original
workflow, instead of fetching the latest SHA from GitHub, which may
have changed.

Also avoids a race condition where the head SHA changes in between the
Next publish job and the Experimental publish job.
2021-02-16 08:31:24 -08:00
Andrew Clark 6f8843837c [CI] Publish to release channels sequentially (#20827)
npm will sometimes fail if you try to concurrently publish two different
versions of the same package, even if they use different dist tags.

So instead of publishing to the Next and Experimental channels
simultaneously, we'll do them one after the other.

If we did want to speed up these publish workflows, we could paralellize
by package instead of by release channel.
2021-02-15 22:04:13 -08:00
Andrew Clark 1a74726246 Add supportsMicrotasks to the host config (#20809)
* Add `supportsMicrotasks` to the host config

Only certain renderers support scheduling a microtask, so we need a
renderer specific flag that we can toggle. That way it's off for some
renderers and on for others.

I copied the approach we use for the other optional parts of the host
config, like persistent mode and test selectors.

Why isn't the feature flag sufficient?

The feature flag modules, confusingly, are not renderer-specific, at
least when running the our tests against the source files. They are
meant to correspond to a release channel, not a renderer, but we got
confused at some point and haven't cleaned it up.

For example, when we run `yarn test`, Jest loads the flags from the
default `ReactFeatureFlags.js` module, even when we import the React
Native renderer — but in the actual builds, we load a different feature
flag module, `ReactFeatureFlags.native-oss.js.` There's no way in our
current Jest load a different host config for each renderer, because
they all just import the same module. We should solve this by creating
separate Jest project for each renderer, so that the flags loaded when
running against source are the same ones that we use in the
compiled bundles.

The feature flag (`enableDiscreteMicrotasks`) still exists — it's used
to set the React DOM host config's `supportsMicrotasks` flag to `true`.
(Same for React Noop) The important part is that turning on the feature
flag does *not* affect the other renderers, like React Native.

The host config will likely outlive the feature flag, too, since the
feature flag only exists so we can gradually roll it out and measure the
impact in production; once we do, we'll remove it. Whereas the host
config flag may continue to be used to disable the discrete microtask
behavior for RN, because RN will likely use a native (non-JavaScript)
API to schedule its tasks.

* Add `supportsMicrotask` to react-reconciler README
2021-02-12 13:13:49 -08:00
Andrew Clark 696e736be1 Warn if static flag is accidentally cleared (#20807)
* Warn if static flag is accidentally cleared

"Static" fiber flags are flags that are meant to exist for the lifetime
of a component. It's really important not to accidentally reset these,
because we use them to decide whether or not to perform some operation
on a tree (which we can do because they get bubbled via `subtreeFlags)`.

We've had several bugs that were caused by this mistake, so we actually
don't rely on static flags anywhere, yet. But we'd like to.

So let's roll out this warning and see if it fires anywhere. Once we
can confirm that there are no warnings, we can assume that it's safe
to start using static flags.

I did not wrap it behind a feature flag, because it's dev-only, and we
can use our internal warning filter to hide this from the console.

* Intentionally clear static flag to test warning

* ...and fix it again
2021-02-11 14:20:46 -08:00
Andrew Clark 483358c38f Omit TransitionHydrationLane from TransitionLanes (#20802)
Follow up to #20793

I don't this makes any observable difference, but this is how it was
before so might as well be consistent just in case.
2021-02-10 22:07:19 -08:00
inokawa 78ec97d34a Fix typo (#20466) 2021-02-10 23:35:41 -05:00
Matt Wood 4c5275fec7 Fix typo in comment for react-devtools-shared (#20459) 2021-02-10 23:35:24 -05:00
Max Donchenko 67e8419823 Request to update email (#20533) 2021-02-10 23:34:07 -05:00
neroneroffy 6cdc35972d fix comments of markUpdateLaneFromFiberToRoot (#20546) 2021-02-10 23:26:26 -05:00
Andrew Clark 47dd9f4413 Remove fakeCallbackNode (#20799)
Don't need this, because sync tasks are never cancelled. We can do the
same thing we do for microtask callbacks.
2021-02-10 20:03:50 -08:00
Andrew Clark 114ab52953 Make remaining empty lanes Transition lanes (#20793)
Doesn't really have any effect now because we batch everything together
anyway but will allow for more parallelism once we support that.
2021-02-10 18:25:33 -06:00
Andrew Clark d3d2451a08 Use a single lane per priority level (#20791)
(Except transitions and retries.)

The idea is that the only priorities that benefit from multiple parallel
updates are the ones that might suspend: transitions and retries. All
other priorities, including the ones that are interruptible like
Continuous and Idle, don't need multiple lanes because it's better to
batch everything together.
2021-02-10 16:09:35 -08:00
Andrew Clark b593a6f778 CI job to check that forks are in sync (#20795)
We don't always keep the reconciler forks in sync (otherwise it we
wouldn't have forked it) but during periods when they are meant to be in
sync, we use this job to confirm there are no differences.
2021-02-10 16:09:20 -08:00
Andrew ClarkandRicky 9e9be6c6b3 Parallelize Flow in CI (#20794)
* Parallelize Flow in CI

We added more host configs recently, and we run all the checks in
sequence, so sometimes Flow ends up being the slowest CI job.

This splits the job across multiple processes.

* Fix environment variable typo

Co-authored-by: Ricky <rickhanlonii@gmail.com>

Co-authored-by: Ricky <rickhanlonii@gmail.com>
2021-02-10 17:54:58 -06:00
Andrew Clark eee874ce6e Cross-fork lint: Support named export declaration (#20784)
Noticed this didn't work when I ran `replace-fork` and a named export
declaration in ReactFiberReconciler was not properly fixed.
2021-02-10 11:01:52 -08:00
Andrew Clark 3b870b1e09 Lane enableTransitionEntanglement flag (#20775) 2021-02-10 00:25:39 -08:00
Andrew ClarkandRick Hanlon d1845ad0ff Default updates should not interrupt transitions (#20771)
The only difference between default updates and transition updates is
that default updates do not support suspended refreshes — they will
instantly display a fallback.

Co-authored-by: Rick Hanlon <rickhanlonii@gmail.com>
2021-02-10 00:00:24 -08:00
Andrew Clark 3499c343ab Apply #20778 to new fork, too (#20782)
* Apply #20778 to new fork, too

* Fix tests that use runWithPriority

Where possible, I tried to rewrite in terms of an idiomatic API.

For DOM tests, we should be dispatching an event with the desired
priority level.

For Idle updates (very unstable feature), probably need an unstable
API like ReactDOM.unstable_IdleUpdates.

Some of these fixes are not great, but we can replace them once we've
landed the more of our planned changes to the layering between
Scheduler, the reconciler, and the renderer.
2021-02-09 23:21:46 -08:00
Dan Abramov 3d10eca241 Move scheduler priority check into ReactDOM (#20778)
* Move scheduler priority check into ReactDOM

* TODO
2021-02-09 22:54:57 +00:00
Dan Abramov ad8211d96a Add more non-React events to the priority list (#20774)
* Add a test for mouseover being continuous

* Add more non-React events to the priority list
2021-02-09 22:04:23 +00:00
Dan Abramov d919e2c41c Add tests for non-React discrete events flushing in a microtask (#20772)
* Convert some old discrete tests to Hooks

I'm planning to copy paste so why not update them anyway.

* Copy paste discrete tests into another file

These are still using React events. I'll change that next.

* Convert the test to use native events
2021-02-09 19:56:15 +00:00
Dan Abramov 97fce318a6 Experiment: Infer the current event priority from the native event (#20748)
* Add the feature flag

* Add a host config method

* Wire it up to the work loop

* Export constants for third-party renderers

* Document for third-party renderers
2021-02-09 18:32:20 +00:00
Andrew Clark 6c526c5153 Don't shift interleaved updates to separate lane (#20681)
Now that interleaved updates are added to a special queue, we no longer
need to shift them into their own lane. We can add to a lane that's
already in the middle of rendering without risk of tearing.

See #20615 for more background.

I've only changed this in the new fork, and only behind the
enableTransitionEntanglements flag.

Most of this commit involves updating tests. The "shift-to-a-new" lane
trick was intentionally used in a handful of tests where two or more
updates need to be scheduled in different lanes. Most of these tests
were written before `startTransition` existed, and all of them were
written before transitions were assigned arbitrary lanes.

So I ported these tests to use `startTransition` instead, which is the
idiomatic way to mark an update as parallel.

I didn't change the old fork at all. Writing these tests in such a way
that they also pass in the old fork actually revealed a few flaws in the
current implementation regarding interrupting a suspended refresh
transition early, which is a good reminder that we should be writing our
tests using idiomatic patterns as much as we possibly can.
2021-02-09 00:03:07 -08:00
Dan Abramov 35f7441d37 Use Lanes instead of priority event constants (#20762) 2021-02-08 22:30:23 +00:00
Dan Abramov b4658f2daa Reduce some constant duplication (#20761)
* Reduce some constant duplication

* Alphabetize
2021-02-08 22:30:12 +00:00
Andrew Clark a014c915c7 Parallel transitions: Assign different lanes to consecutive transitions (#20672)
* Land enableTransitionEntanglement changes

Leaving the flag though because I plan to reuse it for additional,
similar changes.

* Assign different lanes to consecutive transitions

Currently we always assign the same lane to all transitions. This means
if there are two pending transitions at the same time, neither
transition can finish until both can finish, even if they affect
completely separate parts of the UI.

The new approach is to assign a different lane to each consecutive
transition, by shifting the bit to the right each time. When we reach
the end of the bit range, we cycle back to the first bit. In practice,
this should mean that all transitions get their own dedicated lane,
unless we have more pending transitions than lanes, which should
be rare.

We retain our existing behavior of assigning the same lane to all
transitions within the same event. This is achieved by caching the first
lane assigned to a transition, then re-using that one until the next
React task, by which point the event must have finished. This preserves
the guarantee that all transition updates that result from a single
event will be consistent.
2021-02-08 13:26:48 -08:00
Dan Abramov 77754ae618 Decouple event priority list from event name list (#20760)
* Remove some dead code

* Decouple event priority list from event name list

* Fix lint
2021-02-08 20:48:47 +00:00
Dan Abramov b5bac18219 Align event group constant naming with lane naming (#20744)
* Rename ContinuousEvent to DefaultEvent

* Rename UserBlockingEvent to ContinuousEvent
2021-02-08 17:48:31 +00:00
Andrew Clark bbb2ba8c8d sizebot: Combine stable and experimental results (#20753)
Because we have access to the artifacts in CI, we can read bundle sizes
directly from the filesystem, instead of the JSON files emitted by our
custom Rollup plugin.

This gives us some flexibility if we ever have artifacts that aren't
generated by Rollup, or if we rewrite our build script.

Personally, I also prefer to see the whole file path, instead of just
the name, because some of our names are repeated.

My immediate motivation, though, is because it gives us a way to merge
the separate "experimental" and "stable" size results. Instead
everything is reported in a single table and disambiguated by path.

I also added a section at the top that always displays the size impact
to certain critical bundles — right now, that's the React DOM production
bundles for each release channel. This section will also include any
size changes larger than 2%.

Below that is a section that is collapsed by default and includes all
size changes larger than 0.2%.
2021-02-06 12:57:11 -08:00
Andrew Clark 903384ab0c sizebot: Fix wrong order of base, head arguments (#20751)
The base and head arguments were flipped, so an n% decrease in bundle
size was instead reported as an n% increase.
2021-02-05 15:45:25 -08:00
Dan Abramov 4ecf11977c Remove the Fundamental internals (#20745) 2021-02-05 20:36:55 +00:00
Dan Abramov eeb1325b03 Fix UMD bundles by removing usage of global (#20743) 2021-02-05 17:13:42 +00:00
Andrew Clark 4e08fb10c9 Update release documentation (#20736)
Added information about automated prereleases
2021-02-04 13:20:49 -08:00
Ricky b12d0078a4 Fix codesandbox build command (#20731) 2021-02-04 11:24:07 -05:00
Andrew Clark a703c3f7e8 Fix cron syntax
Let's try this again?
2021-02-04 10:07:39 -06:00
Andrew Clark 365080f4f5 Autopublish prereleases using head of main branch
Instead of using pipeline parameter. Fixes copypasta from the other
workflow, which accepts the SHA parameter via an API call.
2021-02-04 09:34:12 -06:00
Andrew Clark f58ad2ad8e Auto-publish prereleases every weekday (#20733)
Sets up a cron trigger to publish prereleases at 16:00 UTC (11 am
Eastern, 8 am Pacific) on every weekday (Monday through Friday).
2021-02-03 21:08:34 -08:00
Andrew Clark c64d6d21be Implement CI job that publishes prereleases (#20732)
PR #20728 added a command to initiate a prerelease using CI, but it left
the publish job unimplemented. This fills in the publish job.

Uses an npm automation token for authorization, which bypasses the need
for a one-time password. The token is configured via CircleCI's
environment variable panel.

Currently, it will always publish the head of the main branch. If the
head has already been published, it will exit gracefully.

It does not yet support publishing arbitrary commits, though we could
easily add that. I don't know how important that use case is, because
for PR branches, you can use CodeSandbox CI instead. Or as a last
resort, run the publish script locally.

Always publishing from main is nice because it further incentivizes us
to keep main in a releasable state. It also takes the guesswork out of
publishing a prerelease that's in a broken state: as long as we don't
merge broken PRs, we're fine.
2021-02-03 20:57:31 -08:00
Andrew Clark 4c019585e8 Empty commit to replace "broken" head of main
Head commit had a "broken" (but not really) CircleCI job and CircleCI
doesn't give me a way to clear/restart it. So I'm doing this.
2021-02-03 20:33:27 -06:00
Ricky 3b02ae5cc6 Add silent to codesandbox config (#20730) 2021-02-03 18:53:07 -05:00
Andrew Clark c1cfa734fd Add command to publish preleases via CI (#20728)
```
yarn publish-prereleases
```

Script to trigger a CircleCI workflow that publishes preleases.

**The CI workflow doesn't actually publish yet; it just runs and logs
its inputs.**
2021-02-03 15:42:34 -08:00
Andrew Clark 00e38c80b2 Fallback if GitHub status is stuck as "pending" (#20729)
GitHub's status API is super flaky. Sometimes it reports a job as
"pending" even after it completes in CircleCI. If it's still pending
when we time out, return the build ID anyway. TODO: The location of the
retry loop is a bit weird. We should probably combine this function with
the one that downloads the artifacts, and wrap the retry loop around the
whole thing.
2021-02-03 15:33:46 -08:00
Andrew Clark 3be750eee9 Add --ci option to publish script (#20727)
When running in CI, the publish script will skip interactive prompts,
including the prompt for a one-time password.

Instead, CI will need to use an automation access token:
https://docs.npmjs.com/using-private-packages-in-a-ci-cd-workflow
2021-02-03 12:17:40 -08:00
Andrew Clark 85f489a129 Add publish workflow, triggerable via API request (#20726)
Adds a new CircleCI workflow, which I will use to publish prereleases
(`next` and `experimental`) for a given commit.

The CircleCI API doesn't yet support triggering a specific workflow, but
it does support triggering a pipeline. So as a workaround you can
triggger the entire pipeline and use parameters to disable everything
except the workflow you want. CircleCI recommends this workaround here:
https://support.circleci.com/hc/en-us/articles/360050351292-How-to-trigger-a-workflow-via-CircleCI-API-v2-

Eventually we can set this workflow to trigger on a cron schedule (once
per week, for example).
2021-02-03 12:17:29 -08:00
Andrew Clark 0935a1db3d Delete consolidateBundleSizes script (#20724)
This was ported to the new workflow by #20720
2021-02-03 08:45:29 -08:00
Andrew Clark b936ab660a Update sizebot to new workflow (#20719)
* build-combined: Fix bundle sizes path

* Output COMMIT_SHA in build directory

Alternative to parsing an arbitrary package's version number, or
its `build-info.json`.

* Remove CircleCI environment variable requirement

I think this only reason we needed this was to support passing any
job id to `--build`, instead of requiring the `process_artifacts` job.
And to do that you needed to use the workflows API endpoint, which
requires an API token.

But now that the `--commit` argument exists and automatically finds the
correct job id, we can just use that.

* Add CI job that gets base artifacts

Uses download-experimental script and places the base artifacts into
a top-level folder.

* Migrate sizebot to combined workflow

Replaces the two separate sizebot jobs (one for each channel, stable and
experimental) with a single combined job that outputs size information
for all bundles in a single GitHub comment.

I didn't attempt to simplify the output at all, but we should. I think
what I would do is remove our custom Rollup sizes plugin, and read the
sizes from the filesystem instead. We would lose some information about
the build configuration used to generate each artifact, but that can be
inferred from the filepath. For example, the filepath
`fb-www/ReactDOM-dev.classic.js` already tells us everything we need to
know about the artifact. Leaving this for a follow up.

* Move GitHub status check inside retry loop

The download script will poll the CircleCI endpoint until the build job
is complete; it should also poll the GitHub status endpoint if the
build job hasn't been spawned yet.

* Only run get_base_build on main branch
2021-02-03 08:29:51 -08:00
Brian Vaughn 2d025753e2 Remove --build flag from release scripts (#20723)
Also update instructions to match recent script changes.

Also add reproducible commit SHA to post download instructions to support publishing the Firefox DevTools extension.
2021-02-03 11:11:56 -05:00