From 321797e5a792b951c66f284d18aa12dc793ffc6d Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Tue, 28 Jul 2020 10:14:33 -0400 Subject: [PATCH 1/5] fix: fix hanging when scrolling shadow dom element --- .../commands/actions/scroll_spec.js | 11 ++++++++++ .../driver/src/cy/commands/actions/scroll.js | 2 +- packages/driver/src/dom/elements.ts | 21 ++++++++++++++----- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/driver/cypress/integration/commands/actions/scroll_spec.js b/packages/driver/cypress/integration/commands/actions/scroll_spec.js index 4482760c0615..cf495f771e25 100644 --- a/packages/driver/cypress/integration/commands/actions/scroll_spec.js +++ b/packages/driver/cypress/integration/commands/actions/scroll_spec.js @@ -799,6 +799,17 @@ describe('src/cy/commands/actions/scroll', () => { }) }) + describe('shadow dom', () => { + beforeEach(() => { + cy.visit('/fixtures/shadow-dom.html') + }) + + // https://github.com/cypress-io/cypress/issues/7986 + it('does not hang', () => { + cy.get('.shadow-1', { includeShadowDom: true }).scrollIntoView() + }) + }) + describe('assertion verification', () => { beforeEach(function () { cy.on('log:added', (attrs, log) => { diff --git a/packages/driver/src/cy/commands/actions/scroll.js b/packages/driver/src/cy/commands/actions/scroll.js index 79d8bc3d2ccf..f77e9cf96b4c 100644 --- a/packages/driver/src/cy/commands/actions/scroll.js +++ b/packages/driver/src/cy/commands/actions/scroll.js @@ -7,7 +7,7 @@ const $utils = require('../../../cypress/utils') const $errUtils = require('../../../cypress/error_utils') const findScrollableParent = ($el, win) => { - const $parent = $el.parent() + const $parent = $dom.getParent($el) // if we're at the body, we just want to pass in // window into jQuery scrollTo diff --git a/packages/driver/src/dom/elements.ts b/packages/driver/src/dom/elements.ts index 8dd7ea532471..f18e46ae87ff 100644 --- a/packages/driver/src/dom/elements.ts +++ b/packages/driver/src/dom/elements.ts @@ -611,7 +611,7 @@ const isWithinShadowRoot = (node: HTMLElement) => { return isShadowRoot(node.getRootNode()) } -const getParent = (el) => { +const getParentNode = (el) => { // if the element has a direct parent element, // simply return it. if (el.parentElement) { @@ -629,9 +629,13 @@ const getParent = (el) => { return null } +const getParent = ($el: JQuery): JQuery => { + return $(getParentNode($el[0])) +} + const getAllParents = (el) => { const collectParents = (parents, node) => { - const parent = getParent(node) + const parent = getParentNode(node) if (!parent) return parents @@ -899,7 +903,7 @@ const isDescendent = ($el1, $el2) => { const findParent = (el, condition) => { const collectParent = (node) => { - const parent = getParent(node) + const parent = getParentNode(node) if (!parent) return null @@ -923,7 +927,7 @@ const getFirstFocusableEl = ($el: JQuery) => { return $el } - const parent = $el.parent() + const parent = getParent($el) // if we have no parent then just return // the window since that can receive focus @@ -933,7 +937,7 @@ const getFirstFocusableEl = ($el: JQuery) => { return $(win) } - return getFirstFocusableEl($el.parent()) + return getFirstFocusableEl(getParent($el)) } const getActiveElByDocument = ($el: JQuery): HTMLElement | null => { @@ -1245,6 +1249,12 @@ const elementFromPoint = (doc, x, y) => { return elFromPoint } +const getShadowRoot = ($el: JQuery): JQuery => { + const root = $el[0].getRootNode() + + return $(root) +} + const findAllShadowRoots = (root: Node): Node[] => { const collectRoots = (roots, nodes, node) => { const currentRoot = roots.pop() @@ -1359,4 +1369,5 @@ export { getFirstScrollableParent, getParent, getAllParents, + getShadowRoot, } From be623f356a7a56d23912e183b5f44348096fb6df Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Tue, 28 Jul 2020 10:16:09 -0400 Subject: [PATCH 2/5] fix: fix focus when ancestor of shadow element is outside shadow dom --- packages/driver/cypress/fixtures/shadow-dom.html | 5 ++++- .../cypress/integration/commands/actions/click_spec.js | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/driver/cypress/fixtures/shadow-dom.html b/packages/driver/cypress/fixtures/shadow-dom.html index ecb3ed20eeef..33506ca1989b 100644 --- a/packages/driver/cypress/fixtures/shadow-dom.html +++ b/packages/driver/cypress/fixtures/shadow-dom.html @@ -19,6 +19,9 @@
In Shadow Slot
+
+ +