Commit Graph

462 Commits

Author SHA1 Message Date
Ben Newman
affe7f98b5 Merge pull request #367 from benjamn/findComponentRoot-memory-usage-improvements
Space optimizations for ReactMount.findComponentRoot.
2013-12-04 13:20:29 -08:00
Ben Alpert
9d443542f9 Remove unused updatePropertiesByID 2013-12-03 19:22:36 -08:00
Ben Newman
87db648f3e Address pull request feedback. 2013-12-03 16:43:37 -05:00
Ben Newman
6b9fc81b64 Space optimizations for ReactMount.findComponentRoot. 2013-12-03 16:43:37 -05:00
Paul O’Shannessy
9d18956b09 Merge pull request #624 from spicyj/remove-registrationNamesKeys
Remove unused event plugin registrationNamesKeys
2013-12-02 16:03:36 -08:00
Pete Hunt
3851462b80 Fix lint warnings 2013-12-02 13:32:09 -08:00
Paul O’Shannessy
76e3294c8f Merge pull request #609 from subtleGradient/subtlegradient/fixes-ios-crasher
fixes iOS crasher
2013-12-02 13:25:40 -08:00
Paul O’Shannessy
d64256fb65 Merge pull request #626 from spicyj/getUnboundedScrollPosition-license
Add missing license header
2013-12-02 09:07:07 -08:00
Ben Alpert
1cb402c410 Add missing license header 2013-12-02 01:12:20 -08:00
Ben Alpert
4323ab095f Remove unused event plugin registrationNamesKeys 2013-12-01 22:28:19 -08:00
Pete Hunt
92b62bf1fe Merge pull request #576 from spicyj/immutable-props
Don't mutate passed-in props
2013-12-01 18:26:41 -08:00
Pete Hunt
2a84b6c6b2 Merge pull request #537 from hojberg/dont_animate_undefined_children
ReactTransitions: Don't animate undefined children
2013-12-01 14:21:11 -08:00
Paul O’Shannessy
8fbdb50a9d Merge pull request #597 from spicyj/gh-527
Don't use .returnValue if .defaultPrevented exists
2013-11-27 14:28:26 -08:00
Paul O’Shannessy
5fbd8109f8 Merge pull request #598 from spicyj/gh-516
Be resilient to fn.name not existing in IE
2013-11-27 14:28:02 -08:00
Thomas Aylott
916ee6b394 jsx & JSDOM support 2013-11-27 17:04:40 -05:00
Marshall Roch
697a9113c0 ReactPropTypes: add oneOfType to support union types
Summary:
e.g.

  propTypes: {
    foo: React.PropTypes.oneOfType([
      React.PropTypes.string,
      React.PropTypes.number
    ]);
  }

to do this, I exposed a `.weak` chainable validator that returns instead of throws, e.g.

  React.PropTypes.string.isRequired.weak
  React.PropTypes.string.weak

which returns true or false. Technically, `React.PropTypes.string.weak.isRequired` also exists, but `oneOfType` will never call it. Might be useful to people creating custom validators though.
2013-11-27 12:10:50 -08:00
Marshall Roch
351dcfed01 Validate propTypes, contextTypes, childContextTypes
who watches the watchmen?
2013-11-27 12:10:50 -08:00
Pete Hunt
fcfe516a2e Less verbose ReactPropTypeLocations logging
Since we use keyMirror() and invariant() messages are only shown in __DEV__, we don't have to do manual constant->string translation. Also fixes a few
undefined keys that just happened to work before.
2013-11-27 12:10:50 -08:00
Thomas Aylott
f4753030a2 IE support 2013-11-25 16:02:01 -05:00
Thomas Aylott
3bfb687de3 remove warning comment about createHTMLDocument 2013-11-25 15:08:00 -05:00
Thomas Aylott
eebad16636 Use an iframe to create a testDocument…
instead of `createHTMLDocument` since it isn't fully support by the browsers we care about.

