fune/browser/components/extensions/test/browser/browser_ext_tabs_create.js
Olivier Yiptong e9b515f263 Bug 1218996 - Fuse aboutNewTabService and RemoteNewTabLocation and return resource URLS r=marcosc
--HG--
extra : rebase_source : 6280fdc5cdad7c122e4ce71e809d812f8e75386f
2016-01-11 20:30:13 -05:00

169 lines
4.9 KiB
JavaScript

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(function* () {
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "about:robots");
gBrowser.selectedTab = tab;
// TODO: Multiple windows.
// Using pre-loaded new tab pages interferes with onUpdated events.
// It probably shouldn't.
SpecialPowers.setBoolPref("browser.newtab.preload", false);
registerCleanupFunction(() => {
SpecialPowers.clearUserPref("browser.newtab.preload");
});
let extension = ExtensionTestUtils.loadExtension({
manifest: {
"permissions": ["tabs"],
"background": { "page": "bg/background.html" },
},
files: {
"bg/blank.html": `<html><head><meta charset="utf-8"></head></html>`,
"bg/background.html": `<html><head>
<meta charset="utf-8">
<script src="background.js"></script>
</head></html>`,
"bg/background.js": function() {
// Wrap API methods in promise-based variants.
let promiseTabs = {};
Object.keys(browser.tabs).forEach(method => {
promiseTabs[method] = (...args) => {
return new Promise(resolve => {
browser.tabs[method](...args, resolve);
});
};
});
let activeTab;
let activeWindow;
function runTests() {
const DEFAULTS = {
index: 2,
windowId: activeWindow,
active: true,
pinned: false,
url: "chrome://browser/content/newtab/newTab.xhtml",
};
let tests = [
{
create: { url: "http://example.com/" },
result: { url: "http://example.com/" },
},
{
create: { url: "blank.html" },
result: { url: browser.runtime.getURL("bg/blank.html") },
},
{
create: {},
result: { url: "chrome://browser/content/newtab/newTab.xhtml" },
},
{
create: { active: false },
result: { active: false },
},
{
create: { active: true },
result: { active: true },
},
{
create: { pinned: true },
result: { pinned: true, index: 0 },
},
{
create: { pinned: true, active: true },
result: { pinned: true, active: true, index: 0 },
},
{
create: { pinned: true, active: false },
result: { pinned: true, active: false, index: 0 },
},
{
create: { index: 1 },
result: { index: 1 },
},
{
create: { index: 1, active: false },
result: { index: 1, active: false },
},
{
create: { windowId: activeWindow },
result: { windowId: activeWindow },
},
];
function nextTest() {
if (!tests.length) {
browser.test.notifyPass("tabs.create");
return;
}
let test = tests.shift();
let expected = Object.assign({}, DEFAULTS, test.result);
browser.test.log(`Testing tabs.create(${JSON.stringify(test.create)}), expecting ${JSON.stringify(test.result)}`);
let tabId;
let updatedPromise = new Promise(resolve => {
let onUpdated = (changedTabId, changed) => {
if (changedTabId === tabId && changed.url) {
browser.tabs.onUpdated.removeListener(onUpdated);
resolve(changed.url);
}
};
browser.tabs.onUpdated.addListener(onUpdated);
});
promiseTabs.create(test.create).then(tab => {
tabId = tab.id;
for (let key of Object.keys(expected)) {
if (key === "url") {
// FIXME: This doesn't get updated until later in the load cycle.
continue;
}
browser.test.assertEq(expected[key], tab[key], `Expected value for tab.${key}`);
}
return updatedPromise;
}).then(url => {
browser.test.assertEq(expected.url, url, `Expected value for tab.url`);
return promiseTabs.remove(tabId);
}).then(() => {
return promiseTabs.update(activeTab, { active: true });
}).then(() => {
nextTest();
});
}
nextTest();
}
browser.tabs.query({ active: true, currentWindow: true }, tabs => {
activeTab = tabs[0].id;
activeWindow = tabs[0].windowId;
runTests();
});
},
},
});
yield extension.startup();
yield extension.awaitFinish("tabs.create");
yield extension.unload();
yield BrowserTestUtils.removeTab(tab);
});