Commit Graph

1315 Commits

Author SHA1 Message Date
Árni Hermann Reynisson a352b94f57 Give context aware message if markup reuse fails
The context is an extra message with comparison of where server and
client markup started to differ.
2014-12-01 10:15:07 +00:00
Jim d42b285b0c Monitoring code use of cloneWithProps 2014-11-26 16:29:09 -08:00
Paul O’Shannessy 45a19a290c Merge pull request #2553 from mhuggins/headers-attribute
Permit th `headers` attribute
2014-11-26 11:15:21 -08:00
Paul O’Shannessy c48b877253 Merge pull request #2596 from sebmarkbage/rce
reactComponentExpect expects itself
2014-11-26 11:10:00 -08:00
Jim 90d75ab099 Warn if context values differ, related to issue #2112 2014-11-25 16:44:09 -08:00
Jim 3a8fb5fc1e Merge pull request #2597 from jsfb/render-into-document
Replaced document.createElement with ReactTestUtil
2014-11-25 15:35:26 -08:00
Paul O’Shannessy b7b74b7efe Fix lint warnings, style fixups
Followup work for recent PRs
2014-11-25 15:06:30 -08:00
Jim 89fafad255 Replaced document.createElement with ReactTestUtils.renderIntoDocument where container was not subsequently utilized.
Fixes #1250
2014-11-25 12:06:22 -08:00
Sebastian Markbage a530f1c379 reactComponentExpect expects itself
This was a bug when reactComponentExpectInternal was separated from
the normal reactComponentExpect flow.
2014-11-24 18:48:41 -08:00
Sebastian Markbåge 47e18c3ce6 Merge pull request #2593 from sebmarkbage/mountImage
Add additional field for ART reconciler
2014-11-24 17:08:13 -08:00
Sebastian Markbage 61349eb5a6 Add additional field for ART reconciler
ART, just like MultiChild adds an expando property to manage it's diffing
state. This is ugly and bad. We should be moving this state outside the
component for use by the diffing algorithm. This state is not needed by
components nested in composites, and varies by diffing algorithm.

It sucks that I have to add it to every component just to support ART,
but that's the quickest solution, other than disabling preventExtensions.

At least now we know that it sucks.
2014-11-24 17:02:11 -08:00
Jim 9f7901fe1d Use warning module for context warning instead of invoking console.warn and monitorCodeUse directly. Depends on https://phabricator.fb.com/D1695279 2014-11-24 13:24:56 -08:00
Ben Alpert 582bc932e5 Merge pull request #2583 from spicyj/style-example
Add example for how to use `style` properly
2014-11-21 14:27:32 -08:00
Ben Alpert 1c5443175c Add example for how to use style properly
Test Plan: jest
2014-11-21 12:10:59 -08:00
Ben Alpert c6ed9df7f3 Merge pull request #2582 from spicyj/rendercomponent
Finish renaming renderComponent -> render
2014-11-21 11:54:36 -08:00
Ben Alpert d4e32a7b2c Finish renaming renderComponent -> render
Test Plan: jest
2014-11-20 23:07:58 -08:00
Ben Alpert c4b9b938cf Update variable name and doc type to be accurate
Test Plan: Crossed fingers.
2014-11-20 23:03:03 -08:00
Sebastian Markbåge 68ba3b6d18 Merge pull request #2567 from sebmarkbage/childrenreconciler
Separate Child Reconciliation Step from Diffing
2014-11-20 11:48:54 -08:00
Sebastian Markbage 26ea341870 Separate Child Reconciliation Step from Diffing
This separates the reconciliation step of children into a separate module.
This is the first step towards prerendering.

The stateful instances are reconciled and put into a "rendered children"
set. Updates creates a new of these sets. These two sets are then diffed
to create insert/move/remove operations on the set.

The next step is to move the ReactChildReconciler step to before the
native DOM component. That way it's possible to rely on child
reconciliation without relying on diffing.
2014-11-20 11:45:02 -08:00
Jim 7768d91363 Removed context paremeter to renderToString/renderToStaticMarkup. 2014-11-19 15:16:23 -08:00
yungsters fc7cf2ff63 Replace mountDepth with isTopLevel
Summary:
After #2570, `mountDepth` is only used to enforce that `setProps` and `replaceProps` is only invoked on the top-level component. This replaces `mountDepth` with a simpler `isTopLevel` boolean set by `ReactMount` which reduces the surface area of the internal API and removes the need to thread `mountDepth` throughout React core.