fixes #606
fixes #454
2013-11-25 15:05:35 -05:00
Ben Alpert
685dec022a Be resilient to fn.name not existing in IE
Fixes #516.
2013-11-24 01:53:53 -05:00
Ben Alpert
4bd0a40037 Don't use .returnValue if .defaultPrevented exists
`.defaultPrevented` exists in IE9+. I checked in IE9, Chrome, and Firefox that it does default to `false`.

Fixes #527.
2013-11-24 01:35:49 -05:00
Ben Alpert
b99fd93684 'getElementsByClassName' doesn't exist in IE8
Fixes #532.
2013-11-24 01:22:00 -05:00
Pete Hunt
d51ae6b8bc Merge pull request #575 from spicyj/owner
Move __owner__ off of props
2013-11-21 17:44:48 -08:00
Ben Alpert
61abc645e5 Move __owner__ off of props 2013-11-21 17:34:52 -08:00
Ben Newman
52d3b47f48 Add back mocking removed to make ReactEventTopLevelCallback-test pass.
This is a partial reversion of commit 9937f0c8bd.
2013-11-21 10:57:24 -08:00
Ben Newman
97bbd852b2 Merge pull request #584 from spicyj/mock
Mock modules properly in test runner.
2013-11-21 10:31:59 -08:00
Ben Alpert
af95b35f27 Have faith in var hoisting 2013-11-21 10:31:20 -08:00
Ben Alpert
c7bb3af760 Mock modules properly in test runner
As an added bonus, the jasmine web interface now groups tests by file.

Test Plan:
grunt test passes on b2507066, the parent of 566f8b2e (which committed a workaround for buggy module mocking).
2013-11-21 00:39:37 -08:00
Ben Newman
566f8b2e85 Merge pull request #573 from spicyj/tests
Make ReactEventTopLevelCallback-test pass
2013-11-20 16:54:15 -08:00
Christopher Chedeau
e73900dad4 Remove rootNode from componentDidMount and componentDidUpdate
We can already access the DOM node using `this.getDOMNode()`. Passing it as an argument was a bad decision.

Previous API:

```
componentDidMount(DOMElement rootNode)
componentDidUpdate(object prevProps, object prevState, object prevContext, DOMElement rootNode)
```

Next API:

```
componentDidMount()
componentDidUpdate(object prevProps, object prevState, object prevContext)
```
2013-11-20 14:20:35 -08:00
Christoph Pojer
2fe2cd5337 Ensure ReactPerf always uses a string as a URL 2013-11-20 14:19:13 -08:00
Tim Yung
04c3e2e407 Add nextContext to componentWillReceiveProps
Add `nextContext` as an argument to `componentWillReceiveProps`. We can figure out what to rename the method to later.
2013-11-20 14:19:01 -08:00
Christopher Chedeau
a23d43bf05 Use this.getDOMNode() instead of last argument of componentDidMount 2013-11-20 14:18:49 -08:00
Marshall Roch
934ef1d4c2 Fix context in callbacks
callbacks like shouldComponentUpdate, componentDidUpdate, etc. were getting the full, unsanitized context, instead of the one that's been filtered down to only the fields allowed to be visible by contextTypes.
2013-11-20 14:18:28 -08:00
Christopher Chedeau
c8b6fe51d9 Use this.getDOMNode() instead of last argument of componentDidUpdate
Context is adding another argument that shifts all of them by one. Since we can already use this.getDOMNode(), it doesn't really make sense to pass it as an argument to that function.
2013-11-20 14:18:07 -08:00
Marshall Roch
3fd3341ab9 remove transaction argument from componentWillReceiveProps 2013-11-20 14:17:23 -08:00
Paul O'Shannessy
060118c7e4 order object properties consistently 2013-11-20 14:17:13 -08:00
Ben Alpert
42c14b8078 Don't mutate passed-in props
Depends on #575; fixes #570.  Now we'll be in trouble if someone tries to share objects between calls to getDefaultProps but that was already true of getInitialState and I haven't heard any complaints there.

