(node)
| 3634 | } |
| 3635 | |
| 3636 | function trackValueOnNode(node) { |
| 3637 | var valueField = isCheckable(node) ? 'checked' : 'value'; |
| 3638 | var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); |
| 3639 | |
| 3640 | var currentValue = '' + node[valueField]; |
| 3641 | |
| 3642 | // if someone has already defined a value or Safari, then bail |
| 3643 | // and don't track value will cause over reporting of changes, |
| 3644 | // but it's better then a hard failure |
| 3645 | // (needed for certain tests that spyOn input values and Safari) |
| 3646 | if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { |
| 3647 | return; |
| 3648 | } |
| 3649 | |
| 3650 | Object.defineProperty(node, valueField, { |
| 3651 | configurable: true, |
| 3652 | get: function () { |
| 3653 | return descriptor.get.call(this); |
| 3654 | }, |
| 3655 | set: function (value) { |
| 3656 | currentValue = '' + value; |
| 3657 | descriptor.set.call(this, value); |
| 3658 | } |
| 3659 | }); |
| 3660 | // We could've passed this the first time |
| 3661 | // but it triggers a bug in IE11 and Edge 14/15. |
| 3662 | // Calling defineProperty() again should be equivalent. |
| 3663 | // https://github.com/facebook/react/issues/11768 |
| 3664 | Object.defineProperty(node, valueField, { |
| 3665 | enumerable: descriptor.enumerable |
| 3666 | }); |
| 3667 | |
| 3668 | var tracker = { |
| 3669 | getValue: function () { |
| 3670 | return currentValue; |
| 3671 | }, |
| 3672 | setValue: function (value) { |
| 3673 | currentValue = '' + value; |
| 3674 | }, |
| 3675 | stopTracking: function () { |
| 3676 | detachTracker(node); |
| 3677 | delete node[valueField]; |
| 3678 | } |
| 3679 | }; |
| 3680 | return tracker; |
| 3681 | } |
| 3682 | |
| 3683 | function track(node) { |
| 3684 | if (getTracker(node)) { |
no test coverage detected