wait-for-element-to-be-removed.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.waitForElementToBeRemoved = waitForElementToBeRemoved;
  6. var _waitFor = require("./wait-for");
  7. const isRemoved = result => !result || Array.isArray(result) && !result.length;
  8. // Check if the element is not present.
  9. // As the name implies, waitForElementToBeRemoved should check `present` --> `removed`
  10. function initialCheck(elements) {
  11. if (isRemoved(elements)) {
  12. throw new Error('The element(s) given to waitForElementToBeRemoved are already removed. waitForElementToBeRemoved requires that the element(s) exist(s) before waiting for removal.');
  13. }
  14. }
  15. async function waitForElementToBeRemoved(callback, options) {
  16. // created here so we get a nice stacktrace
  17. const timeoutError = new Error('Timed out in waitForElementToBeRemoved.');
  18. if (typeof callback !== 'function') {
  19. initialCheck(callback);
  20. const elements = Array.isArray(callback) ? callback : [callback];
  21. const getRemainingElements = elements.map(element => {
  22. let parent = element.parentElement;
  23. if (parent === null) return () => null;
  24. while (parent.parentElement) parent = parent.parentElement;
  25. return () => parent.contains(element) ? element : null;
  26. });
  27. callback = () => getRemainingElements.map(c => c()).filter(Boolean);
  28. }
  29. initialCheck(callback());
  30. return (0, _waitFor.waitFor)(() => {
  31. let result;
  32. try {
  33. result = callback();
  34. } catch (error) {
  35. if (error.name === 'TestingLibraryElementError') {
  36. return undefined;
  37. }
  38. throw error;
  39. }
  40. if (!isRemoved(result)) {
  41. throw timeoutError;
  42. }
  43. return undefined;
  44. }, options);
  45. }
  46. /*
  47. eslint
  48. require-await: "off"
  49. */