diff options
Diffstat (limited to 'comm/mail/components/cloudfile/test/browser/browser_repeat_upload.js')
-rw-r--r-- | comm/mail/components/cloudfile/test/browser/browser_repeat_upload.js | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/comm/mail/components/cloudfile/test/browser/browser_repeat_upload.js b/comm/mail/components/cloudfile/test/browser/browser_repeat_upload.js new file mode 100644 index 0000000000..7390354a8c --- /dev/null +++ b/comm/mail/components/cloudfile/test/browser/browser_repeat_upload.js @@ -0,0 +1,246 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* import-globals-from ../../../../base/content/mailWindowOverlay.js */ + +let { cloudFileAccounts } = ChromeUtils.import( + "resource:///modules/cloudFileAccounts.jsm" +); + +const ICON_URL = getRootDirectory(gTestPath) + "files/icon.svg"; +const MANAGEMENT_URL = getRootDirectory(gTestPath) + "files/management.html"; + +function getFileFromChromeURL(leafName) { + let ChromeRegistry = Cc["@mozilla.org/chrome/chrome-registry;1"].getService( + Ci.nsIChromeRegistry + ); + + let url = Services.io.newURI( + getRootDirectory(gTestPath) + "files/" + leafName + ); + let fileURL = ChromeRegistry.convertChromeURL(url).QueryInterface( + Ci.nsIFileURL + ); + return fileURL.file; +} + +add_task(async () => { + let uploadedFiles = []; + let provider = { + type: "Mochitest", + displayName: "Mochitest", + iconURL: ICON_URL, + initAccount(accountKey) { + return { + accountKey, + type: "Mochitest", + get displayName() { + return Services.prefs.getCharPref( + `mail.cloud_files.accounts.${this.accountKey}.displayName`, + "Mochitest Account" + ); + }, + getPreviousUploads() { + return uploadedFiles; + }, + urlForFile(file) { + return "https://mochi.test/" + file.leafName; + }, + iconURL: ICON_URL, + configured: true, + managementURL: MANAGEMENT_URL, + reuseUploads: true, + }; + }, + }; + + Assert.equal( + cloudFileAccounts.configuredAccounts.length, + 0, + "Should have no cloudfile accounts starting off." + ); + + cloudFileAccounts.registerProvider(provider.type, provider); + let account = cloudFileAccounts.createAccount(provider.type); + Assert.equal( + cloudFileAccounts.configuredAccounts.length, + 1, + "Should have only the one account we created." + ); + + let composeWindowPromise = BrowserTestUtils.domWindowOpened(); + MsgNewMessage(); + let composeWindow = await composeWindowPromise; + await BrowserTestUtils.waitForEvent(composeWindow, "compose-editor-ready"); + await TestUtils.waitForCondition( + () => Services.focus.activeWindow == composeWindow + ); + let composeDocument = composeWindow.document; + + // Compose window loaded. + // Check the attach dropdown has our account as a <menuitem>. + + let toolbarButton = composeDocument.getElementById("button-attach"); + let rect = toolbarButton.getBoundingClientRect(); + EventUtils.synthesizeMouse( + toolbarButton, + rect.width - 5, + 5, + { clickCount: 1 }, + composeWindow + ); + await promiseAnimationFrame(composeWindow); + + let menu = composeDocument.getElementById( + "button-attachPopup_attachCloudMenu" + ); + ok(!BrowserTestUtils.is_hidden(menu)); + + let popupshown = BrowserTestUtils.waitForEvent(menu, "popupshown"); + EventUtils.synthesizeMouseAtCenter(menu, { clickCount: 1 }, composeWindow); + await popupshown; + + Assert.equal( + cloudFileAccounts.configuredAccounts.length, + 1, + "Should still have one registered account." + ); + + let menuitems = menu.menupopup.children; + is(menuitems.length, 1); + is(menuitems[0].getAttribute("image"), ICON_URL); + is(menuitems[0].getAttribute("label"), "Mochitest Account\u2026"); + + composeDocument.getElementById("button-attachPopup").hidePopup(); + + // Pretend we uploaded some files before. + + uploadedFiles = [ + { + id: 1, + name: "green_eggs.txt", + path: getFileFromChromeURL("green_eggs.txt").path, + size: 30, + url: "https://mochi.test/green_eggs.txt", + serviceName: "MyCloud", + serviceIcon: "chrome://messenger/skin/icons/globe.svg", + }, + { + id: 2, + name: "ham.zip", + path: getFileFromChromeURL("ham.zip").path, + size: 1234, + url: "https://mochi.test/ham.zip", + }, + ]; + is(account.getPreviousUploads().length, 2); + + // Check the attach dropdown has our account as a <menu>. + + await new Promise(resolve => { + toolbarButton.addEventListener("popupshown", resolve, { once: true }); + EventUtils.synthesizeMouse( + toolbarButton, + rect.width - 5, + 5, + { clickCount: 1 }, + composeWindow + ); + }); + info("toolbar button menu opened"); + await promiseAnimationFrame(composeWindow); + + await new Promise(resolve => { + menu.menupopup.addEventListener("popupshown", resolve, { once: true }); + EventUtils.synthesizeMouseAtCenter(menu, { clickCount: 1 }, composeWindow); + }); + info("file link menu opened"); + await promiseAnimationFrame(composeWindow); + + menuitems = menu.menupopup.children; + is(menuitems.length, 2); + is(menuitems[0].getAttribute("image"), ICON_URL); + is(menuitems[0].getAttribute("label"), "Mochitest Account\u2026"); + is(menuitems[1].localName, "menuitem"); + is(menuitems[1].getAttribute("image"), "moz-icon://green_eggs.txt"); + is(menuitems[1].getAttribute("label"), "green_eggs.txt"); + // TODO: Enable this when we handle files that no longer exist on the filesystem. + // is(menuitems[2].localName, "menuitem"); + // is(menuitems[2].getAttribute("image"), "moz-icon://ham.zip"); + // is(menuitems[2].getAttribute("label"), "ham.zip"); + + // Select one of the previously-uploaded items and check the attachment is added. + + let bucket = composeDocument.getElementById("attachmentBucket"); + await new Promise(resolve => { + bucket.addEventListener("attachments-added", resolve, { once: true }); + menu.menupopup.activateItem(menuitems[1]); + }); + info("attachment added"); + await promiseAnimationFrame(composeWindow); + ok(toolbarButton.open === false); + + is(bucket.itemCount, 1); + let attachment = bucket.itemChildren[0]; + is(attachment.getAttribute("name"), "green_eggs.txt"); + ok(attachment.attachment.sendViaCloud); + is(attachment.attachment.cloudFileAccountKey, account.accountKey); + is( + attachment.attachment.contentLocation, + "https://mochi.test/green_eggs.txt" + ); + + is( + attachment.querySelector("img.attachmentcell-icon").src, + uploadedFiles[0].serviceIcon, + "CloudFile icon should be correct." + ); + + // Check the content of the editor for the added template. + let editor = composeWindow.GetCurrentEditor(); + let urls = editor.document.querySelectorAll( + "body > #cloudAttachmentListRoot > #cloudAttachmentList" + ); + Assert.equal(urls.length, 1, "Found 1 FileLink template in the document."); + + // Template is added asynchronously. + await TestUtils.waitForCondition(() => urls[0].querySelector("li")); + Assert.equal( + urls[0].querySelector(".cloudfile-name").textContent, + "green_eggs.txt", + "The name of the cloud file in the template should be correct." + ); + + Assert.equal( + urls[0].querySelector(".cloudfile-name").href, + "https://mochi.test/green_eggs.txt", + "The URL attached to the name of the cloud file in the template should be correct." + ); + + Assert.equal( + urls[0].querySelector(".cloudfile-service-name").textContent, + "MyCloud", + "The used service name in the template should be correct." + ); + + Assert.equal( + urls[0].querySelector(".cloudfile-service-icon").src, + "data:image/svg+xml;filename=globe.svg;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMTYgMTYiPgogIDxwYXRoIGZpbGw9ImNvbnRleHQtZmlsbCIgZD0iTTggMGE4IDggMCAxIDAgOCA4IDguMDA5IDguMDA5IDAgMCAwLTgtOHptNS4xNjMgNC45NThoLTEuNTUyYTcuNyA3LjcgMCAwIDAtMS4wNTEtMi4zNzYgNi4wMyA2LjAzIDAgMCAxIDIuNjAzIDIuMzc2ek0xNCA4YTUuOTYzIDUuOTYzIDAgMCAxLS4zMzUgMS45NThoLTEuODIxQTEyLjMyNyAxMi4zMjcgMCAwIDAgMTIgOGExMi4zMjcgMTIuMzI3IDAgMCAwLS4xNTYtMS45NThoMS44MjFBNS45NjMgNS45NjMgMCAwIDEgMTQgOHptLTYgNmMtMS4wNzUgMC0yLjAzNy0xLjItMi41NjctMi45NThoNS4xMzVDMTAuMDM3IDEyLjggOS4wNzUgMTQgOCAxNHpNNS4xNzQgOS45NThhMTEuMDg0IDExLjA4NCAwIDAgMSAwLTMuOTE2aDUuNjUxQTExLjExNCAxMS4xMTQgMCAwIDEgMTEgOGExMS4xMTQgMTEuMTE0IDAgMCAxLS4xNzQgMS45NTh6TTIgOGE1Ljk2MyA1Ljk2MyAwIDAgMSAuMzM1LTEuOTU4aDEuODIxYTEyLjM2MSAxMi4zNjEgMCAwIDAgMCAzLjkxNkgyLjMzNUE1Ljk2MyA1Ljk2MyAwIDAgMSAyIDh6bTYtNmMxLjA3NSAwIDIuMDM3IDEuMiAyLjU2NyAyLjk1OEg1LjQzM0M1Ljk2MyAzLjIgNi45MjUgMiA4IDJ6bS0yLjU2LjU4MmE3LjcgNy43IDAgMCAwLTEuMDUxIDIuMzc2SDIuODM3QTYuMDMgNi4wMyAwIDAgMSA1LjQ0IDIuNTgyem0tMi42IDguNDZoMS41NDlhNy43IDcuNyAwIDAgMCAxLjA1MSAyLjM3NiA2LjAzIDYuMDMgMCAwIDEtMi42MDMtMi4zNzZ6bTcuNzIzIDIuMzc2YTcuNyA3LjcgMCAwIDAgMS4wNTEtMi4zNzZoMS41NTJhNi4wMyA2LjAzIDAgMCAxLTIuNjA2IDIuMzc2eiI+PC9wYXRoPgo8L3N2Zz4K", + "The used service icon should be correct." + ); + + // clean up + cloudFileAccounts.removeAccount(account); + cloudFileAccounts.unregisterProvider(provider.type); + Assert.equal( + cloudFileAccounts.configuredAccounts.length, + 0, + "Should leave no cloudfile accounts when done" + ); + composeWindow.close(); + + // Request focus on something in the main window so the test doesn't time + // out waiting for focus. + document.getElementById("button-appmenu").focus(); +}); |