fune/browser/components/extensions/test/browser/browser_ext_tabs_duplicate.js
Kris Maglione e930b89c34 Bug 1514594: Part 3 - Change ChromeUtils.import API.
***
Bug 1514594: Part 3a - Change ChromeUtils.import to return an exports object; not pollute global. r=mccr8

This changes the behavior of ChromeUtils.import() to return an exports object,
rather than a module global, in all cases except when `null` is passed as a
second argument, and changes the default behavior not to pollute the global
scope with the module's exports. Thus, the following code written for the old
model:

  ChromeUtils.import("resource://gre/modules/Services.jsm");

is approximately the same as the following, in the new model:

  var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");

Since the two behaviors are mutually incompatible, this patch will land with a
scripted rewrite to update all existing callers to use the new model rather
than the old.
***
Bug 1514594: Part 3b - Mass rewrite all JS code to use the new ChromeUtils.import API. rs=Gijs

This was done using the followng script:

https://bitbucket.org/kmaglione/m-c-rewrites/src/tip/processors/cu-import-exports.jsm
***
Bug 1514594: Part 3c - Update ESLint plugin for ChromeUtils.import API changes. r=Standard8

Differential Revision: https://phabricator.services.mozilla.com/D16747
***
Bug 1514594: Part 3d - Remove/fix hundreds of duplicate imports from sync tests. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16748
***
Bug 1514594: Part 3e - Remove no-op ChromeUtils.import() calls. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16749
***
Bug 1514594: Part 3f.1 - Cleanup various test corner cases after mass rewrite. r=Gijs
***
Bug 1514594: Part 3f.2 - Cleanup various non-test corner cases after mass rewrite. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16750

--HG--
extra : rebase_source : 359574ee3064c90f33bf36c2ebe3159a24cc8895
extra : histedit_source : b93c8f42808b1599f9122d7842d2c0b3e656a594%2C64a3a4e3359dc889e2ab2b49461bab9e27fc10a7
2019-01-17 10:18:31 -08:00

146 lines
4.8 KiB
JavaScript

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(async function testDuplicateTab() {
await BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.net/");
let extension = ExtensionTestUtils.loadExtension({
manifest: {
"permissions": ["tabs"],
},
background: function() {
browser.tabs.query({
lastFocusedWindow: true,
}, function(tabs) {
let source = tabs[1];
// By moving it 0, we check that the new tab is created next
// to the existing one.
browser.tabs.move(source.id, {index: 0}, () => {
browser.tabs.duplicate(source.id, (tab) => {
browser.test.assertEq("http://example.net/", tab.url);
// Should be the second tab, next to the one duplicated.
browser.test.assertEq(1, tab.index);
// Should be active by default.
browser.test.assertTrue(tab.active);
browser.test.notifyPass("tabs.duplicate");
});
});
});
},
});
await extension.startup();
await extension.awaitFinish("tabs.duplicate");
await extension.unload();
while (gBrowser.tabs[0].linkedBrowser.currentURI.spec === "http://example.net/") {
BrowserTestUtils.removeTab(gBrowser.tabs[0]);
}
});
add_task(async function testDuplicateTabLazily() {
async function background() {
let tabLoadComplete = new Promise(resolve => {
browser.test.onMessage.addListener((message, tabId, result) => {
if (message == "duplicate-tab-done") {
resolve(tabId);
}
});
});
function awaitLoad(tabId) {
return new Promise(resolve => {
browser.tabs.onUpdated.addListener(function listener(tabId_, changed, tab) {
if (tabId == tabId_ && changed.status == "complete") {
browser.tabs.onUpdated.removeListener(listener);
resolve();
}
});
});
}
try {
let url = "http://example.com/browser/browser/components/extensions/test/browser/file_dummy.html";
let tab = await browser.tabs.create({url});
let startTabId = tab.id;
await awaitLoad(startTabId);
browser.test.sendMessage("duplicate-tab", startTabId);
let unloadedTabId = await tabLoadComplete;
let loadedtab = await browser.tabs.get(startTabId);
browser.test.assertEq("Dummy test page", loadedtab.title, "Title should be returned for loaded pages");
browser.test.assertEq("complete", loadedtab.status, "Tab status should be complete for loaded pages");
let unloadedtab = await browser.tabs.get(unloadedTabId);
browser.test.assertEq("Dummy test page", unloadedtab.title, "Title should be returned after page has been unloaded");
await browser.tabs.remove([tab.id, unloadedTabId]);
browser.test.notifyPass("tabs.hasCorrectTabTitle");
} catch (e) {
browser.test.fail(`${e} :: ${e.stack}`);
browser.test.notifyFail("tabs.hasCorrectTabTitle");
}
}
let extension = ExtensionTestUtils.loadExtension({
manifest: {
"permissions": ["tabs"],
},
background,
});
extension.onMessage("duplicate-tab", tabId => {
let {Management: {global: {tabTracker}}} = ChromeUtils.import("resource://gre/modules/Extension.jsm", null);
let tab = tabTracker.getTab(tabId);
// This is a bit of a hack to load a tab in the background.
let newTab = gBrowser.duplicateTab(tab, true);
BrowserTestUtils.waitForEvent(newTab, "SSTabRestored", () => true).then(() => {
extension.sendMessage("duplicate-tab-done", tabTracker.getId(newTab));
});
});
await extension.startup();
await extension.awaitFinish("tabs.hasCorrectTabTitle");
await extension.unload();
});
add_task(async function testDuplicatePinnedTab() {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.net/");
gBrowser.pinTab(tab);
let extension = ExtensionTestUtils.loadExtension({
manifest: {
"permissions": ["tabs"],
},
background: function() {
browser.tabs.query({
lastFocusedWindow: true,
}, function(tabs) {
// Duplicate the pinned tab, example.net.
browser.tabs.duplicate(tabs[0].id, (tab) => {
browser.test.assertEq("http://example.net/", tab.url);
// Should be the second tab, next to the one duplicated.
browser.test.assertEq(1, tab.index);
// Should be pinned.
browser.test.assertTrue(tab.pinned);
browser.test.notifyPass("tabs.duplicate.pinned");
});
});
},
});
await extension.startup();
await extension.awaitFinish("tabs.duplicate.pinned");
await extension.unload();
while (gBrowser.tabs[0].linkedBrowser.currentURI.spec === "http://example.net/") {
BrowserTestUtils.removeTab(gBrowser.tabs[0]);
}
});