Commit Graph
13625 Commits
Author SHA1 Message Date
Saikat GuhaandGitHub 098d4ecc68 DevTools: Handle restricted browser pages properly like new tab page, extensions page etc(only chrome and edge for now) (#20023) 2020-10-14 13:59:05 -04:00
Dan AbramovandGitHub f06427fe47 Fixture: Legacy JSX Runtimes (#20012)
* Fixture: Legacy JSX Runtimes

* Add more comments
2020-10-14 18:28:03 +01:00
Brian VaughnandGitHub 03065f533b DevTools always overrides the dispatcher when shallow rendering (#20011)
This is done so that any effects scheduled by the shallow render are thrown away.

Unlike the code this was forked from (in ReactComponentStackFrame) DevTools should override the dispatcher even when DevTools is compiled in production mode, because the app itself may be in development mode and log errors/warnings.
2020-10-14 13:19:47 -04:00
RickyandGitHub 91e223fb55 Deprecate old test script commands (#19893)
* Deprecate old test script commands

* Update PR template test script

* Add test-stable and test-www-classic

* Update circle test names

* Rename test-www-classic to test-classic

* Missed some job renames

* Missed some more job renames
2020-10-14 08:54:34 -04:00
ee0b42b19b handled a missing suspense fiber when suspense is filtered on the profiler (#19987)
Co-authored-by: Brian Vaughn <[email protected]>
2020-10-13 13:38:58 -04:00
Brian VaughnandGitHub 45099227df Fix bad null check in DevTools highlight code (#20010) 2020-10-13 13:08:12 -04:00
c766f6c82d [DevTools] Add DevTools forked Feature flags (#18994)
Also resolve an uncaught error in extension build (#18843).

Co-authored-by: Brian Vaughn <[email protected]>
Co-authored-by: Brian Vaughn <[email protected]>
2020-10-12 13:07:10 -04:00
38a87c60c8 Updated OVERVIEW.md to the new infos required when adding a new leaf node to the tree (#19981)
Co-authored-by: Idriss AITHAFID <[email protected]>
2020-10-09 09:29:30 -04:00
Saikat GuhaandGitHub 7e360ca2c2 Update outdated links and fix two broken links (#19985)
* update all facebook.github.io links

* facebookincubator links : update some outdated links and fix two other broken links where they are actually the latest updated ones
2020-10-09 02:56:30 +01:00
Sebastian MarkbågeandGitHub ca766e61e6 [Flight] Don't warn for key, but error for ref (#19986)
* Improve error message by expanding the object in question

* Don't warn for key/ref getters

* Error if refs are passed in server components or to client components
2020-10-08 17:02:23 -07:00
Dan AbramovandGitHub 8285823a6d Enable eager listeners statically (#19983) 2020-10-08 19:32:28 +01:00
Sebastian MarkbågeandGitHub 58fb6b2f98 [Flight] Add Runtime Errors for Non-serializable Values (#19980)
* Error on encoding non-serializable props

* Add DEV time warnings to enforce that values are plain objects
2020-10-08 11:11:15 -07:00
4c53d9f7f6 updating the informations needed when adding a root node to a tree in react-devtools overview doc (#19979)
Co-authored-by: Idriss AITHAFID <[email protected]>
2020-10-08 08:46:15 -04:00
Shivam SandbhorandGitHub 67ed2649ea Treat <time> tag as a normal HTML tag. (#19951)
<time> tag has been supported by Chrome since Chrome 62.0.
Remove workarounds which were in place to avoid friction with
versions before Chrome 62.

Signed-off-by: Shivam Sandbhor <[email protected]>
2020-10-06 03:15:32 +01:00
Brian VaughnandGitHub b3097929ff Revert "Temporarily disable Profiler commit hooks flag (#19900)" (#19960) 2020-10-05 15:49:52 -04:00
Brian VaughnandGitHub 04f166a5e1 Removed skip-error-boundaries modifications from old fork (#19961)
Technically this change is unnecessary, since the feature is controlled by a flag, but since we decided not to ship this in v17– I'm going to remove it for now entirely.
2020-10-05 15:49:44 -04:00
Brian VaughnandGitHub ac3a932add Revert "DevTools: Improve browser extension iframe support (#19854)" (#19959)
This reverts commit dbc0833791.
2020-10-05 09:44:08 -04:00
Paul DoyleandGitHub 0ed319adbd Remove unnecessary error overriding in (#19949) 2020-10-02 22:10:46 +01:00
Brian VaughnandGitHub a428611fb3 Debug tracing tests for CPU bound suspense (#19943) 2020-10-01 12:02:26 -04:00
Eugene MaslovichandGitHub 47c9cf09a4 Fix codestyle for typeof comparison (#19928) 2020-10-01 16:26:49 +01:00
John WilsonandGitHub 9b29ee4aea Fix(React DevTools) - prevent phishing attacks (#19934)
When a link opens a URL in a new tab with target="_blank", it is very simple for the opened page to change the location of the original page because the JavaScript variable window.opener is not null and thus "window.opener.location can be set by the opened page. This exposes the user to very simple phishing attacks.
2020-10-01 16:25:38 +01:00
Saikat GuhaandGitHub 10d7a4905d DevTools: Remove ReactJS.org version check "cheat" (#19939)
Remove dead code as facebook.github.io/react always redirects to reactjs.org, which has prod version of react. so removing the "cheat" (#19939)
2020-10-01 10:16:50 -04:00
Brian VaughnandGitHub b2284600a8 Temporarily disable Profiler commit hooks flag (#19900)
Temporarily disable Profiler commit hooks flag to verify it does not cause a regression.
2020-09-30 15:58:20 -04:00
Andrew ClarkandGitHub 0d2b89f95a Suspense for CPU-bound trees (#19936)
Adds a new prop to the Suspense component type,
`unstable_expectedLoadTime`. The presence of this prop indicates that
the content is computationally expensive to render.

During the initial mount, React will skip over expensive trees by
rendering a placeholder — just like we do with trees that are waiting
for data to resolve. That will help unblock the initial skeleton for the
new screen. Then we will continue rendering in the next commit.

For now, while we experiment with the API internally, any number passed
to `unstable_expectedLoadTime` will be treated as "computationally
expensive", no matter how large or small. So it's basically a boolean.
The reason it's a number is that, in the future, we may try to be clever
with this additional information. For example, SuspenseList could use
it as part of its heuristic to determine whether to keep rendering
additional rows.

Background
----------

Much of our early messaging and research into Suspense focused on its
ability to throttle the appearance of placeholder UIs. Our theory was
that, on a fast network, if everything loads quickly, excessive
placeholders will contribute to a janky user experience. This was backed
up by user research and has held up in practice.

However, our original demos made an even stronger assertion: not only is
it preferable to throttle successive loading states, but up to a certain
threshold, it’s also preferable to remain on the previous screen; or in
other words, to delay the transition.

This strategy has produced mixed results. We’ve found it works well for
certain transitions, but not for all them. When performing a full page
transition, showing an initial skeleton as soon as possible is crucial
to making the transition feel snappy. You still want throttle the nested
loading states as they pop in, but you need to show something on the new
route. Remaining on the previous screen can make the app feel
unresponsive.

That’s not to say that delaying the previous screen always leads to a
bad user experience. Especially if you can guarantee that the delay is
small enough that the user won’t notice it. This threshold is a called a
Just Noticeable Difference (JND). If we can stay under the JND, then
it’s worth skipping the first placeholder to reduce overall thrash.

Delays that are larger than the JND have some use cases, too. The main
one we’ve found is to refresh existing data, where it’s often preferable
to keep stale content on screen while the new data loads in the
background. It’s also useful as a fallback strategy if something
suspends unexpectedly, to avoid hiding parts of the UI that are already
visible.

We’re still in the process of optimizing our heuristics for the most
common patterns. In general, though, we are trending toward being more
aggressive about prioritizing the initial skeleton.

For example, Suspense is usually thought of as a feature for displaying
placeholders when the UI is missing data — that is, when rendering is
bound by pending IO.

But it turns out that the same principles apply to CPU-bound
transitions, too. It’s worth deferring a tree that’s slow to render if
doing so unblocks the rest of the transition — regardless of whether
it’s slow because of missing data or because of expensive CPU work.

We already take advantage of this idea in a few places, such as
hydration. Instead of hydrating server-rendered UI in a single pass,
React splits it into chunks. It can do this because the initial HTML
acts as its own placeholder. React can defer hydrating a chunk of UI as
long as it wants until the user interacts it. The boundary we use to
split the UI into chunks is the same one we use for IO-bound subtrees:
the <Suspense /> component.

SuspenseList does something similar. When streaming in a list of items,
it will occasionally stop to commit whatever items have already
finished, before continuing where it left off. It does this by showing a
placeholder for the remaining items, again using the same <Suspense />
component API, even if the item is CPU-bound.

Unresolved questions
--------------------

There is a concern that showing a placeholder without also loading new
data could be disorienting. Users are trained to believe that a
placeholder signals fresh content. So there are still some questions
we’ll need to resolve.
2020-09-30 12:57:33 -07:00
Brian VaughnandGitHub 3d79e2d973 Fix missing context to componentDidMount() when double-invoking lifecycles (#19935) 2020-09-30 15:56:19 -04:00
Brian VaughnandGitHub 5893954916 Refactor layout effect methods (#19895)
Commit phase durations (layout and passive) are stored on the nearest (ancestor) Profiler and bubble up during the commit phase. This bubbling used to be implemented by traversing the return path each time we finished working on a Profiler to find the next nearest Profiler.

This commit removes that traversal. Instead, we maintain a stack of nearest Profiler ancestor while recursing the tree. This stack is maintained in the work loop (since that's where the recursive functions are) and so bubbling of durations has also been moved from commit-work to the work loop.

This PR also refactors the methods used to recurse and apply effects in preparation for the new Offscreen component type.
2020-09-29 15:58:20 -04:00
Andrew ClarkandGitHub aaf1349882 Remove disableSchedulerTimeoutInWorkLoop flag (#19902)
We found and mitigated the root cause of the regression that led us to
temporarily revert this change. So now I'm un-reverting it.
2020-09-28 10:19:14 -07:00
Dmitriy KovalenkoandGitHub 15e9f5312a Improve wording for inline DevTools README.md (#19897) 2020-09-28 09:25:18 -04:00
Dan AbramovandGitHub ef86563b6f Create Synthetic Events Lazily (#19909) 2020-09-25 13:33:28 +01:00
Dan AbramovandGitHub 1671bc8c80 Remove Array.from() from hot path (#19908)
* Remove Array.from() from hot path

* Fix build

Don't declare block variables inside loops
2020-09-25 11:33:07 +01:00
Dan AbramovandGitHub d3cfbf7f40 Separate SyntheticEvent constructors to prevent deopts (#19907)
* Remove arguments from hot path

* Make SyntheticEvent subtypes monomorphic

* Maybe fix Flow?
2020-09-25 11:31:00 +01:00
Luna RuanandGitHub 824b26b998 offscreen double invoke effects (#19523)
This PR double invokes effects in __DEV__ mode.

We are thinking about unmounting layout and/or passive effects for a hidden tree. To understand potential issues with this, we want to double invoke effects. This PR changes the behavior in DEV when an effect runs from create() to create() -> destroy() -> create(). The effect cleanup function will still be called before the effect runs in both dev and prod. (Note: This change is purely for research for now as it is likely to break real code.)

**Note: The change is fully behind a flag and does not affect any of the code on npm.**
2020-09-24 13:42:17 -07:00
dbc0833791 DevTools: Improve browser extension iframe support (#19854)
Co-authored-by: Joel DSouza <[email protected]>
Co-authored-by: Damien Maillard <[email protected]>
Co-authored-by: Brian Vaughn <[email protected]>
2020-09-23 16:56:13 -04:00
Brian VaughnandGitHub 005bfc0b33 Fixed broken Profiler test (#19894) 2020-09-23 15:33:25 -04:00
Brian VaughnandGitHub 64a7842bea Profiler onRender only called when we do work (#19885)
If we didn't perform any work in the subtree, skip calling onRender.
2020-09-22 14:47:13 -04:00
7cb091e206 Don't consumer iterators while inspecting (#19831)
Co-authored-by: Brian Vaughn <[email protected]>
2020-09-22 14:23:20 -04:00
6802fcc319 Don't call onCommit et al if there are no effects (#19863)
* Don't call onCommit et al if there are no effects

Checks `subtreeFlags` before scheduling an effect on the Profiler.

* Fix failing Profiler tests

The change to conditionally call Profiler commit hooks only if updates were scheduled broke a few of the Profiler tests. I've fixed the tests by either:
* Adding a no-op passive effect into the subtree or
* Converting onPostCommit to onCommit

When possible, I opted to add the no-op passive effect to the tests since that that hook is called later (during passive phase) so the test is a little broader. In a few cases, this required adding awkward act() wrappers so I opted to go with onCommit instead.

Co-authored-by: Brian Vaughn <[email protected]>
2020-09-22 11:20:26 -07:00
Andrew ClarkandGitHub 7dfe3bd3f6 Consolidate commit phase hook functions (#19864)
There were a few pairs of commit phase functions that were almost
identical except for one detail. I've refactored them a bit to
consolidate their implementations:

- Lifted error handling logic when mounting a fiber's passive hook
effects to surround the entire list, instead of surrounding each effect.
- Lifted profiler duration tracking to surround the entire list.

In both cases, this matches the corresponding code for the layout phase.

The naming is still a bit of a mess but I'm not too concerned because
my next step is to refactor each commit sub-phase (layout, mutation)
so that we can store values on the JS stack. So the existing function
boundaries are about to change, anyway.
2020-09-22 11:16:27 -07:00
Dan Abramov 6f761cbec8 Release script: allow preparing RC from npm 2020-09-22 14:27:50 +01:00
E-Liang TanandGitHub a5a175f4a9 Add scheduling profiler deployment CI job (#19874)
* Add vercel to scheduling profiler dev deps
* Add vercel.json
* Add CD job
* Add CD setup instructions
2020-09-22 08:34:06 -04:00
Brian VaughnandGitHub d8d7ea4aa0 Improved DevTools context test harness (#19878) 2020-09-21 16:39:53 -04:00
E-Liang TanandGitHub 26125d64ef Enable building of DevTools and scheduling profiler in CI (#19691)
Re-enables building of main DevTools in CI and add new CI target for building the scheduling profiler.
2020-09-21 11:49:07 -04:00
Brian VaughnandGitHub bf3443e5e8 DevTools: Drop IE 11 support (#19875)
DevTools shared Babel config previously supported IE 11 to target Hermes (for the standalone backend that gets embedded within React Native apps). This targeting resulted in less optimal code for other DevTools targets though which did not need to support IE 11. This PR updates the shared config to remove IE 11 support by default, and only enables it for the standalone backend target.
2020-09-21 11:07:45 -04:00
Dan AbramovandGitHub a615525d81 Don't trigger lazy in DEV during element creation (#19871) 2020-09-21 16:04:49 +01:00
Gustavo SaianiandGitHub a5f1fdc526 Use single quotes in getComponentName return (#19873) 2020-09-21 13:35:21 +01:00
Andrew ClarkandGitHub 9cdc901863 Use Passive flag to schedule onPostCommit (#19862)
Instead of calling `onPostCommit` in a separate phase, we can fire
them during the same traversal as the rest of the passive effects.

This works because effects are executed depth-first. So by the time we
reach a Profiler node, we'll have already executed all the effects in
its subtree.
2020-09-18 13:02:26 -07:00
Brian VaughnandGitHub 692f18378d Improve DevTools editing interface (#19774)
* Improve DevTools editing interface

This commit adds the ability to rename or delete keys in the props/state/hooks/context editor and adds tests to cover this functionality. DevTools will degrade gracefully for older versions of React that do not inject the new reconciler rename* or delete* methods.

Specifically, this commit includes the following changes:
* Adds unit tests (for modern and legacy renderers) to cover overriding props, renaming keys, and deleting keys.
* Refactor backend override methods to reduce redundant Bridge/Agent listeners and methods.
* Inject new (DEV-only) methods from reconciler into DevTools to rename and delete paths.
* Refactor 'inspected element' UI components to improve readability.
* Improve auto-size input to better mimic Chrome's Style editor panel. (See this Code Sandbox for a proof of concept.)

It also contains the following code cleanup:
* Additional unit tests have been added for modifying values as well as renaming or deleting paths.
* Four new DEV-only methods have been added to the reconciler to be injected into the DevTools hook: overrideHookStateDeletePath, overrideHookStateRenamePath, overridePropsDeletePath, and overridePropsRenamePath. (DevTools will degrade gracefully for older renderers without these methods.)
* I also took this as an opportunity to refactor some of the existing code in a few places:
  * Rather than the backend implementing separate methods for editing props, state, hooks, and context– there are now three methods: deletePath, renamePath, and overrideValueAtPath that accept a type argument to differentiate between props, state, context, or hooks.
  * The various UI components for the DevTools frontend have been refactored to remove some unnecessary repetition.

This commit also adds temporary support for override* commands with mismatched backend/frontend versions:
* Add message forwarding for older backend methods (overrideContext, overrideHookState, overrideProps, and overrideState) to the new overrideValueAtPath method. This was done in both the frontend Bridge (for newer frontends passing messages to older embedded backends) and in the backend Agent (for older frontends passing messages to newer backends). We do this because React Native embeds the React DevTools backend, but cannot control which version of the frontend users use.
* Additional unit tests have been added as well to cover the older frontend to newer backend case. Our DevTools test infra does not make it easy to write tests for the other way around.
2020-09-18 11:07:18 -04:00
b9e6297d93 Enable source maps for DevTools production builds (#19773)
Co-authored-by: Brian Vaughn <[email protected]>
2020-09-18 10:07:22 -04:00
Brian VaughnandGitHub 9b5275b9a3 Revert "DevTools: Improve browser extension iframe support (#19827)" (#19852)
This reverts commit 216081fb1c.
2020-09-17 14:57:44 -04:00
Dan AbramovandGitHub c201f99bf1 Remove passive intervention flag (#19849) 2020-09-17 15:37:12 +01:00