domHook.js 1.9 KB

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