From 3fb2d3f5d4c9c95de1c7a00c783d8c0d36638ed3 Mon Sep 17 00:00:00 2001 From: Ben Alpert Date: Wed, 7 Oct 2015 18:31:05 -0700 Subject: [PATCH] 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. --- .../classic/element/ReactElement.js | 11 +-------- .../classic/element/ReactElementValidator.js | 5 ++-- src/isomorphic/modern/class/ReactComponent.js | 5 ++-- .../client/eventPlugins/ChangeEventPlugin.js | 2 ++ src/renderers/dom/shared/ReactDOMComponent.js | 8 +------ src/shared/utils/canDefineProperty.js | 24 +++++++++++++++++++ 6 files changed, 32 insertions(+), 23 deletions(-) create mode 100644 src/shared/utils/canDefineProperty.js 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;