(node)
| 3761 | } |
| 3762 | |
| 3763 | function trackValueOnNode(node) { |
| 3764 | var valueField = isCheckable(node) ? 'checked' : 'value'; |
| 3765 | var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); |
| 3766 | |
| 3767 | var currentValue = '' + node[valueField]; |
| 3768 | |
| 3769 | // if someone has already defined a value or Safari, then bail |
| 3770 | // and don't track value will cause over reporting of changes, |
| 3771 | // but it's better then a hard failure |
| 3772 | // (needed for certain tests that spyOn input values and Safari) |
| 3773 | if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { |
| 3774 | return; |
| 3775 | } |
| 3776 | |
| 3777 | Object.defineProperty(node, valueField, { |
| 3778 | configurable: true, |
| 3779 | get: function () { |
| 3780 | return descriptor.get.call(this); |
| 3781 | }, |
| 3782 | set: function (value) { |
| 3783 | currentValue = '' + value; |
| 3784 | descriptor.set.call(this, value); |
| 3785 | } |
| 3786 | }); |
| 3787 | // We could've passed this the first time |
| 3788 | // but it triggers a bug in IE11 and Edge 14/15. |
| 3789 | // Calling defineProperty() again should be equivalent. |
| 3790 | // https://github.com/facebook/react/issues/11768 |
| 3791 | Object.defineProperty(node, valueField, { |
| 3792 | enumerable: descriptor.enumerable |
| 3793 | }); |
| 3794 | |
| 3795 | var tracker = { |
| 3796 | getValue: function () { |
| 3797 | return currentValue; |
| 3798 | }, |
| 3799 | setValue: function (value) { |
| 3800 | currentValue = '' + value; |
| 3801 | }, |
| 3802 | stopTracking: function () { |
| 3803 | detachTracker(node); |
| 3804 | delete node[valueField]; |
| 3805 | } |
| 3806 | }; |
| 3807 | return tracker; |
| 3808 | } |
| 3809 | |
| 3810 | function track(node) { |
| 3811 | if (getTracker(node)) { |
no test coverage detected