This is the same number of allocations as before; we're just copying props in the other direction. (In any case, the copy happens only on mount and there are a couple dozen costlier things we're doing already at that time.)
2013-11-20 01:17:10 -08:00
Ben Alpert
9937f0c8bd Make ReactEventTopLevelCallback-test pass
This module-level mock() seems to have been interfering with other tests (26 specs failing). We don't have any other tests that do a module-level mock() so I'm going to assume it isn't supported in the open-source test runner right now. I changed it so only ReactEventEmitter.handleTopLevel is mocked; doing so made ReactEventEmitter complain that TopLevelCallbackCreator wasn't defined so I switched the ReactMount references to use React directly so that ReactDefaultInjection would kick in properly.

With this, all the tests pass.
2013-11-19 23:46:32 -08:00
Ben Newman
5d878ce914 Merge pull request #550 from subtleGradient/subtlegradient/code-coverage
Code coverage grunt tasks.
2013-11-18 14:03:56 -08:00
Thomas Aylott
ef5a02c164 enable coverage logging from the worker 2013-11-18 16:37:46 -05:00
Daniel Lo Nigro
d853c8568e Propagate events to parent components when nested
When events are captured, the nearest React-rendered ancestor is found and events are propagated to its tree. This causes issues when components are nested as only the innermost component receives the events.

This change modifies this behaviour so events propagate all the way up the DOM hierarchy. To reduce the performance cost, this DOM traversal is only done if the component is actually nested (determined by the `containerIsNested` map which is lazily initialised).
2013-11-18 10:56:29 -08:00
Marshall Roch
b91396be8e Contexts
Summary:
adds `this.context` which you can think of as implicit props, which are passed automatically down the //ownership// hierarchy.

Contexts should be used sparingly, since they essentially allow components to communicate with descendants (in the ownership sense, not parenthood sense), which is not usually a good idea. You probably would only use contexts in places where you'd normally use a global, but contexts allow you to override them for certain view subtrees which you can't do with globals.

The context starts out `null`:

  var RootComponent = React.createClass({
    render: function() {
      // this.context === null
    }
  });

You should **never** mutate the context directly, just like props and state.

You can change the context of your children (the ones you own, not `this.props.children` or via other props) using the new `withContext` method on `React`:

  var RootComponent = React.createClass({
    render: function() {
      // this.context === null
      var children = React.withContext({foo: 'a', bar: 'b'}, () => (
        // In ChildComponent#render, this.context === {foo: 'a', bar: 'b'}
        <ChildComponent />
      ));
      // this.context === null
    }
  });

Contexts are merged, so a component can override its owner's context **for its children**:

  var ChildComponent = React.createClass({
    render: function() {
      // this.context === {foo: 'a', bar: 'b'} (for the caller above)
      var children = React.withContext({foo: 'c'},() => (
        // In GrandchildComponent#render,
        // this.context === {foo: 'c', bar: 'b'}
        <GrandchildComponent />
      ));
      // this.context === {foo: 'a', bar: 'b'}
    }
  });
2013-11-18 10:56:24 -08:00
Pete Hunt
7df127db31 Better error message for renderComponentToString()
Reported on Twitter by AirBnb (who are integrating React into their open-source JS framework). They made a mistake and passed a string in as the
component. We should have a better error message for that.
2013-11-18 10:54:05 -08:00
Tim Yung
8529f1b053 Remove Obsolete IE8 Compatibility Code
See the TODO comment. Synthetic events have shipped and this is no longer necessary.
2013-11-18 10:54:03 -08:00
Marshall Roch
381a3392c6 Rename receiveProps to receiveComponent
This renames receiveProps and changes it to take the next component to copy props from instead of just the props. That is,

  component.receiveComponent(nextComponent, transaction)

instead of

  component.receiveProps(nextComponent.props, transaction)

This is a precursor to adding contexts, which will also need to get propagated just like props. This change allows ReactCompositeComponent to override `receiveProps` and do something like

  this._pendingContext = nextComponent.context;
2013-11-18 10:53:58 -08:00
Paul O’Shannessy
d1fa53ca03 Cleanup lint warnings from recent testing changes
Also, relaxed a rule for dot notation (and unrelaxed it in src).
2013-11-14 11:24:06 -08:00
Paul O’Shannessy
1324eb5556 "use strict" in shouldUpdateReactComponent 2013-11-14 10:37:33 -08:00