(node)
| 2994 | } |
| 2995 | |
| 2996 | function trackValueOnNode(node) { |
| 2997 | var valueField = isCheckable(node) ? 'checked' : 'value'; |
| 2998 | var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); |
| 2999 | |
| 3000 | var currentValue = '' + node[valueField]; |
| 3001 | |
| 3002 | // if someone has already defined a value or Safari, then bail |
| 3003 | // and don't track value will cause over reporting of changes, |
| 3004 | // but it's better then a hard failure |
| 3005 | // (needed for certain tests that spyOn input values and Safari) |
| 3006 | if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { |
| 3007 | return; |
| 3008 | } |
| 3009 | |
| 3010 | Object.defineProperty(node, valueField, { |
| 3011 | configurable: true, |
| 3012 | get: function () { |
| 3013 | return descriptor.get.call(this); |
| 3014 | }, |
| 3015 | set: function (value) { |
| 3016 | currentValue = '' + value; |
| 3017 | descriptor.set.call(this, value); |
| 3018 | } |
| 3019 | }); |
| 3020 | // We could've passed this the first time |
| 3021 | // but it triggers a bug in IE11 and Edge 14/15. |
| 3022 | // Calling defineProperty() again should be equivalent. |
| 3023 | // https://github.com/facebook/react/issues/11768 |
| 3024 | Object.defineProperty(node, valueField, { |
| 3025 | enumerable: descriptor.enumerable |
| 3026 | }); |
| 3027 | |
| 3028 | var tracker = { |
| 3029 | getValue: function () { |
| 3030 | return currentValue; |
| 3031 | }, |
| 3032 | setValue: function (value) { |
| 3033 | currentValue = '' + value; |
| 3034 | }, |
| 3035 | stopTracking: function () { |
| 3036 | detachTracker(node); |
| 3037 | delete node[valueField]; |
| 3038 | } |
| 3039 | }; |
| 3040 | return tracker; |
| 3041 | } |
| 3042 | |
| 3043 | function track(node) { |
| 3044 | if (getTracker(node)) { |
no test coverage detected