diff --git a/extension/js/content_scripts/webmail/gmail-element-replacer.ts b/extension/js/content_scripts/webmail/gmail-element-replacer.ts index aa9e1d652c7..9098da46e64 100644 --- a/extension/js/content_scripts/webmail/gmail-element-replacer.ts +++ b/extension/js/content_scripts/webmail/gmail-element-replacer.ts @@ -472,8 +472,9 @@ export class GmailElementReplacer implements WebmailElementReplacer { } else if (method === 'append') { if (replace) { const parent = msgBody.parent(); - msgBody.replaceWith(this.wrapMsgBodyEl(msgBody.html() + newHtmlContent_MUST_BE_XSS_SAFE)); // xss-reinsert // xss-safe-value - this.ensureHasParentNode(msgBody); // Gmail is using msgBody.parentNode (#2271) + const wrapper = msgBody.wrap(this.wrapMsgBodyEl('')); + wrapper.append(newHtmlContent_MUST_BE_XSS_SAFE); // xss-reinsert // xss-safe-value + this.ensureHasParentNode(wrapper); // Gmail is using msgBody.parentNode (#2271) return parent.find('.message_inner_body'); // need to return new selector - old element was replaced } else { return msgBody.append(newHtmlContent_MUST_BE_XSS_SAFE); // xss-safe-value diff --git a/test/source/browser/controllable.ts b/test/source/browser/controllable.ts index 92699ae76a1..19ee4912407 100644 --- a/test/source/browser/controllable.ts +++ b/test/source/browser/controllable.ts @@ -528,7 +528,8 @@ export class ControllablePage extends ControllableBase { try { await this.page.waitForNavigation({ timeout: seconds * 1000 }); } catch (e) { - if (e.message.indexOf('Navigation Timeout Exceeded') === 0) { + // can be "Navigation Timeout Exceeded" or "Navigation timeout of 5000 ms exceeded" + if (new RegExp('^Navigation timeout .*xceeded$').test(e.message)) { return; } throw e; diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index e3c50710278..4aad51b6c2e 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -148,6 +148,26 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await pageHasSecureReplyContainer(t, browser, gmailPage); })); + ava.default('mail.google.com - Thunderbird signature [html] is recognized', testWithBrowser('ci.tests.gmail', async (t, browser) => { + const gmailPage = await openGmailPage(t, browser, '/FMfcgxwKjBRGVhcgRwklplhBCCKgSdfk'); + const urls = await gmailPage.getFramesUrls(['/chrome/elements/pgp_block.htm'], { sleep: 10, appearIn: 20 }); + expect(urls.length).to.equal(1); + const url = urls[0].split('/chrome/elements/pgp_block.htm')[1]; + const signature = ['Dhartley@Verdoncollege.School.Nz', 'matching signature']; + await BrowserRecipe.pgpBlockVerifyDecryptedContent(t, browser, { params: url, content: ['1234'], signature }); + await pageHasSecureReplyContainer(t, browser, gmailPage); + })); + + ava.default('mail.google.com - Thunderbird signature [plain] is recognized', testWithBrowser('ci.tests.gmail', async (t, browser) => { + const gmailPage = await openGmailPage(t, browser, '/FMfcgxwKjBTWTbDjXSJVjDjKlWJGbWQd'); + const urls = await gmailPage.getFramesUrls(['/chrome/elements/pgp_block.htm'], { sleep: 10, appearIn: 20 }); + expect(urls.length).to.equal(1); + const url = urls[0].split('/chrome/elements/pgp_block.htm')[1]; + const signature = ['Dhartley@Verdoncollege.School.Nz', 'matching signature']; + await BrowserRecipe.pgpBlockVerifyDecryptedContent(t, browser, { params: url, content: ['1234'], signature }); + await pageHasSecureReplyContainer(t, browser, gmailPage); + })); + ava.default('mail.google.com - secure reply btn accepts reply prompt', testWithBrowser('ci.tests.gmail', async (t, browser) => { const gmailPage = await openGmailPage(t, browser, '/FMfcgxwJXVGtMJwQTZmBDlspVWDvsnnL'); // encrypted convo await Util.sleep(5);