(node)
| 4012 | } |
| 4013 | |
| 4014 | function trackValueOnNode(node) { |
| 4015 | var valueField = isCheckable(node) ? 'checked' : 'value'; |
| 4016 | var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); |
| 4017 | |
| 4018 | var currentValue = '' + node[valueField]; |
| 4019 | |
| 4020 | // if someone has already defined a value or Safari, then bail |
| 4021 | // and don't track value will cause over reporting of changes, |
| 4022 | // but it's better then a hard failure |
| 4023 | // (needed for certain tests that spyOn input values and Safari) |
| 4024 | if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { |
| 4025 | return; |
| 4026 | } |
| 4027 | |
| 4028 | Object.defineProperty(node, valueField, { |
| 4029 | configurable: true, |
| 4030 | get: function () { |
| 4031 | return descriptor.get.call(this); |
| 4032 | }, |
| 4033 | set: function (value) { |
| 4034 | currentValue = '' + value; |
| 4035 | descriptor.set.call(this, value); |
| 4036 | } |
| 4037 | }); |
| 4038 | // We could've passed this the first time |
| 4039 | // but it triggers a bug in IE11 and Edge 14/15. |
| 4040 | // Calling defineProperty() again should be equivalent. |
| 4041 | // https://github.com/facebook/react/issues/11768 |
| 4042 | Object.defineProperty(node, valueField, { |
| 4043 | enumerable: descriptor.enumerable |
| 4044 | }); |
| 4045 | |
| 4046 | var tracker = { |
| 4047 | getValue: function () { |
| 4048 | return currentValue; |
| 4049 | }, |
| 4050 | setValue: function (value) { |
| 4051 | currentValue = '' + value; |
| 4052 | }, |
| 4053 | stopTracking: function () { |
| 4054 | detachTracker(node); |
| 4055 | delete node[valueField]; |
| 4056 | } |
| 4057 | }; |
| 4058 | return tracker; |
| 4059 | } |
| 4060 | |
| 4061 | function track(node) { |
| 4062 | if (getTracker(node)) { |
no test coverage detected