From 418e9005b1060263067a113c7415307bced45afb Mon Sep 17 00:00:00 2001 From: Roma Sosnovsky Date: Mon, 10 Nov 2025 12:01:56 +0200 Subject: [PATCH 01/17] run live tests --- package-lock.json | 141 ++++++++++++---------------------------------- 1 file changed, 37 insertions(+), 104 deletions(-) diff --git a/package-lock.json b/package-lock.json index eaf5dcb9be7..67b0db53083 100644 --- a/package-lock.json +++ b/package-lock.json @@ -155,6 +155,7 @@ "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@keyv/serialize": "^1.1.1" } @@ -195,6 +196,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -218,6 +220,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -647,7 +650,6 @@ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" @@ -659,7 +661,6 @@ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.0.0" } @@ -670,7 +671,6 @@ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -681,8 +681,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", @@ -690,7 +689,6 @@ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1110,7 +1108,6 @@ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -1122,7 +1119,6 @@ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -1221,6 +1217,7 @@ "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -1301,6 +1298,7 @@ "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", @@ -1526,7 +1524,6 @@ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -1537,24 +1534,21 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", @@ -1562,7 +1556,6 @@ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -1574,8 +1567,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", @@ -1583,7 +1575,6 @@ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -1597,7 +1588,6 @@ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1608,7 +1598,6 @@ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -1618,8 +1607,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", @@ -1627,7 +1615,6 @@ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -1645,7 +1632,6 @@ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -1660,7 +1646,6 @@ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -1674,7 +1659,6 @@ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -1690,7 +1674,6 @@ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -1748,16 +1731,14 @@ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@zxcvbn-ts/core": { "version": "3.0.4", @@ -1786,6 +1767,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1799,7 +1781,6 @@ "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.13.0" }, @@ -2257,29 +2238,6 @@ "dev": true, "license": "MIT" }, - "node_modules/addons-linter/node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/addons-linter/node_modules/pino": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/pino/-/pino-9.13.0.tgz", @@ -2396,7 +2354,6 @@ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -2415,7 +2372,6 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2432,8 +2388,7 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ansi-align": { "version": "3.0.1", @@ -2938,7 +2893,6 @@ "integrity": "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "baseline-browser-mapping": "dist/cli.js" } @@ -3277,8 +3231,7 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0", - "peer": true + "license": "CC-BY-4.0" }, "node_modules/cbor": { "version": "8.1.0", @@ -3299,6 +3252,7 @@ "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -3478,7 +3432,6 @@ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.0" } @@ -4281,7 +4234,8 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz", "integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/dir-glob": { "version": "3.0.1", @@ -4455,8 +4409,7 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.240.tgz", "integrity": "sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/emittery": { "version": "1.2.0", @@ -4518,7 +4471,6 @@ "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -4610,8 +4562,7 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -4697,6 +4648,7 @@ "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5022,7 +4974,6 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.x" } @@ -6516,7 +6467,6 @@ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -6532,7 +6482,6 @@ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -6557,7 +6506,8 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/js-string-escape": { "version": "1.0.1", @@ -6852,7 +6802,8 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.2.tgz", "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lint-staged": { "version": "16.2.6", @@ -6983,7 +6934,6 @@ "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.11.5" }, @@ -7282,8 +7232,7 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", @@ -7313,7 +7262,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -7324,7 +7272,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -7472,8 +7419,7 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", @@ -7554,8 +7500,7 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/nodemailer": { "version": "7.0.9", @@ -8389,6 +8334,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -8442,6 +8388,7 @@ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8729,7 +8676,6 @@ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -9071,7 +9017,6 @@ "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -9110,7 +9055,6 @@ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -9123,8 +9067,7 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/selderee": { "version": "0.11.0", @@ -9174,7 +9117,6 @@ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -10263,7 +10205,6 @@ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -10315,7 +10256,6 @@ "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -10335,7 +10275,6 @@ "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -10370,8 +10309,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/text-decoder": { "version": "1.2.3", @@ -10482,8 +10420,7 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/ts-api-utils": { "version": "2.1.0", @@ -10561,6 +10498,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10669,7 +10607,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -10873,8 +10810,7 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true + "optional": true }, "node_modules/webpack": { "version": "5.102.1", @@ -10932,6 +10868,7 @@ "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.6.1", "@webpack-cli/configtest": "^3.0.1", @@ -11000,7 +10937,6 @@ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.13.0" } @@ -11011,7 +10947,6 @@ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -11026,7 +10961,6 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.0" } @@ -11071,7 +11005,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" From c56e4f98022a8c1b246b91ee6c911b34a399e84f Mon Sep 17 00:00:00 2001 From: Roma Sosnovsky Date: Mon, 10 Nov 2025 13:50:14 +0200 Subject: [PATCH 02/17] skip some live tests --- test/source/tests/gmail.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index 070308c19a7..9b2d8a237dd 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -111,7 +111,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gmailPage.goto(url); }; - test( + test.skip( 'mail.google.com/chat', testWithBrowser(async (t, browser) => { const settingsPage = await BrowserRecipe.openSettingsLoginButCloseOauthWindowBeforeGrantingPermission(t, browser, 'ci.tests.gmail@flowcrypt.dev'); @@ -149,7 +149,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test ) ); - test( + test.skip( 'mail.google.com - back button works in offline mode', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -242,7 +242,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test( + test.skip( 'mail.google.com - Thunderbird signature [plain] is recognized + correct height', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -289,7 +289,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test ); // draft-sensitive test - test.serial( + test.skip( 'mail.google.com - saving and rendering compose drafts when offline', testWithBrowser( async (t, browser) => { @@ -358,7 +358,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test ); // draft-sensitive test - test.serial( + test.skip( 'mail.google.com - multiple compose windows, saving/opening compose draft', testWithBrowser( async (t, browser) => { @@ -581,7 +581,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test ); // convo-sensitive, draft-sensitive test - test.serial( + test.skip( 'mail.google.com - plain reply draft', testWithBrowser( async (t, browser) => { @@ -647,7 +647,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test( + test.skip( `mail.google.com - large clipped PGP/MIME encrypted message rendered correctly`, testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); From f20a57c063196a1712260354edeac1824fee2d0a Mon Sep 17 00:00:00 2001 From: Roma Sosnovsky Date: Mon, 10 Nov 2025 14:06:51 +0200 Subject: [PATCH 03/17] =?UTF-8?q?update=20=E2=80=9Cdownload=20all=20attach?= =?UTF-8?q?ments=E2=80=9D=20button=20selector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content_scripts/webmail/gmail/gmail-element-replacer.ts | 4 ++-- test/source/tests/gmail.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts b/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts index 56b6979546f..08dc3131018 100644 --- a/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts +++ b/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts @@ -67,7 +67,7 @@ export class GmailElementReplacer extends WebmailElementReplacer { standardComposeRecipient: 'div.az9 span[email][data-hovercard-id]', numberOfAttachments: '.aVW', numberOfAttachmentsLabel: '.aVW span:first-child', - attachmentsButtons: '.aZi', + downloadAllAttachmentsButton: '.aZi, .pYTkkf-JX-ano', draftsList: '.ae4', }; @@ -559,7 +559,7 @@ export class GmailElementReplacer extends WebmailElementReplacer { } if (nRenderedAttachments !== attachments.length) { // according to #4200, no point in showing "download all" button if at least one attachment is encrypted etc. - $(this.sel.attachmentsButtons).hide(); + $(this.sel.downloadAllAttachmentsButton).hide(); } if (nRenderedAttachments === 0) { attachmentsContainerInner.parents(this.sel.attachmentsContainerOuter).first().hide(); diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index 9b2d8a237dd..52c800d1e59 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -180,7 +180,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gotoGmailPage(gmailPage, '/KtbxLvHkSWwbVHxgCbWNvXVKGjFgqMbGQq'); await Util.sleep(5); await gmailPage.waitAll('iframe'); - await gmailPage.waitAll(['.aZi'], { visible: true }); + await gmailPage.waitAll(['.pYTkkf-JX-ano'], { visible: true }); // attachments which contain emoji in filename are rendered correctly await gotoGmailPage(gmailPage, '/FMfcgzGtwqFGhMwWtLRjkPJlQlZHSlrW'); @@ -621,7 +621,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await Util.sleep(5); await gmailPage.waitAll('iframe'); expect(await gmailPage.isElementPresent('@container-attachments')).to.equal(false); - await gmailPage.waitAll(['.aZi'], { visible: false }); + await gmailPage.waitAll(['.pYTkkf-JX-ano'], { visible: false }); expect(await gmailPage.isElementVisible('.aQH')).to.equal(false); // original attachment container(s) should be hidden await gmailPage.close(); }) @@ -642,7 +642,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await Util.sleep(5); await gmailPage.waitAll('iframe'); expect(await gmailPage.isElementPresent('@container-attachments')).to.equal(false); - await gmailPage.waitAll(['.aZi'], { visible: false }); + await gmailPage.waitAll(['.pYTkkf-JX-ano'], { visible: false }); await gmailPage.close(); }) ); From df7ebc074c69e5d43c2f5d3396349d6c4e0dbebb Mon Sep 17 00:00:00 2001 From: Roma Sosnovsky Date: Mon, 10 Nov 2025 14:28:02 +0200 Subject: [PATCH 04/17] =?UTF-8?q?update=20selector=20for=20=E2=80=9Cmore?= =?UTF-8?q?=E2=80=9D=20message=20button?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/source/tests/gmail.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index 52c800d1e59..6ac0cc30846 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -494,7 +494,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gmailPage.waitAndClick('[data-tooltip="Reply"]', { delay: 1 }); await gotoGmailPage(gmailPage, '/FMfcgzGtwgfMhWTlgRwwKWzRhqNZzwXz'); // go to encrypted convo await Util.sleep(5); - await gmailPage.waitAndClick('.adn [data-tooltip="More"]', { delay: 1 }); + await gmailPage.waitAndClick('.adn [aria-label="More message options"]', { delay: 1 }); await gmailPage.waitAndClick('[act="24"]', { delay: 1 }); // click reply-all await Util.sleep(3); await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box @@ -518,7 +518,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); const gmailPage = await openGmailPage(t, browser); await gotoGmailPage(gmailPage, '/FMfcgzQZTMHNLflWQjRcSvWlMsKbLhpr'); - await gmailPage.waitAndClick('.adn [data-tooltip="More"]', { delay: 1 }); + await gmailPage.waitAndClick('.adn [aria-label="More message options"]', { delay: 1 }); await gmailPage.waitAll('.action_reply_all_message_button'); }) ); @@ -531,7 +531,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test const gmailPage = await openGmailPage(t, browser); await gotoGmailPage(gmailPage, '/FMfcgzGtwgfMhWTlgRwwKWzRhqNZzwXz'); // go to encrypted convo await Util.sleep(5); - await gmailPage.waitAndClick('.adn [data-tooltip="More"]', { delay: 1 }); + await gmailPage.waitAndClick('.adn [aria-label="More message options"]', { delay: 1 }); await gmailPage.waitAndClick('[act="25"]', { delay: 1 }); // click forward await Util.sleep(3); await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box From a5bfb1e1394151b01ce032437d15ec9617e793e9 Mon Sep 17 00:00:00 2001 From: Roma Sosnovsky Date: Mon, 10 Nov 2025 14:51:03 +0200 Subject: [PATCH 05/17] fix data-tooltip --- test/source/tests/gmail.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index 6ac0cc30846..1f2dd68884e 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -190,7 +190,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test const urls2 = await gmailPage.getFramesUrls(['/chrome/elements/attachment.htm']); expect(urls2.length).to.equal(2); expect(await gmailPage.waitForContent('.aVW span:first-child', '2')); - expect(await gmailPage.waitForContent('.aVW span.a2H', ' • Scanned by Gmail')); + expect(await gmailPage.waitForContent('.aVW span.a2H', ' • Scanned by Gmail')); await gmailPage.close(); }) ); @@ -405,10 +405,10 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); let gmailPage = await openGmailPage(t, browser, '/FMfcgzGkbDRNgcQxLmkhBCKVSFwkfdvV'); // plain convo - await gmailPage.waitAndClick('[data-tooltip="Reply"]', { delay: 1 }); + await gmailPage.waitAndClick('[aria-label="Reply"]', { delay: 1 }); await gmailPage.close(); gmailPage = await openGmailPage(t, browser, '/181d226b4e69f172'); // go to encrypted convo - await gmailPage.waitAndClick('[data-tooltip="Reply"]', { delay: 1 }); + await gmailPage.waitAndClick('[aria-label="Reply"]', { delay: 1 }); await gmailPage.waitTillGone('.reply_message'); await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box await gmailPage.waitForContent( @@ -419,7 +419,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gmailPage.waitAll('.reply_message'); await pageHasSecureReplyContainer(t, browser, gmailPage, { isReplyPromptAccepted: true }); await gotoGmailPage(gmailPage, '/FMfcgzGkbDRNpjDdNvCrwzqvXspZZxvh'); // go to signed convo - await gmailPage.waitAndClick('[data-tooltip="Reply"]', { delay: 1 }); + await gmailPage.waitAndClick('[aria-label="Reply"]', { delay: 1 }); await gmailPage.waitTillGone('.reply_message'); await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box await gmailPage.notPresent('.reply_message_evaluated .error_notification'); // should not show the warning about switching to encrypted reply @@ -438,7 +438,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gmailPage.waitAndClick('[role="listitem"] .adf.ads', { delay: 1 }); // click first message of thread await Util.sleep(3); const messages = await gmailPage.target.$$('[role="listitem"] .adn.ads'); - const plainReplyButton = await messages[0].$('[data-tooltip="Reply"]'); + const plainReplyButton = await messages[0].$('[aria-label="Reply"]'); await Util.sleep(1); await plainReplyButton!.click(); await gmailPage.waitAndClick('#switch_to_encrypted_reply'); // Switch to encrypted compose @@ -467,7 +467,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test const messages = await gmailPage.target.$$('[role="listitem"] .adn.ads'); expect(messages.length).to.equal(2); - const plainReplyButton = await messages[0].$('[data-tooltip="Reply"]'); + const plainReplyButton = await messages[0].$('[aria-label="Reply"]'); expect(plainReplyButton).to.be.ok; await Util.sleep(1); await plainReplyButton!.click(); @@ -491,7 +491,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); const gmailPage = await openGmailPage(t, browser); await gotoGmailPage(gmailPage, '/FMfcgzGkbDRNgcQxLmkhBCKVSFwkfdvV'); // plain convo - await gmailPage.waitAndClick('[data-tooltip="Reply"]', { delay: 1 }); + await gmailPage.waitAndClick('[aria-label="Reply"]', { delay: 1 }); await gotoGmailPage(gmailPage, '/FMfcgzGtwgfMhWTlgRwwKWzRhqNZzwXz'); // go to encrypted convo await Util.sleep(5); await gmailPage.waitAndClick('.adn [aria-label="More message options"]', { delay: 1 }); @@ -589,7 +589,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test const threadId = '181d226b4e69f172'; // 1st message -- thread id const gmailPage = await openGmailPage(t, browser, `/${threadId}`); await GmailPageRecipe.trimConvo(gmailPage, threadId); - await gmailPage.waitAndClick('[data-tooltip="Reply"]', { delay: 5 }); + await gmailPage.waitAndClick('[aria-label="Reply"]', { delay: 5 }); t.timeout(minutes(2)); // extend ava's timeout await Util.sleep(5); await gmailPage.waitTillFocusIsIn('div[aria-label="Message Body"]', { timeout: 10 }); From e641157392ddd60874fe2cf0e59a7347091c43b5 Mon Sep 17 00:00:00 2001 From: Roma Sosnovsky Date: Mon, 10 Nov 2025 16:36:51 +0200 Subject: [PATCH 06/17] fix test --- test/source/tests/gmail.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index 1f2dd68884e..927b0d79c32 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -190,12 +190,12 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test const urls2 = await gmailPage.getFramesUrls(['/chrome/elements/attachment.htm']); expect(urls2.length).to.equal(2); expect(await gmailPage.waitForContent('.aVW span:first-child', '2')); - expect(await gmailPage.waitForContent('.aVW span.a2H', ' • Scanned by Gmail')); + expect(await gmailPage.waitForContent('.aVW span.a2H', '  •  Scanned by Gmail')); await gmailPage.close(); }) ); - test( + test.skip( 'mail.google.com - msg.asc message content renders', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -215,7 +215,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test( + test.skip( 'mail.google.com - Thunderbird signature [html] is recognized', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -665,7 +665,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test( + test.skip( `mail.google.com - render plain text for "message" attachment (which has plain text)`, testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -680,7 +680,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test( + test.skip( 'mail.google.com - pubkey file gets rendered', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); From 1176d1fbfe84105aa98aa68ee0dd96a42f189ea8 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 02:00:42 -0300 Subject: [PATCH 07/17] fix: secure reply buttons insert in gmail page --- extension/css/webmail.css | 3 +- .../webmail/gmail/gmail-element-replacer.ts | 63 ++++++++++++++----- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/extension/css/webmail.css b/extension/css/webmail.css index eede1d13e4d..bddcc63f0de 100644 --- a/extension/css/webmail.css +++ b/extension/css/webmail.css @@ -190,8 +190,7 @@ body.cryptup_gmail .inserted div.reply_message_button { display: inline-flex; padding: 20px 12px 0 10px; opacity: 0.75; - margin-left: 18px; - margin-right: 8px; + margin: 0; height: auto; } diff --git a/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts b/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts index 56b6979546f..2e9bcd6c3be 100644 --- a/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts +++ b/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts @@ -56,8 +56,8 @@ export class GmailElementReplacer extends WebmailElementReplacer { msgInner: 'div.a3s:visible:not(.undefined), .message_inner_body:visible', msgInnerText: 'table.cf.An', msgInnerContainingPgp: "div.a3s:not(.undefined):contains('" + PgpArmor.headers('null').begin + "')", - msgActionsBtn: '.J-J5-Ji.aap', - msgActionsMenu: '.b7.J-M', + msgActionsBtn: '.Wsq5Cf', + msgActionsMenu: '.tB5Jxf-M-S5Cmsd, ul.aqdrmf-Kf[role="menu"]', attachmentsContainerOuter: 'div.hq.gt', attachmentsContainerInner: 'div.aQH', translatePrompt: '.adI, .wl4W9b', @@ -297,8 +297,8 @@ export class GmailElementReplacer extends WebmailElementReplacer { return !!$('iframe.pgp_block').filter(':visible').length; }; - private addMenuButton = (replyOption: ReplyOption, gmailContextMenuBtn: string) => { - if ($(gmailContextMenuBtn).is(':visible') && !document.querySelector(`.action_${replyOption.replace('a_', '')}_message_button`)) { + private addMenuButton = (replyOption: ReplyOption, gmailContextMenuBtn: Element | null) => { + if (gmailContextMenuBtn && $(gmailContextMenuBtn).is(':visible') && !document.querySelector(`.action_${replyOption.replace('a_', '')}_message_button`)) { const button = $(this.factory.btnSecureMenuBtn(replyOption)).insertAfter(gmailContextMenuBtn); // xss-safe-factory button.on( 'click', @@ -323,7 +323,7 @@ export class GmailElementReplacer extends WebmailElementReplacer { // only replace the last one FlowCrypt reply button if does not have any buttons replaced yet, and only replace the last one for (const elem of convoReplyBtnsArr) { $(elem).addClass('inserted'); - const gmailReplyBtn = $(elem).find('.aaq.L3'); + const gmailReplyBtn = $(elem).find('.DILLkc'); const secureReplyBtn = $(this.factory.btnSecureReply()).insertAfter(gmailReplyBtn); // xss-safe-factory secureReplyBtn.addClass(gmailReplyBtn.attr('class') || ''); secureReplyBtn.off(); @@ -391,7 +391,7 @@ export class GmailElementReplacer extends WebmailElementReplacer { return; } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const messageContainer = secureReplyInvokedFromMenu ? $('.T-I-JO.T-I-Kq').closest('.h7') : $(btn.closest('.h7')!); + const messageContainer = secureReplyInvokedFromMenu ? $('.ii.gt').closest('div.h7') : $(btn.closest('.h7')!); if (messageContainer.is(':last-child')) { if (this.isEncrypted()) { await this.setReplyBoxEditable(replyOption); @@ -402,8 +402,7 @@ export class GmailElementReplacer extends WebmailElementReplacer { this.insertEncryptedReplyBox(messageContainer, replyOption); } if (secureReplyInvokedFromMenu) { - $(this.sel.msgActionsBtn).removeClass('T-I-JO T-I-Kq'); - $(this.sel.msgActionsMenu).hide(); + $(this.sel.msgActionsBtn).trigger('click'); } }; @@ -638,7 +637,23 @@ export class GmailElementReplacer extends WebmailElementReplacer { }; private getConvoRootEl = (anyInnerElement: HTMLElement) => { - return $(anyInnerElement).closest('div.if, div.aHU, td.Bu').first(); + const ancestorConvoRoot = $(anyInnerElement).closest('div.if, div.aHU, td.Bu'); + if (ancestorConvoRoot.length) { + return ancestorConvoRoot.first(); + } + + // New Gmail structure: conversation root might be a sibling + // Navigate to common parent container and find conversation root + const commonParent = $(anyInnerElement).closest('.nH.a98.iY, .if'); + if (commonParent.length) { + const siblingConvoRoot = commonParent.find('div.if, div.aHU, td.Bu').first(); + if (siblingConvoRoot.length) { + return siblingConvoRoot; + } + } + + // Fallback: return empty jQuery object to maintain consistent return type + return $(); }; private insertEncryptedReplyBox = (messageContainer: JQuery, replyOption: ReplyOption) => { @@ -655,7 +670,7 @@ export class GmailElementReplacer extends WebmailElementReplacer { private replaceStandardReplyBox = async (msgId?: string, force = false) => { const legacyDraftReplyRegex = new RegExp(/\[(flowcrypt|cryptup):link:draft_reply:([0-9a-fr\-]+)]/); - const newReplyBoxes = $('div.nr.tMHS5d, td.amr > div.nr, div.gA td.I5').not('.reply_message_evaluated').filter(':visible').get(); + const newReplyBoxes = $('div.nr.tMHS5d, div.gA td.I5, div.amr > div.nr').not('.reply_message_evaluated').filter(':visible').get(); if (newReplyBoxes.length) { // removing this line will cause unexpected draft creation bug reappear // https://github.com/FlowCrypt/flowcrypt-browser/issues/5616#issuecomment-1972897692 @@ -946,27 +961,41 @@ export class GmailElementReplacer extends WebmailElementReplacer { * * Issue: https://github.com/FlowCrypt/flowcrypt-browser/issues/5933 */ - const messageContainer = $('.T-I-JO.T-I-Kq').closest('.h7'); + // Find the active message menu + const visibleMenu = Array.from(document.querySelectorAll(this.sel.msgActionsMenu)).find( + menu => window.getComputedStyle(menu).display !== 'none' && (menu as HTMLElement).offsetParent + ); + if (!visibleMenu) { + return; + } + + // Find the message container from the menu's position or context + const messageContainer = $('div.h7:visible').last(); // Get the last visible message container const msgIdElement = messageContainer.find('[data-legacy-message-id], [data-message-id]'); const msgId = msgIdElement.attr('data-legacy-message-id') || msgIdElement.attr('data-message-id'); - const replyAllMenuButton = document.querySelector('#r2'); + + // New Gmail uses data-action-type attributes + const replyButton = visibleMenu.querySelector('li[data-action-type="94"]'); + const forwardButton = visibleMenu.querySelector('li[data-action-type="25"]'); + const replyAllButton = visibleMenu.querySelector('li[data-action-type="95"]'); // Estimated based on pattern + // Cannot use jQuery $('#r2').is(':visible') because the element is considered invisible if its parent has display: none. - if (replyAllMenuButton && window.getComputedStyle(replyAllMenuButton).display !== 'none') { - this.addMenuButton('a_reply_all', '#r2'); + if (replyAllButton && window.getComputedStyle(replyAllButton).display !== 'none') { + this.addMenuButton('a_reply_all', replyAllButton); } else if (msgId) { try { const gmailMsg = await this.emailProvider.msgGet(msgId, 'metadata'); const replyMeta = GmailParser.determineReplyMeta(this.acctEmail, [], gmailMsg); if (replyMeta.to.length > 1) { - this.addMenuButton('a_reply_all', '#r'); + this.addMenuButton('a_reply_all', replyButton); } } catch (error) { console.error(`Failed to retrieve message metadata for ID ${msgId}:`, error); } } - this.addMenuButton('a_reply', '#r'); - this.addMenuButton('a_forward', '#r3'); + this.addMenuButton('a_reply', replyButton); + this.addMenuButton('a_forward', forwardButton); }; } From 026b271acdf27f0d04619521081b22aab1677ce7 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 02:58:56 -0500 Subject: [PATCH 08/17] fix: test --- test/source/tests/gmail.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index 927b0d79c32..ab96cda71dc 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -405,10 +405,10 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); let gmailPage = await openGmailPage(t, browser, '/FMfcgzGkbDRNgcQxLmkhBCKVSFwkfdvV'); // plain convo - await gmailPage.waitAndClick('[aria-label="Reply"]', { delay: 1 }); + await gmailPage.waitAndClick('div.adn [aria-label="Reply"]', { delay: 1 }); await gmailPage.close(); gmailPage = await openGmailPage(t, browser, '/181d226b4e69f172'); // go to encrypted convo - await gmailPage.waitAndClick('[aria-label="Reply"]', { delay: 1 }); + await gmailPage.waitAndClick('div.adn [aria-label="Reply"]', { delay: 1 }); await gmailPage.waitTillGone('.reply_message'); await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box await gmailPage.waitForContent( @@ -419,7 +419,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gmailPage.waitAll('.reply_message'); await pageHasSecureReplyContainer(t, browser, gmailPage, { isReplyPromptAccepted: true }); await gotoGmailPage(gmailPage, '/FMfcgzGkbDRNpjDdNvCrwzqvXspZZxvh'); // go to signed convo - await gmailPage.waitAndClick('[aria-label="Reply"]', { delay: 1 }); + await gmailPage.waitAndClick('div.adn [aria-label="Reply"]', { delay: 1 }); await gmailPage.waitTillGone('.reply_message'); await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box await gmailPage.notPresent('.reply_message_evaluated .error_notification'); // should not show the warning about switching to encrypted reply @@ -491,7 +491,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); const gmailPage = await openGmailPage(t, browser); await gotoGmailPage(gmailPage, '/FMfcgzGkbDRNgcQxLmkhBCKVSFwkfdvV'); // plain convo - await gmailPage.waitAndClick('[aria-label="Reply"]', { delay: 1 }); + await gmailPage.waitAndClick('div.adn [aria-label="Reply"]', { delay: 1 }); await gotoGmailPage(gmailPage, '/FMfcgzGtwgfMhWTlgRwwKWzRhqNZzwXz'); // go to encrypted convo await Util.sleep(5); await gmailPage.waitAndClick('.adn [aria-label="More message options"]', { delay: 1 }); @@ -532,7 +532,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gotoGmailPage(gmailPage, '/FMfcgzGtwgfMhWTlgRwwKWzRhqNZzwXz'); // go to encrypted convo await Util.sleep(5); await gmailPage.waitAndClick('.adn [aria-label="More message options"]', { delay: 1 }); - await gmailPage.waitAndClick('[act="25"]', { delay: 1 }); // click forward + await gmailPage.waitAndClick('li[data-action-type="25"]', { delay: 1 }); // click forward await Util.sleep(3); await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box await gmailPage.waitForContent( @@ -556,7 +556,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); const gmailPage = await openGmailPage(t, browser); await gotoGmailPage(gmailPage, '/FMfcgzGtwgfMhWTlgRwwKWzRhqNZzwXz'); // go to encrypted convo - const gmailContextMenu = '.J-J5-Ji.aap'; + const gmailContextMenu = '.adn [aria-label="More message options"]'; await gmailPage.waitAndClick(gmailContextMenu); await Util.sleep(1); expect(await gmailPage.isElementPresent('@action-reply-message-button')); From ae2e0c426934e2dfb97eaad75a0d9675eb3b2fe4 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 03:06:53 -0500 Subject: [PATCH 09/17] fix: test --- .../js/content_scripts/webmail/gmail/gmail-element-replacer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts b/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts index ad62488808e..f83ced5c885 100644 --- a/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts +++ b/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts @@ -670,7 +670,7 @@ export class GmailElementReplacer extends WebmailElementReplacer { private replaceStandardReplyBox = async (msgId?: string, force = false) => { const legacyDraftReplyRegex = new RegExp(/\[(flowcrypt|cryptup):link:draft_reply:([0-9a-fr\-]+)]/); - const newReplyBoxes = $('div.nr.tMHS5d, div.gA td.I5, div.amr > div.nr').not('.reply_message_evaluated').filter(':visible').get(); + const newReplyBoxes = $('div.nr.tMHS5d, div.gA td.I5, .amr > div.nr').not('.reply_message_evaluated').filter(':visible').get(); if (newReplyBoxes.length) { // removing this line will cause unexpected draft creation bug reappear // https://github.com/FlowCrypt/flowcrypt-browser/issues/5616#issuecomment-1972897692 From 53c1223bb316f762ab5ded574104c60a7f633587 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 03:53:51 -0500 Subject: [PATCH 10/17] reenable tests --- test/source/tests/gmail.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index ab96cda71dc..efe5d3ec93f 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -111,7 +111,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gmailPage.goto(url); }; - test.skip( + test( 'mail.google.com/chat', testWithBrowser(async (t, browser) => { const settingsPage = await BrowserRecipe.openSettingsLoginButCloseOauthWindowBeforeGrantingPermission(t, browser, 'ci.tests.gmail@flowcrypt.dev'); @@ -149,7 +149,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test ) ); - test.skip( + test( 'mail.google.com - back button works in offline mode', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -195,7 +195,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test.skip( + test( 'mail.google.com - msg.asc message content renders', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -215,7 +215,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test.skip( + test( 'mail.google.com - Thunderbird signature [html] is recognized', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -242,7 +242,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test.skip( + test( 'mail.google.com - Thunderbird signature [plain] is recognized + correct height', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -289,7 +289,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test ); // draft-sensitive test - test.skip( + test.serial( 'mail.google.com - saving and rendering compose drafts when offline', testWithBrowser( async (t, browser) => { @@ -358,7 +358,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test ); // draft-sensitive test - test.skip( + test.serial( 'mail.google.com - multiple compose windows, saving/opening compose draft', testWithBrowser( async (t, browser) => { @@ -495,7 +495,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gotoGmailPage(gmailPage, '/FMfcgzGtwgfMhWTlgRwwKWzRhqNZzwXz'); // go to encrypted convo await Util.sleep(5); await gmailPage.waitAndClick('.adn [aria-label="More message options"]', { delay: 1 }); - await gmailPage.waitAndClick('[act="24"]', { delay: 1 }); // click reply-all + await gmailPage.waitAndClick('li[data-action-type="95"]', { delay: 1 }); // click reply-all await Util.sleep(3); await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box await gmailPage.waitForContent( @@ -581,7 +581,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test ); // convo-sensitive, draft-sensitive test - test.skip( + test( 'mail.google.com - plain reply draft', testWithBrowser( async (t, browser) => { @@ -589,7 +589,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test const threadId = '181d226b4e69f172'; // 1st message -- thread id const gmailPage = await openGmailPage(t, browser, `/${threadId}`); await GmailPageRecipe.trimConvo(gmailPage, threadId); - await gmailPage.waitAndClick('[aria-label="Reply"]', { delay: 5 }); + await gmailPage.waitAndClick('div.adn [aria-label="Reply"]', { delay: 5 }); t.timeout(minutes(2)); // extend ava's timeout await Util.sleep(5); await gmailPage.waitTillFocusIsIn('div[aria-label="Message Body"]', { timeout: 10 }); @@ -647,7 +647,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test.skip( + test( `mail.google.com - large clipped PGP/MIME encrypted message rendered correctly`, testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -665,7 +665,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test.skip( + test( `mail.google.com - render plain text for "message" attachment (which has plain text)`, testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -680,7 +680,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test.skip( + test( 'mail.google.com - pubkey file gets rendered', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); From 19b702603e948efee04ca9e8ca66fa81c1f990be Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 03:54:41 -0500 Subject: [PATCH 11/17] fix: serial --- test/source/tests/gmail.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index efe5d3ec93f..f12d37be5b4 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -581,7 +581,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test ); // convo-sensitive, draft-sensitive test - test( + test.serial( 'mail.google.com - plain reply draft', testWithBrowser( async (t, browser) => { From fb2543aa52d7ee95856fe4b404fb3f87938afce4 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 04:07:48 -0500 Subject: [PATCH 12/17] fix: styling --- extension/css/webmail.css | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/extension/css/webmail.css b/extension/css/webmail.css index bddcc63f0de..117d8887a47 100644 --- a/extension/css/webmail.css +++ b/extension/css/webmail.css @@ -207,6 +207,9 @@ body.cryptup_gmail div.action_menu_message_button { text-transform: capitalize; cursor: pointer; padding: 4px; + font-size: 14px; + font-weight: 400; + color: #1f1f1f; } body.cryptup_gmail div.action_menu_message_button:hover { @@ -214,9 +217,9 @@ body.cryptup_gmail div.action_menu_message_button:hover { } body.cryptup_gmail div.action_menu_message_button > img { - height: 20px; - width: 20px; - padding: 0 12px; + height: auto; + width: 18px; + padding: 0 11px; object-fit: contain; } From fb06f6325ec0e0c26b193f71fbf21dfa3c09358d Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 07:50:33 -0500 Subject: [PATCH 13/17] fix: test --- .../content_scripts/webmail/gmail/gmail-element-replacer.ts | 2 +- test/source/tests/gmail.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts b/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts index f83ced5c885..36c01f418d5 100644 --- a/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts +++ b/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts @@ -977,7 +977,7 @@ export class GmailElementReplacer extends WebmailElementReplacer { // New Gmail uses data-action-type attributes const replyButton = visibleMenu.querySelector('li[data-action-type="94"]'); const forwardButton = visibleMenu.querySelector('li[data-action-type="25"]'); - const replyAllButton = visibleMenu.querySelector('li[data-action-type="95"]'); // Estimated based on pattern + const replyAllButton = visibleMenu.querySelector('li[data-action-type="24"]'); // Estimated based on pattern // Cannot use jQuery $('#r2').is(':visible') because the element is considered invisible if its parent has display: none. if (replyAllButton && window.getComputedStyle(replyAllButton).display !== 'none') { diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index f12d37be5b4..e687a242ab4 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -485,7 +485,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test( + test.only( 'mail.google.com - plain reply with dot menu', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); @@ -495,7 +495,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gotoGmailPage(gmailPage, '/FMfcgzGtwgfMhWTlgRwwKWzRhqNZzwXz'); // go to encrypted convo await Util.sleep(5); await gmailPage.waitAndClick('.adn [aria-label="More message options"]', { delay: 1 }); - await gmailPage.waitAndClick('li[data-action-type="95"]', { delay: 1 }); // click reply-all + await gmailPage.waitAndClick('li[data-action-type="25"]', { delay: 1 }); // click reply-all await Util.sleep(3); await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box await gmailPage.waitForContent( From 3441596b34f6226b0592b87c1e3b464cad03795f Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 07:58:16 -0500 Subject: [PATCH 14/17] fix: only --- test/source/tests/gmail.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index e687a242ab4..dc4f0f7b2db 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -485,7 +485,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test }) ); - test.only( + test( 'mail.google.com - plain reply with dot menu', testWithBrowser(async (t, browser) => { await BrowserRecipe.setUpCommonAcct(t, browser, 'ci.tests.gmail'); From 336a4a128f37f172a0e862eecfcfc3dcc7a25e91 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 10:03:04 -0300 Subject: [PATCH 15/17] fix: style --- extension/css/webmail.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extension/css/webmail.css b/extension/css/webmail.css index 117d8887a47..8dd90b3718e 100644 --- a/extension/css/webmail.css +++ b/extension/css/webmail.css @@ -29,6 +29,10 @@ outline: 0; } +.btDi4d { + position: initial !important; +} + .small #flowcrypt_secure_compose_button_icon { height: 40px; } From 775d3a964693b453d75450ee53f777a2be28a1d7 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 09:10:13 -0500 Subject: [PATCH 16/17] fix: test --- test/source/tests/gmail.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index dc4f0f7b2db..f794a357701 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -500,7 +500,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box await gmailPage.waitForContent( '.reply_message_evaluated .error_notification', - 'The last message was encrypted, but you are composing a reply without encryption.' + 'The last message was encrypted, but you are composing a message without encryption.' ); await gmailPage.waitAndClick('[data-tooltip="Secure Reply"]'); // Switch to encrypted reply await gmailPage.waitAll('.reply_message'); From c040071892afed6104105292a23e29e3f88e3a92 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Tue, 11 Nov 2025 19:10:32 -0500 Subject: [PATCH 17/17] fix: test --- extension/css/webmail.css | 3 ++- test/source/tests/gmail.ts | 4 ++-- test/source/tests/setup.ts | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/extension/css/webmail.css b/extension/css/webmail.css index 8dd90b3718e..b07448fe347 100644 --- a/extension/css/webmail.css +++ b/extension/css/webmail.css @@ -210,10 +210,11 @@ body.cryptup_gmail div.action_menu_message_button { align-items: center; text-transform: capitalize; cursor: pointer; - padding: 4px; + padding: 8px 4px; font-size: 14px; font-weight: 400; color: #1f1f1f; + line-height: 16px; } body.cryptup_gmail div.action_menu_message_button:hover { diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index f794a357701..8c5f5bea769 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -495,12 +495,12 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await gotoGmailPage(gmailPage, '/FMfcgzGtwgfMhWTlgRwwKWzRhqNZzwXz'); // go to encrypted convo await Util.sleep(5); await gmailPage.waitAndClick('.adn [aria-label="More message options"]', { delay: 1 }); - await gmailPage.waitAndClick('li[data-action-type="25"]', { delay: 1 }); // click reply-all + await gmailPage.waitAndClick('li[data-action-type="24"]', { delay: 1 }); // click reply-all await Util.sleep(3); await gmailPage.waitAll('[data-tooltip^="Send"]'); // The Send button from the Standard reply box await gmailPage.waitForContent( '.reply_message_evaluated .error_notification', - 'The last message was encrypted, but you are composing a message without encryption.' + 'The last message was encrypted, but you are composing a reply without encryption.' ); await gmailPage.waitAndClick('[data-tooltip="Secure Reply"]'); // Switch to encrypted reply await gmailPage.waitAll('.reply_message'); diff --git a/test/source/tests/setup.ts b/test/source/tests/setup.ts index f0b40120f9f..ddea1b21bbf 100644 --- a/test/source/tests/setup.ts +++ b/test/source/tests/setup.ts @@ -853,6 +853,7 @@ AN8G3r5Htj8olot+jm9mIa5XLXWzMNUZgg== await addKeyPopup.waitAndClick('.action_add_private_key', { delay: 1 }); await Util.sleep(1); await gmailPage.page.reload(); + await Util.sleep(3); await gmailPage.waitTillGone('@webmail-notification-notify_expiring_keys'); // remove added key and observe warning appears again await settingsPage.waitAndClick('@action-remove-key-1');