(node)
| 3122 | } |
| 3123 | |
| 3124 | function trackValueOnNode(node) { |
| 3125 | var valueField = isCheckable(node) ? 'checked' : 'value'; |
| 3126 | var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); |
| 3127 | |
| 3128 | var currentValue = '' + node[valueField]; |
| 3129 | |
| 3130 | // if someone has already defined a value or Safari, then bail |
| 3131 | // and don't track value will cause over reporting of changes, |
| 3132 | // but it's better then a hard failure |
| 3133 | // (needed for certain tests that spyOn input values and Safari) |
| 3134 | if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { |
| 3135 | return; |
| 3136 | } |
| 3137 | |
| 3138 | Object.defineProperty(node, valueField, { |
| 3139 | configurable: true, |
| 3140 | get: function () { |
| 3141 | return descriptor.get.call(this); |
| 3142 | }, |
| 3143 | set: function (value) { |
| 3144 | currentValue = '' + value; |
| 3145 | descriptor.set.call(this, value); |
| 3146 | } |
| 3147 | }); |
| 3148 | // We could've passed this the first time |
| 3149 | // but it triggers a bug in IE11 and Edge 14/15. |
| 3150 | // Calling defineProperty() again should be equivalent. |
| 3151 | // https://github.com/facebook/react/issues/11768 |
| 3152 | Object.defineProperty(node, valueField, { |
| 3153 | enumerable: descriptor.enumerable |
| 3154 | }); |
| 3155 | |
| 3156 | var tracker = { |
| 3157 | getValue: function () { |
| 3158 | return currentValue; |
| 3159 | }, |
| 3160 | setValue: function (value) { |
| 3161 | currentValue = '' + value; |
| 3162 | }, |
| 3163 | stopTracking: function () { |
| 3164 | detachTracker(node); |
| 3165 | delete node[valueField]; |
| 3166 | } |
| 3167 | }; |
| 3168 | return tracker; |
| 3169 | } |
| 3170 | |
| 3171 | function track(node) { |
| 3172 | if (getTracker(node)) { |
no test coverage detected