From 9234288758a4b47258fdb4c06f22500d22b2f7fb Mon Sep 17 00:00:00 2001 From: Sam Kvale Date: Sat, 30 Apr 2022 10:15:18 -0500 Subject: [PATCH 1/7] feat(implicit-submit): Allow submit button to be outside of the form --- packages/driver/cypress/fixtures/dom.html | 6 ++++++ packages/driver/cypress/fixtures/form.html | 6 ++++++ .../commands/actions/type_special_chars_spec.js | 12 ++++++++++++ packages/driver/src/cy/commands/actions/type.ts | 10 +++++++++- 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/driver/cypress/fixtures/dom.html b/packages/driver/cypress/fixtures/dom.html index 6347924ceccf..684280985a15 100644 --- a/packages/driver/cypress/fixtures/dom.html +++ b/packages/driver/cypress/fixtures/dom.html @@ -323,6 +323,12 @@ +
+ + +
+ +
diff --git a/packages/driver/cypress/fixtures/form.html b/packages/driver/cypress/fixtures/form.html index 40d8b18dd285..cb61dd2082b2 100644 --- a/packages/driver/cypress/fixtures/form.html +++ b/packages/driver/cypress/fixtures/form.html @@ -86,6 +86,12 @@
+
+ + +
+ +
diff --git a/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js b/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js index 6f0b40e60b57..b851be90e01a 100644 --- a/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js +++ b/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js @@ -1511,6 +1511,18 @@ describe('src/cy/commands/actions/type - #type special chars', () => { }) }) + context('2 inputs, 1 \'submit\' element button[type=submit]', () => { + it('triggers form submit', function (done) { + this.$forms.find('#multiple-inputs-and-button-submit-outside-form').submit((e) => { + e.preventDefault() + + done() + }) + + cy.get('#multiple-inputs-and-button-submit-outside-form input:first').type('foo{enter}') + }) + }) + context(`2 inputs, 1 'submit' button[type=submit], 1 'reset' button[type=reset]`, () => { it('triggers form submit', function () { const submit = cy.stub() diff --git a/packages/driver/src/cy/commands/actions/type.ts b/packages/driver/src/cy/commands/actions/type.ts index a168ebf88160..76374177d3da 100644 --- a/packages/driver/src/cy/commands/actions/type.ts +++ b/packages/driver/src/cy/commands/actions/type.ts @@ -173,7 +173,15 @@ export default function (Commands, Cypress, cy, state, config) { const win = state('window') const getDefaultButtons = (form) => { - return form.find('input, button').filter((__, el) => { + const formId = form.attr('id') + const nestedButtons = form.find('input, button') + + const possibleDefaultButtons = formId ? $dom.wrap(_.uniq([ + ...nestedButtons, + ...cy.$$('body').find(`input[form='${formId}'], button[form='${formId}']`), + ])) : nestedButtons + + return $dom.wrap(possibleDefaultButtons).filter((__, el) => { const $el = $dom.wrap(el) return ( From a4243a6091c73a0d1d82e1da68fd9c44703c9d36 Mon Sep 17 00:00:00 2001 From: Sam Kvale Date: Sat, 30 Apr 2022 10:21:37 -0500 Subject: [PATCH 2/7] test(type-special-chars): Specify test context --- .../integration/commands/actions/type_special_chars_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js b/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js index b851be90e01a..0c9f692cd2ca 100644 --- a/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js +++ b/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js @@ -1511,7 +1511,7 @@ describe('src/cy/commands/actions/type - #type special chars', () => { }) }) - context('2 inputs, 1 \'submit\' element button[type=submit]', () => { + context('2 inputs, 1 \'submit\' element button[type=submit] outside of the form', () => { it('triggers form submit', function (done) { this.$forms.find('#multiple-inputs-and-button-submit-outside-form').submit((e) => { e.preventDefault() From ed40e89196cb99d0c993778e8882b67c29cd38d4 Mon Sep 17 00:00:00 2001 From: Sam Kvale Date: Sat, 30 Apr 2022 10:23:23 -0500 Subject: [PATCH 3/7] feat(type): Only wrap in Jquery where needed --- packages/driver/src/cy/commands/actions/type.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/driver/src/cy/commands/actions/type.ts b/packages/driver/src/cy/commands/actions/type.ts index 76374177d3da..564f92abd825 100644 --- a/packages/driver/src/cy/commands/actions/type.ts +++ b/packages/driver/src/cy/commands/actions/type.ts @@ -176,12 +176,12 @@ export default function (Commands, Cypress, cy, state, config) { const formId = form.attr('id') const nestedButtons = form.find('input, button') - const possibleDefaultButtons = formId ? $dom.wrap(_.uniq([ + const possibleDefaultButtons: JQuery = formId ? $dom.wrap(_.uniq([ ...nestedButtons, ...cy.$$('body').find(`input[form='${formId}'], button[form='${formId}']`), ])) : nestedButtons - return $dom.wrap(possibleDefaultButtons).filter((__, el) => { + return possibleDefaultButtons.filter((__, el) => { const $el = $dom.wrap(el) return ( From bd517181204467b6ab6ec852af8ba31ddf2acb91 Mon Sep 17 00:00:00 2001 From: Sam Kvale Date: Sat, 30 Apr 2022 14:02:26 -0500 Subject: [PATCH 4/7] style(tests): Cleanup test organization --- packages/driver/cypress/fixtures/form.html | 6 ----- .../actions/type_special_chars_spec.js | 22 +++++++++---------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/packages/driver/cypress/fixtures/form.html b/packages/driver/cypress/fixtures/form.html index cb61dd2082b2..40d8b18dd285 100644 --- a/packages/driver/cypress/fixtures/form.html +++ b/packages/driver/cypress/fixtures/form.html @@ -86,12 +86,6 @@ -
- - -
- -
diff --git a/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js b/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js index 0c9f692cd2ca..756fcf1867d0 100644 --- a/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js +++ b/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js @@ -1486,6 +1486,16 @@ describe('src/cy/commands/actions/type - #type special chars', () => { cy.get('#multiple-inputs-and-button-submit input:first').type('foo{enter}') }) + it('triggers form submit when the submit button is outside of the form', function (done) { + this.$forms.find('#multiple-inputs-and-button-submit-outside-form').submit((e) => { + e.preventDefault() + + done() + }) + + cy.get('#multiple-inputs-and-button-submit-outside-form input:first').type('foo{enter}') + }) + it('causes click event on the button[type=submit]', function (done) { this.$forms.find('#multiple-inputs-and-button-submit button[type=submit]').click((e) => { e.preventDefault() @@ -1511,18 +1521,6 @@ describe('src/cy/commands/actions/type - #type special chars', () => { }) }) - context('2 inputs, 1 \'submit\' element button[type=submit] outside of the form', () => { - it('triggers form submit', function (done) { - this.$forms.find('#multiple-inputs-and-button-submit-outside-form').submit((e) => { - e.preventDefault() - - done() - }) - - cy.get('#multiple-inputs-and-button-submit-outside-form input:first').type('foo{enter}') - }) - }) - context(`2 inputs, 1 'submit' button[type=submit], 1 'reset' button[type=reset]`, () => { it('triggers form submit', function () { const submit = cy.stub() From fd8211387e8f43a6b9cf6812c358e7ee11dc291f Mon Sep 17 00:00:00 2001 From: Sam Kvale Date: Mon, 2 May 2022 12:54:19 -0500 Subject: [PATCH 5/7] Update packages/driver/src/cy/commands/actions/type.ts --- packages/driver/src/cy/commands/actions/type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/driver/src/cy/commands/actions/type.ts b/packages/driver/src/cy/commands/actions/type.ts index 564f92abd825..c5cc3fc1deca 100644 --- a/packages/driver/src/cy/commands/actions/type.ts +++ b/packages/driver/src/cy/commands/actions/type.ts @@ -178,7 +178,7 @@ export default function (Commands, Cypress, cy, state, config) { const possibleDefaultButtons: JQuery = formId ? $dom.wrap(_.uniq([ ...nestedButtons, - ...cy.$$('body').find(`input[form='${formId}'], button[form='${formId}']`), + ...$dom.query('body', form.attr('ownerDocument')).find(`input[form='${formId}'], button[form='${formId}']`), ])) : nestedButtons return possibleDefaultButtons.filter((__, el) => { From 97473e0b7b1f0e4a0c6711c156ae4232f354db93 Mon Sep 17 00:00:00 2001 From: Sam Kvale Date: Mon, 2 May 2022 12:54:31 -0500 Subject: [PATCH 6/7] Update packages/driver/src/cy/commands/actions/type.ts Co-authored-by: Zach Bloomquist --- packages/driver/src/cy/commands/actions/type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/driver/src/cy/commands/actions/type.ts b/packages/driver/src/cy/commands/actions/type.ts index c5cc3fc1deca..d79878567fd7 100644 --- a/packages/driver/src/cy/commands/actions/type.ts +++ b/packages/driver/src/cy/commands/actions/type.ts @@ -173,7 +173,7 @@ export default function (Commands, Cypress, cy, state, config) { const win = state('window') const getDefaultButtons = (form) => { - const formId = form.attr('id') + const formId = CSS.escape(form.attr('id')) const nestedButtons = form.find('input, button') const possibleDefaultButtons: JQuery = formId ? $dom.wrap(_.uniq([ From cc91c825636cd6a591ac69e94a6808307061e69b Mon Sep 17 00:00:00 2001 From: Sam Kvale Date: Mon, 2 May 2022 16:39:00 -0500 Subject: [PATCH 7/7] fix(implicit-submit): Use form.prop for ownerDocument and test special ids --- packages/driver/cypress/fixtures/dom.html | 4 ++-- .../integration/commands/actions/type_special_chars_spec.js | 4 ++-- packages/driver/src/cy/commands/actions/type.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/driver/cypress/fixtures/dom.html b/packages/driver/cypress/fixtures/dom.html index 684280985a15..819fc05167a9 100644 --- a/packages/driver/cypress/fixtures/dom.html +++ b/packages/driver/cypress/fixtures/dom.html @@ -323,11 +323,11 @@ -
+
- +
diff --git a/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js b/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js index 756fcf1867d0..4296e08897ee 100644 --- a/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js +++ b/packages/driver/cypress/integration/commands/actions/type_special_chars_spec.js @@ -1487,13 +1487,13 @@ describe('src/cy/commands/actions/type - #type special chars', () => { }) it('triggers form submit when the submit button is outside of the form', function (done) { - this.$forms.find('#multiple-inputs-and-button-submit-outside-form').submit((e) => { + this.$forms.find('[id="multiple-inputs-and-button-submit.outside-form"]').submit((e) => { e.preventDefault() done() }) - cy.get('#multiple-inputs-and-button-submit-outside-form input:first').type('foo{enter}') + cy.get('[id="multiple-inputs-and-button-submit.outside-form"] input:first').type('foo{enter}') }) it('causes click event on the button[type=submit]', function (done) { diff --git a/packages/driver/src/cy/commands/actions/type.ts b/packages/driver/src/cy/commands/actions/type.ts index d79878567fd7..7d4753e79794 100644 --- a/packages/driver/src/cy/commands/actions/type.ts +++ b/packages/driver/src/cy/commands/actions/type.ts @@ -178,7 +178,7 @@ export default function (Commands, Cypress, cy, state, config) { const possibleDefaultButtons: JQuery = formId ? $dom.wrap(_.uniq([ ...nestedButtons, - ...$dom.query('body', form.attr('ownerDocument')).find(`input[form='${formId}'], button[form='${formId}']`), + ...$dom.query('body', form.prop('ownerDocument')).find(`input[form="${formId}"], button[form="${formId}"]`), ])) : nestedButtons return possibleDefaultButtons.filter((__, el) => {