Reviewers: @sebmarkbage @zpao

Test Plan:
Ran unit tests successfully:

```
npm run jest
```
2014-11-19 13:13:08 -08:00
yungsters c7fd626b1f Summary:
Currently, `ReactUpdates` updates dirty components in increasing order of mount depth. However, mount depth is only relative to the component passed into `React.render`. This breaks down for components that invoke `React.render` as an implementation detail because the child components will be updated before the parent component.

This fixes the problem by using the order in which components are mounted (instead of their depth). The mount order transcends component trees (rooted at `React.render` calls).

Reviewers: @sebmarkbage @zpao

Test Plan:
Ran unit tests successfully:

```
npm run jest
```
2014-11-19 12:51:55 -08:00
Sebastian Markbage 13ed0317fa Remove some invariants and deadcode
These are not necessary if we enable type checks. Static or dynamic.

They're distracting my greppability.

Also, some dead code in shallow rendering.
2014-11-18 13:04:56 -08:00
Timothy Yung df87ea1fa6 Merge pull request #2465 from yungsters/perf
Preserve Implicit Method Names
2014-11-18 12:51:08 -08:00
yungsters bda199de04 Preserve Implicit Method Names
Summary:
Changes the way we instrument methods for `ReactPerf` so that developer tools can assign implicit method names to measured functions.

Reviewers: @zpao @sebmarkbage
2014-11-18 12:48:58 -08:00
yungsters 8e15046283 Stop Mutating Merged Lifecycle Results
Summary:
Currently, `ReactClass` mutates values returned by `getDefaultProps`, `getInitialState`, and `getChildContext`. This is bad because the objects may, for example, be cached and re-used across instances of a React component.

This changes `ReactClass` to instead create a new object. In return for allocating a new object, I've replaced `mapObject` with a `for ... in` so that we are no longer allocating an unused object.

Fair trade, IMO.

Test Plan:
Ran unit tests successfully:

```
npm run jest
```

Conflicts:
	src/core/ReactCompositeComponent.js

Conflicts:
	src/class/ReactClass.js
2014-11-18 10:00:22 -08:00
Matt Huggins 9a472ca8f1 Permit th attribute 2014-11-18 07:52:25 -07:00
Sebastian Markbåge e3e0bf5de2 Merge pull request #2550 from sebmarkbage/cleanupinternals
Move ComponentEnvironment out of ReactComponent
2014-11-17 17:41:32 -08:00
Sebastian Markbage 5951a131db Move ComponentEnvironment out of ReactComponent
We currently have three DOM specific hooks that get injected. I move those
out to ReactComponentEnvironment. The idea is to eventually remove this
injection as the reconciler gets refactored.

There is also a BackendIDOperation which is specific to the DOM component
itself so I move this injection to be more specific to the DOMComponent.

E.g. it makes sense for it to be injectable for cross-worker DOM operations
but it doesn't make sense for ART components.
2014-11-17 17:21:41 -08:00
Jim 46bff98a3f Fixed 'imports' to resolve merge conflict 2014-11-17 17:14:00 -08:00
Jim 081feeb2dd Added warning if owner-based and parent-based contexts differ. 2014-11-17 17:02:20 -08:00
Sebastian Markbage 6dddd60e33 Unused variables 2014-11-17 13:31:19 -08:00
Sebastian Markbage fb17e8ca56 Ensure that all internal instances have consistent properties
Use preventExtensions so that we can't add expando properties to internal
instances. This ensures that the hidden class is kept more consistent.
2014-11-17 12:54:21 -08:00
Sebastian Markbage bc4dd411b0 Move _pendingX into ReactCompositeComponent
Since setProps can no longer be called on anything but composites, we can
move this complexity into ReactCompositeComponent.
2014-11-17 12:54:21 -08:00
Sebastian Markbage 974a4c84ce Move mountComponentIntoNode and setProps out of ReactComponent
This is part of moving more logic out of the base classes.

setProps, replaceProps etc. are not accessible from anything other than
ReactClass so we can safely move it to ReactCompositeComponent.

