diff --git a/src/isomorphic/classic/element/ReactElement.js b/src/isomorphic/classic/element/ReactElement.js index bad91e5030c5..655b9aa881fc 100644 --- a/src/isomorphic/classic/element/ReactElement.js +++ b/src/isomorphic/classic/element/ReactElement.js @@ -14,6 +14,7 @@ var ReactCurrentOwner = require('ReactCurrentOwner'); var assign = require('Object.assign'); +var canDefineProperty = require('canDefineProperty'); // The Symbol used to tag the ReactElement type. If there is no native Symbol // nor polyfill, then a plain number is used for performance. @@ -28,16 +29,6 @@ var RESERVED_PROPS = { __source: true, }; -var canDefineProperty = false; -if (__DEV__) { - try { - Object.defineProperty({}, 'x', {}); - canDefineProperty = true; - } catch (x) { - // IE will fail on defineProperty - } -} - /** * Base constructor for all React elements. This is only used to make this * work with a dynamic instanceof check. Nothing should live on this prototype. diff --git a/src/isomorphic/classic/element/ReactElementValidator.js b/src/isomorphic/classic/element/ReactElementValidator.js index a4ae328fa65d..cd91f30ba205 100644 --- a/src/isomorphic/classic/element/ReactElementValidator.js +++ b/src/isomorphic/classic/element/ReactElementValidator.js @@ -23,6 +23,7 @@ var ReactPropTypeLocations = require('ReactPropTypeLocations'); var ReactPropTypeLocationNames = require('ReactPropTypeLocationNames'); var ReactCurrentOwner = require('ReactCurrentOwner'); +var canDefineProperty = require('canDefineProperty'); var getIteratorFn = require('getIteratorFn'); var invariant = require('invariant'); var warning = require('warning'); @@ -298,7 +299,7 @@ var ReactElementValidator = { validatedFactory.type = type; if (__DEV__) { - try { + if (canDefineProperty) { Object.defineProperty( validatedFactory, 'type', @@ -317,8 +318,6 @@ var ReactElementValidator = { }, } ); - } catch (x) { - // IE will fail on defineProperty (es5-shim/sham too) } } diff --git a/src/isomorphic/modern/class/ReactComponent.js b/src/isomorphic/modern/class/ReactComponent.js index f99cb0385c38..512df611373b 100644 --- a/src/isomorphic/modern/class/ReactComponent.js +++ b/src/isomorphic/modern/class/ReactComponent.js @@ -13,6 +13,7 @@ var ReactNoopUpdateQueue = require('ReactNoopUpdateQueue'); +var canDefineProperty = require('canDefineProperty'); var emptyObject = require('emptyObject'); var invariant = require('invariant'); var warning = require('warning'); @@ -129,7 +130,7 @@ if (__DEV__) { ], }; var defineDeprecationWarning = function(methodName, info) { - try { + if (canDefineProperty) { Object.defineProperty(ReactComponent.prototype, methodName, { get: function() { warning( @@ -141,8 +142,6 @@ if (__DEV__) { return undefined; }, }); - } catch (x) { - // IE will fail on defineProperty (es5-shim/sham too) } }; for (var fnName in deprecatedAPIs) { diff --git a/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js b/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js index e33a4ccba11e..8e35aca0b672 100644 --- a/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js +++ b/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js @@ -180,6 +180,8 @@ function startWatchingForValueChange(target, targetID) { 'value' ); + // Not guarded in a canDefineProperty check: IE8 supports defineProperty only + // on DOM elements Object.defineProperty(activeElement, 'value', newValueProp); activeElement.attachEvent('onpropertychange', handlePropertyChange); } diff --git a/src/renderers/dom/shared/ReactDOMComponent.js b/src/renderers/dom/shared/ReactDOMComponent.js index 827f06d945c9..42239e087761 100644 --- a/src/renderers/dom/shared/ReactDOMComponent.js +++ b/src/renderers/dom/shared/ReactDOMComponent.js @@ -33,6 +33,7 @@ var ReactPerf = require('ReactPerf'); var ReactUpdateQueue = require('ReactUpdateQueue'); var assign = require('Object.assign'); +var canDefineProperty = require('canDefineProperty'); var escapeTextContentForBrowser = require('escapeTextContentForBrowser'); var invariant = require('invariant'); var isEventSupported = require('isEventSupported'); @@ -54,13 +55,6 @@ var STYLE = keyOf({style: null}); var ELEMENT_NODE_TYPE = 1; -var canDefineProperty = false; -try { - Object.defineProperty({}, 'test', {get: function() {}}); - canDefineProperty = true; -} catch (e) { -} - function getDeclarationErrorAddendum(internalInstance) { if (internalInstance) { var owner = internalInstance._currentElement._owner || null; diff --git a/src/shared/utils/canDefineProperty.js b/src/shared/utils/canDefineProperty.js new file mode 100644 index 000000000000..b1e7e80a2796 --- /dev/null +++ b/src/shared/utils/canDefineProperty.js @@ -0,0 +1,24 @@ +/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule canDefineProperty + */ + +'use strict'; + +var canDefineProperty = false; +if (__DEV__) { + try { + Object.defineProperty({}, 'x', {}); + canDefineProperty = true; + } catch (x) { + // IE will fail on defineProperty + } +} + +module.exports = canDefineProperty;