diff --git a/packages/driver/cypress/integration/e2e/multidomain_rerun_spec.ts b/packages/driver/cypress/integration/e2e/multidomain_rerun_spec.ts new file mode 100644 index 000000000000..0e103e5ef3c4 --- /dev/null +++ b/packages/driver/cypress/integration/e2e/multidomain_rerun_spec.ts @@ -0,0 +1,35 @@ +describe('multidomain - rerun', () => { + beforeEach(() => { + cy.visit('/fixtures/multidomain.html') + // @ts-ignore + cy.anticipateMultidomain() + cy.get('a').click() + }) + + // this test will hang without the fix for multidomain rerun + // https://github.com/cypress-io/cypress/issues/18043 + it('successfully reruns tests', () => { + // @ts-ignore + cy.switchToDomain('127.0.0.1:3501', () => { + cy.get('[data-cy="dom-check"]') + }) + .then(() => { + const top = window.top! + const { hash } = top.location + + // @ts-ignore + if (!top.hasRunOnce) { + // @ts-ignore + top.hasRunOnce = true + + // hashchange causes the test to rerun + top.location.hash = `${hash}?rerun` + + return + } + + // this only executes after the test has been rerun + expect(true).to.be.true + }) + }) +}) diff --git a/packages/driver/src/cy/multidomain/index.ts b/packages/driver/src/cy/multidomain/index.ts index 377a1abe355f..32ed8d230838 100644 --- a/packages/driver/src/cy/multidomain/index.ts +++ b/packages/driver/src/cy/multidomain/index.ts @@ -2,8 +2,6 @@ import Bluebird from 'bluebird' import $Log from '../../cypress/log' import { createDeferred } from '../../util/deferred' -const readiedDomains = {} - export function addCommands (Commands, Cypress: Cypress.Cypress, cy: Cypress.cy, state: Cypress.State) { Commands.addAll({ // this is a stop-gap command temporarily in use until looking ahead for @@ -14,17 +12,8 @@ export function addCommands (Commands, Cypress: Cypress.Cypress, cy: Cypress.cy, state('anticipateMultidomain', true) return new Bluebird((resolve) => { - // the spec bridge iframe only loads once, and that's when it sends - // 'cross:domain:bridge:ready', so if we've already readied it, - // there's no need to wait - if (readiedDomains[domain]) { - return resolve() - } - // @ts-ignore Cypress.once('cross:domain:bridge:ready', () => { - readiedDomains[domain] = true - resolve() }) diff --git a/packages/runner-shared/src/event-manager.js b/packages/runner-shared/src/event-manager.js index a28323ded739..e1766ac9959b 100644 --- a/packages/runner-shared/src/event-manager.js +++ b/packages/runner-shared/src/event-manager.js @@ -623,6 +623,10 @@ export const eventManager = { ws.emit('spec:changed', specFile) }, + notifyCrossDomainBridgeReady () { + Cypress.emit('cross:domain:bridge:ready') + }, + focusTests () { ws.emit('focus:tests') }, diff --git a/packages/runner/src/iframe/iframes.jsx b/packages/runner/src/iframe/iframes.jsx index 3cf90dabf9e6..e906125bd1b2 100644 --- a/packages/runner/src/iframe/iframes.jsx +++ b/packages/runner/src/iframe/iframes.jsx @@ -172,7 +172,11 @@ export default class Iframes extends Component { const id = `Cypress (${domain})` // if it already exists, don't add another one - if (document.getElementById(id)) return + if (document.getElementById(id)) { + this.props.eventManager.notifyCrossDomainBridgeReady() + + return + } this._addIframe({ id,