Commit Graph
14459 Commits
Author SHA1 Message Date
Brian VaughnandGitHub 2ff67158c6 Replaced network.onRequestFinished() caching with network.getHAR() (#22285)
Replaced network.onRequestFinished() caching with network.getHAR() so that we can avoid redundantly (pre) caching JavaScript content. In the event that the HAR log doesn't contain a match, we'll fall back to fetching from the Network (and hoping for a cache hit from that layer).

I've tested both internally (internal Facebook DEV server) and externally (Code Sandbox) and it seems like this approach results in cache hits, so long as DevTools is opened when the page loads. (Otherwise it falls back to fetch().)
2021-09-10 15:11:18 -04:00
539291c8d3 update error message to include useLayoutEffect or useEffect on bad e… (#22279)
* update error message to include useLayoutEffect or useEffect on bad effect return

* Update packages/react-reconciler/src/ReactFiberCommitWork.new.js

Co-authored-by: Ricky <[email protected]>

* use existing import

Co-authored-by: Ricky <[email protected]>
2021-09-10 12:19:51 -04:00
Luna RuanandGitHub 605e66f5f4 [DevTools] Add React Devtools Extension Startup and File Structure to OVERVIEW.md (#22283) 2021-09-09 15:58:27 -07:00
Luna RuanandGitHub ea0827c348 [DevTools] Fix react-devtools-extension build error and react-devtools-inline's package.json (#22281) 2021-09-09 14:26:13 -07:00
Brian VaughnandGitHub 835acb2238 Revert Suspense cache Thenable.catch() change (#22280)
Reverts part of #22275 (adding .catch() to Thenables in Suspense caches) in response to #22275 (comment).

After taking another look with fresh eyes, I think I see the "uncaught error" issue I initially noticed was in checkForUpdate() (which did not pass an error handler to .then)
2021-09-09 15:26:41 -04:00
Brian VaughnandGitHub 0bfcef0315 Add named hooks support to react-devtools-inline (#22263)
This commit builds on PR #22260 and makes the following changes:
* Adds a DevTools feature flag for named hooks support. (This allows us to disable it entirely for a build via feature flag.)
* Adds a new Suspense cache for dynamically imported modules. (This allows a component to suspend while importing an external code chunk– like the hook names parsing code).
* DevTools supports a hookNamesModuleLoaderFunction param to import the hook names module. I wish this could be handles as part of the react-devtools-shared package, but I'm not sure how to configure Webpack (4) to serve the chunk from react-devtools-inline. This seemed like a reasonable workaround.

The PR also contains an additional unrelated change:
* Removes pre-fetch optimization (added in DevTools: Improve named hooks network caching #22198). This optimization was mostly only important for cases where sources needed to be re-downloaded, something which we can now avoid in most cases¹ thanks to using cached responses already loaded by the page. (I tested this locally on Facebook and this change has no negative performance impact. There is still some overhead from serializing the JS through the Bridge but that's constant between the two approaches.)

¹ The case where we don't benefit from cached responses is when DevTools are opened after the page has already loaded certain scripts. This seems uncommon enough that I don't think it justified the added complexity of prefetching.
2021-09-09 15:25:26 -04:00
Andrew ClarkandGitHub 9172fd4394 [Bugfix] Prevent infinite update loop caused by a synchronous update in a passive effect (#22277)
* Add test that triggers infinite update loop

In 18, passive effects are flushed synchronously if they are the
result of a synchronous update. We have a guard for infinite update
loops that occur in the layout phase, but it doesn't currently work for
synchronous updates from a passive effect.

The reason this probably hasn't come up yet is because synchronous
updates inside the passive effect phase are relatively rare: you either
have to imperatively dispatch a discrete event, like `el.focus`, or you
have to call `ReactDOM.flushSync`, which triggers a warning. (In
general, updates inside a passive effect are not encouraged.)

I discovered this because `useSyncExternalStore` does sometimes
trigger updates inside the passive effect phase.

This commit adds a failing test to prove the issue exists. I will fix
it in the next commit.

* Fix failing test added in previous commit

The way we detect a "nested update" is if there's synchronous work
remaining at the end of the commit phase.

Currently this check happens before we synchronously flush the passive
effects. I moved it to after the effects are fired, so that it detects
whether synchronous work was scheduled in that phase.
2021-09-09 08:14:30 -07:00
Brian VaughnandGitHub a4adb8b5e2 DevTools Suspense cache cleanup (#22275) 2021-09-09 09:28:17 -04:00
Sebastian SilbermannandGitHub 987c23436d Test bad useEffect return value with noop-renderer (#22258)
* Test bad useEffect return value with noop-renderer

* Use previous "root"-approach

Tests should now be invariant under variants

* Add same test for layout effects
2021-09-08 18:58:53 -04:00
salazarmandGitHub 2c8f8b5370 Detect subscriptions wrapped in startTransition (#22271)
* Detect subscriptions wrapped in startTransition
2021-09-08 17:01:09 -04:00
Andrew Clark e828491992 Remove duplicate test
Accidentally committed two copies of this test during a rebase.
2021-09-08 11:50:21 -04:00
Dan AbramovandGitHub 4f9a4a40bf Reorder VARIANT feature flags (#22266)
* Move variant tests up

* Add a comment
2021-09-07 23:28:38 +01:00
Riley ShawandGitHub 33abc079fc Fix #21972: Add onResize event to video elements (#21973)
* Fix #21972: Add `onResize` event to video elements

This is a simple fix for #21972 that adds support for the `onResize` media event.

I created a separate `videoEventTypes` array since I doubt anyone will want to add `onResize` to an audio event. It would simplify the code a bit to just add `resize` to the `mediaEventTypes` array, if that’s preferred.

Pre-commit checklist ([source](https://reactjs.org/docs/how-to-contribute.html#sending-a-pull-request))

✅ Fork the repository and create your branch from `main`.
✅ Run `yarn` in the repository root.
✅ If you’ve fixed a bug or added code that should be tested, add tests!
✅ Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development.
✅ Run `yarn test --prod` to test in the production environment.
✅ If you need a debugger, run `yarn debug-test --watch TestName`, open chrome://inspect, and press “Inspect”.
✅ Format your code with prettier (`yarn prettier`).
✅ Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files.
✅ Run the Flow typechecks (`yarn flow`).
✅ If you haven’t already, complete the CLA.

* Consolidate `videoEventTypes` array into `mediaEventTypes`
2021-09-07 23:28:19 +01:00
Dan AbramovandGitHub 26e7082195 Adjust consoleManagedByDevToolsDuringStrictMode feature flag (#22253) 2021-09-07 19:51:12 +01:00
Andrew ClarkandGitHub 98970f9fe8 Add useSyncExternalStore to react-debug-tools (#22240)
Adds support for useSyncExternalStore to react-debug-tools, which in
turn adds support for React Devtools.

Test plan: I added a test to ReactHooksInspectionIntegration, based on
existing one for useMutableSource.
2021-09-07 10:58:20 -07:00
Andrew ClarkandGitHub 0643562073 Remove state queue from useSyncExternalStore (#22265)
The userspace shim of useSyncExternalStore uses a useState hook because
it's the only way to trigger a re-render. We don't actually use the
queue to store anything, because we read the current value directly
from the store.

In the native implementation, we can schedule an update on the fiber
directly, without the overhead of a queue.
2021-09-07 10:27:01 -07:00
Andrew ClarkandGitHub 87cd3851a4 Implement useSyncExternalStore in Fiber (#22239)
This adds an initial implementation of useSyncExternalStore to the
fiber reconciler. It's mostly a copy-paste of the userspace
implementation, which is not ideal but is a good enough starting place.

The main change we'll want to make to this native implementation is to
move the tearing checks from the layout phase to an earlier, pre-commit
phase so that code that runs in the commit phase always observes a
consistent tree.

Follow-ups:

- Implement in Fizz
- Implement in old SSR renderer
- Implement in react-debug-hooks
2021-09-07 10:22:05 -07:00
Andrew ClarkandGitHub 4756f74405 Wire up the native API for useSyncExternalStore (#22237)
Adds useSyncExternalStore to the internal dispatcher, and exports
the native API from the React package without yet implementing it.
2021-09-07 10:20:24 -07:00
salazarmandGitHub 3bbc914d6f Add warning and test for useSyncExternalStore when getSnapshot isn't cached (#22262)
* add warning and test

* Wrap console error in __DEV__ flag

* prettier
2021-09-07 09:08:33 -07:00
Brian VaughnandGitHub b37e1bd4aa Moved named hooks code (and tests) from react-devtools-extensions to react-devtools-shared (#22260) 2021-09-07 11:44:49 -04:00
JuanandGitHub f8cddb7b60 [DevTools] Only call originalPositionFor once (#22181) 2021-09-07 10:39:55 -04:00
Dan AbramovandGitHub 18d550f4dd Update PULL_REQUEST_TEMPLATE.md 2021-09-07 07:54:34 +01:00
fc5d1f8f5c [package:react-dom] updateREADME's Class Component to Function Component (#21829)
* [package:react-dom] updateREADME's Class Component to Function Component

* Update README.md

Co-authored-by: Dan Abramov <[email protected]>
2021-09-06 21:23:13 +01:00
ddfdff2b03 break up import keyword to avoid being accidentally parsed as dynamic import statement in external code (#21918)
Co-authored-by: zhengjianhua <[email protected]>
2021-09-06 21:20:33 +01:00
Ikko AshimineandGitHub 784d3a62bb Fix typo in ReactUpdatePriority-test.js (#21958)
continous -> continuous
2021-09-06 21:16:05 +01:00
Dan AbramovandGitHub dac79c2f44 Build ReactDOMServer on CodeSandbox CI (#22255) 2021-09-06 21:00:36 +01:00
372a0834f4 feat(eslint-plugin-react-internal): support ESLint 8.x (#22249)
Co-authored-by: Dan Abramov <[email protected]>
2021-09-06 20:42:40 +01:00
Dan AbramovandGitHub b9263bbcc0 Update PULL_REQUEST_TEMPLATE.md 2021-09-06 20:36:46 +01:00
Dan AbramovandGitHub 771a5f97d1 Update PULL_REQUEST_TEMPLATE.md 2021-09-06 20:36:24 +01:00
Michaël De BoeyandGitHub 9afdb25cea feat(eslint-plugin-react-hooks): support ESLint 8.x (#22248) 2021-09-06 20:17:51 +01:00
285136203e Add aria-description to the list of known ARIA attributes (#22142)
* Update validAriaProperties.js

https://w3c.github.io/aria/#aria-description is a valid aria property.

* Sort alphabetically

Co-authored-by: Dan Abramov <[email protected]>
2021-09-06 20:12:51 +01:00
Kausik S SandGitHub f17d6e52c7 Typo fixed (#22171) 2021-09-06 20:05:15 +01:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
e8dd88d8b2 Bump tar from 5.0.5 to 5.0.11 (#22223)
Bumps [tar](https://github.com/npm/node-tar) from 5.0.5 to 5.0.11.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v5.0.5...v5.0.11)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-06 20:03:12 +01:00
Konstantin PopovandGitHub 4395fe8964 Fix typo in ReactDOMServerFormatConfig.js (#22203)
Fix typo:

TOOD -> TODO
2021-09-06 19:58:46 +01:00
Andrew ClarkandGitHub 98b6e513c3 Initial shim of useSyncExternalStore (#22211)
This sets up an initial shim implementation of useSyncExternalStore,
via the use-sync-external-store package. It's designed to mimic the
behavior of the built-in API, but is backwards compatible to any version
of React that supports hooks.

I have not yet implemented the built-in API, but once it exists, the
use-sync-external-store package will always prefer that one. Library
authors can depend on the shim and trust that their users get the
correct implementation.

See https://github.com/reactwg/react-18/discussions/86 for background
on the API.

The tests I've added here are designed to run against both the shim and
built-in implementation, using our variant test flag feature. Tests that
only apply to concurrent roots will live in a separate suite.
2021-09-01 17:52:38 -07:00
Luna RuanandGitHub 7bea34f930 React DevTools 4.17.0 -> 4.18.0 (#22234) 2021-09-01 13:39:36 -07:00
Luna RuanandGitHub 2b2b40e6d8 [DevTools] Fix Issue in release script where commits for the last DevTools release are undefined #22233 2021-09-01 12:56:39 -07:00
Luna RuanandGitHub 993e6c6567 remove dist folder in release script for standalone and inline before building (#22232) 2021-09-01 12:16:00 -07:00
Luna RuanandGitHub 95ac499b32 Add consoleManagedByDevToolsDuringStrictMode feature flag in React Reconciler (#22196) 2021-09-01 11:56:52 -07:00
Brian VaughnandGitHub b3884e22b2 DevTools: Improve named hooks network caching (#22198)
While testing the recently-launched named hooks feature, I noticed that one of the two big performance bottlenecks is fetching the source file. This was unexpected since the source file has already been loaded by the page. (After all, DevTools is inspecting a component defined in that same file.)

To address this, I made the following changes:
- [x] Keep CPU bound work (parsing source map and AST) in a worker so it doesn't block the main thread but move I/O bound code (fetching files) to the main thread.
- [x] Inject a function into the page (as part of the content script) to fetch cached files for the extension. Communicate with this function using `eval()` (to send it messages) and `chrome.runtime.sendMessage()` to return its responses to the extension).

With the above changes in place, the extension gets cached responses from a lot of sites- but not Facebook. This seems to be due to the following:
* Facebook's response headers include [`vary: 'Origin'`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary).
* The `fetch` made from the content script does not include an `Origin` request header.

To reduce the impact of cases where we can't re-use the Network cache, this PR also makes additional changes:
- [x] Use `devtools.network.onRequestFinished` to (pre)cache resources as the page loads them. This allows us to avoid requesting a resource that's already been loaded in most cases.
- [x] In case DevTools was opened _after_ some requests were made, we also now pre-fetch (and cache in memory) source files when a component is selected (if it has hooks). If the component's hooks are later evaluated, the source map will be faster to access. (Note that in many cases, this prefetch is very fast since it is returned from the disk cache.)

With the above changes, we've reduced the time spent in `loadSourceFiles` to nearly nothing.
2021-09-01 14:10:07 -04:00
Luna RuanandGitHub 95c476cb73 Add consoleManagedByDevToolsDuringStrictMode feature flag in DevTools #22215 2021-08-30 15:16:53 -07:00
Luna RuanandGitHub 13b3f255f8 [DevTools] Throw error in console without interfering with logs (#22175) 2021-08-30 14:37:49 -07:00
Luna RuanandGitHub 40d56fb64b added react native feature flags (#22199)
lunaruan commented 3 days ago • 
This PR adds separate DevTools feature flag configurations for react-devtools-core. It also breaks the builds down into facebook specific and open source flags so we can experiment in React Native.

Tested yarn build:standalone, yarn build:backend, yarn build:standalone:fb, and yarn build:backend:fb and inspected the output to make sure each package used the correct feature flags (the first two use core-oss and the latter two use fb-oss.
2021-08-30 14:12:52 -07:00
Sebastian SilbermannandGitHub 5615429662 devtools: Don't display hook index of useContext (#22200) 2021-08-30 15:44:12 -04:00
Andrew ClarkandGitHub b3ec21cdcd Set up use-sync-external-store package (#22202)
This package will be a shim for the built-in useSyncExternalStore API
(not yet implemented).
2021-08-28 13:57:47 -07:00
Matt HargettandGitHub 92e6c99f3f Fix a string interpolation typo in ReactHooks test (#22174) 2021-08-26 15:35:06 -04:00
JuanandGitHub 2554f0d08f [DevTools] Add utils for perfomance marks (#22180) 2021-08-26 13:05:15 -04:00
Brian VaughnandGitHub a7b3062003 Add performance marksf or individual fetch() requests (#22176) 2021-08-26 09:19:00 -04:00
Luna RuanandGitHub 87a1f82ef2 Console Logging for StrictMode Double Rendering (#22030)
React currently suppress console logs in StrictMode during double rendering. However, this causes a lot of confusion. This PR moves the console suppression logic from React into React Devtools. Now by default, we no longer suppress console logs. Instead, we gray out the logs in console during double render. We also add a setting in React Devtools to allow developers to hide console logs during double render if they choose.
2021-08-25 15:35:38 -07:00
Brian VaughnandGitHub 673d3256bd Added performance timings to DevTools named hooks parsing (#22173) 2021-08-25 15:39:15 -04:00