# HG changeset patch # User Kris Maglione # Date 1475695626 -3600 # Wed Oct 05 20:27:06 2016 +0100 # Node ID cccf23ce3edc1543f15223c677645c42be0ff7a6 # Parent 939a868be34694736adfe3c3e7fd88743d3f5980 Bug 1289273: Resolve URLs passed to windows.create relative to the caller. r?aswan MozReview-Commit-ID: 3TUIK6EvO3q diff --git a/browser/components/extensions/schemas/windows.json b/browser/components/extensions/schemas/windows.json --- a/browser/components/extensions/schemas/windows.json +++ b/browser/components/extensions/schemas/windows.json @@ -268,20 +268,20 @@ { "type": "object", "name": "createData", "properties": { "url": { "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" } } ] }, "tabId": { "type": "integer", "minimum": 0, "optional": true, "description": "The id of the tab for which you want to adopt to the new window." diff --git a/browser/components/extensions/test/browser/browser.ini b/browser/components/extensions/test/browser/browser.ini --- a/browser/components/extensions/test/browser/browser.ini +++ b/browser/components/extensions/test/browser/browser.ini @@ -87,13 +87,14 @@ tags = webextensions [browser_ext_topwindowid.js] [browser_ext_webNavigation_frameId0.js] [browser_ext_webNavigation_getFrames.js] [browser_ext_webNavigation_urlbar_transitions.js] [browser_ext_windows.js] [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 [browser_ext_windows_update.js] tags = fullscreen diff --git a/browser/components/extensions/test/browser/browser_ext_windows_create_url.js b/browser/components/extensions/test/browser/browser_ext_windows_create_url.js new file mode 100644 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_windows_create_url.js @@ -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": ``, + }, + }); + + yield extension.startup(); + yield extension.awaitFinish("window-create-url"); + yield extension.unload(); +}); diff --git a/toolkit/components/extensions/Extension.jsm b/toolkit/components/extensions/Extension.jsm --- a/toolkit/components/extensions/Extension.jsm +++ b/toolkit/components/extensions/Extension.jsm @@ -682,16 +682,20 @@ GlobalManager = { SchemaAPIManager.generateAPIs(context, context.extension.apis, apis); // For testing only. context._unwrappedAPIs = apis; let schemaWrapper = { isChromeCompat, + get url() { + return context.uri.spec; + }, + get principal() { return context.principal; }, get cloneScope() { return context.cloneScope; },