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;