domHook.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.spyElementPrototype = spyElementPrototype;
  7. exports.spyElementPrototypes = spyElementPrototypes;
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. const __NULL__ = {
  10. notExist: true
  11. };
  12. function spyElementPrototypes(Element, properties) {
  13. const propNames = Object.keys(properties);
  14. const originDescriptors = {};
  15. propNames.forEach(propName => {
  16. const originDescriptor = Object.getOwnPropertyDescriptor(Element.prototype, propName);
  17. originDescriptors[propName] = originDescriptor || __NULL__;
  18. const spyProp = properties[propName];
  19. if (typeof spyProp === 'function') {
  20. // If is a function
  21. Element.prototype[propName] = function spyFunc() {
  22. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  23. args[_key] = arguments[_key];
  24. }
  25. return spyProp.call(this, originDescriptor, ...args);
  26. };
  27. } else {
  28. // Otherwise tread as a property
  29. Object.defineProperty(Element.prototype, propName, (0, _extends2.default)((0, _extends2.default)({}, spyProp), {
  30. set(value) {
  31. if (spyProp.set) {
  32. return spyProp.set.call(this, originDescriptor, value);
  33. }
  34. return originDescriptor.set(value);
  35. },
  36. get() {
  37. if (spyProp.get) {
  38. return spyProp.get.call(this, originDescriptor);
  39. }
  40. return originDescriptor.get();
  41. }
  42. }));
  43. }
  44. });
  45. return {
  46. mockRestore() {
  47. propNames.forEach(propName => {
  48. const originDescriptor = originDescriptors[propName];
  49. if (originDescriptor === __NULL__) {
  50. delete Element.prototype[propName];
  51. } else if (typeof originDescriptor === 'function') {
  52. Element.prototype[propName] = originDescriptor;
  53. } else {
  54. Object.defineProperty(Element.prototype, propName, originDescriptor);
  55. }
  56. });
  57. }
  58. };
  59. }
  60. function spyElementPrototype(Element, propName, property) {
  61. return spyElementPrototypes(Element, {
  62. [propName]: property
  63. });
  64. }