mountComponentIntoNode is tightly coupled to ReactMount. It's part of the
outer abstraction, the mount point, not the individual component.
2014-11-17 12:54:21 -08:00
Scott Feeney bfadafe5d0 Shallow rendering support (#2393)
Now handles updating. Haven't looked at refs yet.
2014-11-17 10:47:18 -08:00
Sebastian Markbage 63644d5e71 Add test for warning in ReactElementValidator
I previously had a mistake here, so I'm adding a unit test to ensure that I
don't make the same mistake again.
2014-11-16 21:07:31 -08:00
Sebastian Markbage dac59d1032 Drop the _owner and _lifeCycle field on internal instances
The _owner field is unnecessary since it's reachable from _currentElement.

The _lifeCycle field is unnecessary because an internal component should
not even need to exist at all if it's unmounted. It should be dereferenced
internally, and never exposed externally.

The only case where it's important is for batching updates where we
currently avoid calling performUpdateIfNecessary if it's mounted. However,
this function is already only executed "if necessary" so we just make sure
that it's not necessary after unmount by resetting all the pending fields.
2014-11-16 21:05:12 -08:00
Sebastian Markbage 03ae0a906b Drop ReactOwner.Mixin
This is not used anywhere else. To avoid overabstraction we should just
inline this.
2014-11-16 21:04:07 -08:00
Sebastian Markbage 519ee322ca Drop this.props 2014-11-16 21:04:04 -08:00
Sebastian Markbage 8181272fe8 Drop inaccessible methods
These are no longer accessible and the isOwnedBy check is only used in
a method that is not accessible.
2014-11-16 21:02:40 -08:00
Ben Alpert a194e51af0 Move logic for null to instantiateReactComponent
This cleans up the code a bit and also brings us closer to allowing any ReactNode to be rendered at the top level.

Test Plan: jest
2014-11-16 17:41:54 -08:00
Ben Alpert c96ea9abf2 Remove transferPropsTo
I'd like to outlaw prop mutation altogether, and now seems like a fine time to remove transferPropsTo.

Test Plan: jest
2014-11-16 17:41:07 -08:00
Ben Alpert f391b7b3ca Don't mutate .props.style in ReactDOMComponent
We currently make a copy of .style because we support mutating the style object in place. Instead of storing it back on props, store it separately on the component instance so that we don't mutate props anywhere. This is gross but should all be cleaned up after #2008 is resolved.

Test Plan: jest
2014-11-16 17:39:00 -08:00
Ben Alpert 505bc7595b Fix up variable names and types to be correct
Test Plan: jest
2014-11-16 17:37:40 -08:00
Sebastian Markbåge 3aa56039c6 Merge pull request #2537 from sebmarkbage/hidedomcomponentinternals
Wrap every DOM node in a Composite Component
2014-11-16 15:35:04 -08:00
Ben Alpert e619d25d03 Inject browser mixin before full-page components
createFullPageComponent doesn't reference ReactBrowserComponentMixin directly so the mixin should get injected before the components are created. Previously, this test failed because getDOMNode wasn't present on the component instance.

Test Plan: jest
2014-11-16 12:59:44 -08:00
Sebastian Markbage 9c3e2d833d Wrap every DOM node in a Composite Component
...unless they already have a wrapper. Also, add tagName to every wrapper.

This ensures that refs are consistent. They always look like composite
components. This effectively hides the internal implementation details of
real DOM components since you can no longer get a ref to one.

In the future we might want to drop this wrapper and have refs refer
directly to the DOM node.

I currently use a hacky way of auto-wrapping inside of ReactNativeComponent
so that any given string can be wrapped. Better suggestions are welcome.
2014-11-16 10:32:46 -08:00
Ben Alpert 795290d1b0 Fix problems with empty component ID registration
Fixes #2493, also closes #2353 as it incorporates a variant of that fix.

- Instead of having getEmptyComponent return `<noscript />` directly, wrap it in a class that we can easily identify later as being an empty component
- Cache the empty component element instead of recreating one each time
- Avoid touching the nullComponentIdsRegistry dictionary at all when not dealing with empty components
- Move empty-component tests to a separate file

Test Plan: jest
2014-11-15 12:35:11 -08:00
Ben Alpert 230115da92 Make ReactTextComponent properly injectable
ReactTextComponent's implementation is DOM-specific; instead of flattenChildren creating the ReactTextComponent instances, ReactNativeComponent now takes care of having ReactTextComponent injected and creating the component instance. I also renamed ReactTextComponent to ReactDOMTextComponent and moved it to browser/ui/ where it belongs. ReactDOMTextComponent no longer inherits directly from ReactComponent and instead implements construct and {mount,receive,unmount}Component directly.

This diff removes `ReactTestUtils.isTextComponent` which should have previously never returned true when using public APIs.

Test Plan: jest, use ballmer-peak example.
2014-11-15 12:30:42 -08:00