From 891e5041855c19f7dd515ebf16671d0145a787c0 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 29 Oct 2020 13:44:58 -0400 Subject: [PATCH 1/3] carefully wrap DOM element to fix #3076 --- .../content_scripts/webmail/gmail-element-replacer.ts | 5 +++-- test/source/tests/gmail.ts | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) 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/tests/gmail.ts b/test/source/tests/gmail.ts index e3c50710278..deaaea24b12 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -148,6 +148,16 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await pageHasSecureReplyContainer(t, browser, gmailPage); })); + ava.default('mail.google.com - Thunderbird signature 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 - 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); From 0cede3dcf09ffe732fb215bc48f76080d45ebb29 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 29 Oct 2020 14:15:58 -0400 Subject: [PATCH 2/3] relaxed WaitForNavigationIfAny exception check --- test/source/browser/controllable.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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; From ffbdf0ff2aa68738e3ed32324eb2c2a65cffc345 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 29 Oct 2020 16:27:30 -0400 Subject: [PATCH 3/3] added plain text Thunderbird message test --- test/source/tests/gmail.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/source/tests/gmail.ts b/test/source/tests/gmail.ts index deaaea24b12..4aad51b6c2e 100644 --- a/test/source/tests/gmail.ts +++ b/test/source/tests/gmail.ts @@ -148,7 +148,7 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test await pageHasSecureReplyContainer(t, browser, gmailPage); })); - ava.default('mail.google.com - Thunderbird signature is recognized', testWithBrowser('ci.tests.gmail', async (t, browser) => { + 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); @@ -158,6 +158,16 @@ export const defineGmailTests = (testVariant: TestVariant, testWithBrowser: Test 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);