Bug 1289273: Resolve URLs passed to windows.create relative to the caller. r=aswan a=al

MozReview-Commit-ID: 3TUIK6EvO3q

--HG--
extra : rebase_source : cccf23ce3edc1543f15223c677645c42be0ff7a6
extra : histedit_source : 42bdc39ad4c4bdc01e3d094f8d62eae11f3532ba
This commit is contained in:
Kris Maglione 2016-10-05 20:27:06 +01:00
Родитель 78fe5d0ec3
Коммит a4e557a57b
4 изменённых файлов: 91 добавлений и 2 удалений

Просмотреть файл

@ -273,10 +273,10 @@
"description": "A URL or array of URLs to open as tabs in the window. Fully-qualified URLs must include a scheme (i.e. 'http://www.google.com', not 'www.google.com'). Relative URLs will be relative to the current page within the extension. Defaults to the New Tab Page.",
"optional": true,
"choices": [
{ "type": "string" },
{ "type": "string", "format": "relativeUrl" },
{
"type": "array",
"items": { "type": "string" }
"items": { "type": "string", "format": "relativeUrl" }
}
]
},

Просмотреть файл

@ -92,6 +92,7 @@ tags = webextensions
[browser_ext_windows_create.js]
tags = fullscreen
[browser_ext_windows_create_tabId.js]
[browser_ext_windows_create_url.js]
[browser_ext_windows_events.js]
[browser_ext_windows_size.js]
skip-if = os == 'mac' # Fails when windows are randomly opened in fullscreen mode

Просмотреть файл

@ -0,0 +1,84 @@
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(function* testWindowCreate() {
let extension = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
background() {
const EXTENSION_URL = browser.runtime.getURL("test.html");
const REMOTE_URL = browser.runtime.getURL("test.html");
let windows = new class extends Map { // eslint-disable-line new-parens
get(id) {
if (!this.has(id)) {
let window = {
tabs: new Map(),
};
window.promise = new Promise(resolve => {
window.resolvePromise = resolve;
});
this.set(id, window);
}
return super.get(id);
}
};
browser.tabs.onUpdated.addListener((tabId, changed, tab) => {
if (changed.status == "complete" && tab.url !== "about:blank") {
let window = windows.get(tab.windowId);
window.tabs.set(tab.index, tab);
if (window.tabs.size === window.expectedTabs) {
window.resolvePromise(window);
}
}
});
function create(options) {
return browser.windows.create(options).then(window => {
let win = windows.get(window.id);
win.expectedTabs = Array.isArray(options.url) ? options.url.length : 1;
return win.promise;
});
}
Promise.all([
create({url: REMOTE_URL}),
create({url: "test.html"}),
create({url: EXTENSION_URL}),
create({url: [REMOTE_URL, "test.html", EXTENSION_URL]}),
]).then(windows => {
browser.test.assertEq(REMOTE_URL, windows[0].tabs.get(0).url, "Single, absolute, remote URL");
browser.test.assertEq(REMOTE_URL, windows[1].tabs.get(0).url, "Single, relative URL");
browser.test.assertEq(REMOTE_URL, windows[2].tabs.get(0).url, "Single, absolute, extension URL");
browser.test.assertEq(REMOTE_URL, windows[3].tabs.get(0).url, "url[0]: Absolute, remote URL");
browser.test.assertEq(EXTENSION_URL, windows[3].tabs.get(1).url, "url[1]: Relative URL");
browser.test.assertEq(EXTENSION_URL, windows[3].tabs.get(2).url, "url[2]: Absolute, extension URL");
}).then(() => {
browser.test.notifyPass("window-create-url");
}).catch(e => {
browser.test.fail(`${e} :: ${e.stack}`);
browser.test.notifyFail("window-create-url");
});
},
files: {
"test.html": `<DOCTYPE html><html><head><meta charset="utf-8"></head></html>`,
},
});
yield extension.startup();
yield extension.awaitFinish("window-create-url");
yield extension.unload();
});

Просмотреть файл

@ -687,6 +687,10 @@ GlobalManager = {
let schemaWrapper = {
isChromeCompat,
get url() {
return context.uri.spec;
},
get principal() {
return context.principal;
},