@samitouri / QOS-React-2 / commits / 3fb2d3f5d4

Extract defineProperty feature testing to one file

This makes it slightly more bearable to debug in IE8 with an exception breakpoint. Also the old way was just silly and could mask other bugs.

Ben Alpert committed Oct 7, 2015 at 18:31 UTC 3fb2d3f5d4c9c95de1c7a00c783d8c0d36638ed3
6 files changed +32 -23
src/isomorphic/classic/element/ReactElement.js
+1 -10
@@ -14,6 +14,7 @@
14 var ReactCurrentOwner = require('ReactCurrentOwner');
15
16 var assign = require('Object.assign');
17 +var canDefineProperty = require('canDefineProperty');
18
19 // The Symbol used to tag the ReactElement type. If there is no native Symbol
20 // nor polyfill, then a plain number is used for performance.
@@ -28,16 +29,6 @@ var RESERVED_PROPS = {
29 __source: true,
30 };
31
31 -var canDefineProperty = false;
32 -if (__DEV__) {
33 - try {
34 - Object.defineProperty({}, 'x', {});
35 - canDefineProperty = true;
36 - } catch (x) {
37 - // IE will fail on defineProperty
38 - }
39 -}
40 -
32 /**
33 * Base constructor for all React elements. This is only used to make this
34 * work with a dynamic instanceof check. Nothing should live on this prototype.
src/isomorphic/classic/element/ReactElementValidator.js
+2 -3
@@ -23,6 +23,7 @@ var ReactPropTypeLocations = require('ReactPropTypeLocations');
23 var ReactPropTypeLocationNames = require('ReactPropTypeLocationNames');
24 var ReactCurrentOwner = require('ReactCurrentOwner');
25
26 +var canDefineProperty = require('canDefineProperty');
27 var getIteratorFn = require('getIteratorFn');
28 var invariant = require('invariant');
29 var warning = require('warning');
@@ -298,7 +299,7 @@ var ReactElementValidator = {
299 validatedFactory.type = type;
300
301 if (__DEV__) {
301 - try {
302 + if (canDefineProperty) {
303 Object.defineProperty(
304 validatedFactory,
305 'type',
@@ -317,8 +318,6 @@ var ReactElementValidator = {
318 },
319 }
320 );
320 - } catch (x) {
321 - // IE will fail on defineProperty (es5-shim/sham too)
321 }
322 }
323
src/isomorphic/modern/class/ReactComponent.js
+2 -3
@@ -13,6 +13,7 @@
13
14 var ReactNoopUpdateQueue = require('ReactNoopUpdateQueue');
15
16 +var canDefineProperty = require('canDefineProperty');
17 var emptyObject = require('emptyObject');
18 var invariant = require('invariant');
19 var warning = require('warning');
@@ -129,7 +130,7 @@ if (__DEV__) {
130 ],
131 };
132 var defineDeprecationWarning = function(methodName, info) {
132 - try {
133 + if (canDefineProperty) {
134 Object.defineProperty(ReactComponent.prototype, methodName, {
135 get: function() {
136 warning(
@@ -141,8 +142,6 @@ if (__DEV__) {
142 return undefined;
143 },
144 });
144 - } catch (x) {
145 - // IE will fail on defineProperty (es5-shim/sham too)
145 }
146 };
147 for (var fnName in deprecatedAPIs) {
src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js
+2
@@ -180,6 +180,8 @@ function startWatchingForValueChange(target, targetID) {
180 'value'
181 );
182
183 + // Not guarded in a canDefineProperty check: IE8 supports defineProperty only
184 + // on DOM elements
185 Object.defineProperty(activeElement, 'value', newValueProp);
186 activeElement.attachEvent('onpropertychange', handlePropertyChange);
187 }
src/renderers/dom/shared/ReactDOMComponent.js
+1 -7
@@ -33,6 +33,7 @@ var ReactPerf = require('ReactPerf');
33 var ReactUpdateQueue = require('ReactUpdateQueue');
34
35 var assign = require('Object.assign');
36 +var canDefineProperty = require('canDefineProperty');
37 var escapeTextContentForBrowser = require('escapeTextContentForBrowser');
38 var invariant = require('invariant');
39 var isEventSupported = require('isEventSupported');
@@ -54,13 +55,6 @@ var STYLE = keyOf({style: null});
55
56 var ELEMENT_NODE_TYPE = 1;
57
57 -var canDefineProperty = false;
58 -try {
59 - Object.defineProperty({}, 'test', {get: function() {}});
60 - canDefineProperty = true;
61 -} catch (e) {
62 -}
63 -
58 function getDeclarationErrorAddendum(internalInstance) {
59 if (internalInstance) {
60 var owner = internalInstance._currentElement._owner || null;
src/shared/utils/canDefineProperty.js new
+24
@@ -0,0 +1,24 @@
1 +/**
2 + * Copyright 2013-2015, Facebook, Inc.
3 + * All rights reserved.
4 + *
5 + * This source code is licensed under the BSD-style license found in the
6 + * LICENSE file in the root directory of this source tree. An additional grant
7 + * of patent rights can be found in the PATENTS file in the same directory.
8 + *
9 + * @providesModule canDefineProperty
10 + */
11 +
12 +'use strict';
13 +
14 +var canDefineProperty = false;
15 +if (__DEV__) {
16 + try {
17 + Object.defineProperty({}, 'x', {});
18 + canDefineProperty = true;
19 + } catch (x) {
20 + // IE will fail on defineProperty
21 + }
22 +}
23 +
24 +module.exports = canDefineProperty;