diff options
Diffstat (limited to 'spec/frontend/__helpers__/dom_shims/get_client_rects.js')
-rw-r--r-- | spec/frontend/__helpers__/dom_shims/get_client_rects.js | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/spec/frontend/__helpers__/dom_shims/get_client_rects.js b/spec/frontend/__helpers__/dom_shims/get_client_rects.js new file mode 100644 index 00000000000..7ba60dd7936 --- /dev/null +++ b/spec/frontend/__helpers__/dom_shims/get_client_rects.js @@ -0,0 +1,52 @@ +function hasHiddenStyle(node) { + if (!node.style) { + return false; + } else if (node.style.display === 'none' || node.style.visibility === 'hidden') { + return true; + } + + return false; +} + +function createDefaultClientRect(node) { + const { outerWidth: width, outerHeight: height } = node; + + return { + bottom: height, + height, + left: 0, + right: width, + top: 0, + width, + x: 0, + y: 0, + }; +} + +/** + * This is needed to get the `toBeVisible` matcher to work in `jsdom` + * + * Reference: + * - https://github.com/jsdom/jsdom/issues/1322 + * - https://github.com/unindented/custom-jquery-matchers/blob/v2.1.0/packages/custom-jquery-matchers/src/matchers.js#L157 + */ +window.Element.prototype.getClientRects = function getClientRects() { + let node = this; + + while (node) { + if (node === document) { + break; + } + + if (hasHiddenStyle(node)) { + return []; + } + node = node.parentNode; + } + + if (!node) { + return []; + } + + return [createDefaultClientRect(node)]; +}; |