diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md
index b77d1b2b1857..31684f940332 100644
--- a/cli/CHANGELOG.md
+++ b/cli/CHANGELOG.md
@@ -9,6 +9,7 @@ _Released 5/7/2024 (PENDING)_
**Bugfixes:**
+- Fixed a bug where promises rejected with `undefined` were failing inside `cy.origin()`. Addresses [#23937](https://github.com/cypress-io/cypress/issues/23937).
- We now pass the same default Chromium flags to Electron as we do to Chrome. As a result of this change, the application under test's `navigator.webdriver` property will now correctly be `true` when testing in Electron. Fixes [#27939](https://github.com/cypress-io/cypress/issues/27939).
**Misc:**
diff --git a/packages/driver/cypress/e2e/issues/23927.cy.js b/packages/driver/cypress/e2e/issues/23927.cy.js
new file mode 100644
index 000000000000..bd9cf31c490f
--- /dev/null
+++ b/packages/driver/cypress/e2e/issues/23927.cy.js
@@ -0,0 +1,15 @@
+// https://github.com/cypress-io/cypress/issues/23927
+describe('issue 23927', { browser: '!webkit' }, () => {
+ it('Fails gracefully if origin page throws undefined', () => {
+ cy.visit('http://barbaz.com:3500/fixtures/generic.html')
+ cy.origin('http://foobar.com:3500', () => {
+ Cypress.on('uncaught:exception', (err, runnable) => {
+ expect(err.message).to.contain('An unknown error has occurred: undefined')
+
+ return false
+ })
+
+ cy.visit('http://foobar.com:3500/fixtures/throws-undefined.html')
+ })
+ })
+})
diff --git a/packages/driver/cypress/fixtures/throws-undefined.html b/packages/driver/cypress/fixtures/throws-undefined.html
new file mode 100644
index 000000000000..9b5a29551194
--- /dev/null
+++ b/packages/driver/cypress/fixtures/throws-undefined.html
@@ -0,0 +1,13 @@
+
+
+
+ Promise.reject undefined
+
+
+
+ I am going to reject undefined in the document
+
+
+
\ No newline at end of file
diff --git a/packages/driver/src/cypress/error_utils.ts b/packages/driver/src/cypress/error_utils.ts
index 9389a2cec8b3..26045f87f379 100644
--- a/packages/driver/src/cypress/error_utils.ts
+++ b/packages/driver/src/cypress/error_utils.ts
@@ -188,23 +188,34 @@ const appendErrMsg = (err, errMsg) => {
})
}
-const makeErrFromObj = (obj) => {
+const makeErrFromObj = (obj: any) => {
if (_.isString(obj)) {
return new Error(obj)
}
- const err2 = new Error(obj.message)
+ if (_.isObject(obj) && _.isString((obj as any).message) && _.isString((obj as any).name)) {
+ obj = obj as {
+ message: string
+ name: string
+ stack?: string
+ }
- err2.name = obj.name
- err2.stack = obj.stack
+ const err2 = new Error(obj.message)
- _.each(obj, (val, prop) => {
- if (!err2[prop]) {
- err2[prop] = val
- }
- })
+ err2.name = (obj as any).name
+ err2.stack = (obj as any).stack
+
+ _.each(obj, (val, prop) => {
+ if (!err2[prop]) {
+ err2[prop] = val
+ }
+ })
+
+ return err2
+ }
- return err2
+ // handle all other errors gracefully (e.g. a promise is rejected with undefined)
+ return new Error(`An unknown error has occurred: ${obj}`)
}
const makeErrFromErr = (err, options: any = {}) => {
diff --git a/yarn.lock b/yarn.lock
index 2356fc0b7ff7..f679e20e25e3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -14334,10 +14334,10 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-ejs@^3.1.7, ejs@^3.1.8:
- version "3.1.9"
- resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361"
- integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==
+ejs@^3.1.10, ejs@^3.1.7:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b"
+ integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==
dependencies:
jake "^10.8.5"