merge fx-team to mozilla-central a=merge

This commit is contained in:
Carsten "Tomcat" Book 2016-02-17 12:07:39 +01:00
commit a34e30bba2
317 changed files with 3555 additions and 1340 deletions

View File

@ -187,8 +187,8 @@ toolkit/components/osfile/**
toolkit/components/passwordmgr/** toolkit/components/passwordmgr/**
# Uses preprocessing # Uses preprocessing
toolkit/content/contentAreaUtils.js
toolkit/content/widgets/videocontrols.xml toolkit/content/widgets/videocontrols.xml
toolkit/content/widgets/wizard.xml
toolkit/components/jsdownloads/src/DownloadIntegration.jsm toolkit/components/jsdownloads/src/DownloadIntegration.jsm
toolkit/components/search/nsSearchService.js toolkit/components/search/nsSearchService.js
toolkit/components/url-classifier/** toolkit/components/url-classifier/**

View File

@ -4,9 +4,7 @@
"mozilla" "mozilla"
], ],
"rules": { "rules": {
"mozilla/components-imports": 1, "mozilla/import-globals": 1,
"mozilla/import-globals-from": 1,
"mozilla/this-top-level-scope": 1,
}, },
"env": { "env": {
"es6": true "es6": true

View File

@ -47,18 +47,32 @@ function execute (queries, options) {
return new Promise(resolve => { return new Promise(resolve => {
let root = historyService let root = historyService
.executeQueries(queries, queries.length, options).root; .executeQueries(queries, queries.length, options).root;
resolve(collect([], root)); // Let's extract an eventual uri wildcard, if both domain and uri are set.
// See utils.js::urlQueryParser() for more details.
// In case of multiple queries, we only retain the first found wildcard.
let uriWildcard = queries.reduce((prev, query) => {
if (query.uri && query.domain) {
if (!prev)
prev = query.uri.spec;
query.uri = null;
}
return prev;
}, "");
resolve(collect([], root, uriWildcard));
}); });
} }
function collect (acc, node) { function collect (acc, node, uriWildcard) {
node.containerOpen = true; node.containerOpen = true;
for (let i = 0; i < node.childCount; i++) { for (let i = 0; i < node.childCount; i++) {
let child = node.getChild(i); let child = node.getChild(i);
acc.push(child);
if (!uriWildcard || child.uri.startsWith(uriWildcard)) {
acc.push(child);
}
if (child.type === child.RESULT_TYPE_FOLDER) { if (child.type === child.RESULT_TYPE_FOLDER) {
let container = child.QueryInterface(Ci.nsINavHistoryContainerResultNode); let container = child.QueryInterface(Ci.nsINavHistoryContainerResultNode);
collect(acc, container); collect(acc, container, uriWildcard);
} }
} }
node.containerOpen = false; node.containerOpen = false;

View File

@ -12,7 +12,7 @@ module.metadata = {
} }
}; };
const { Cc, Ci } = require('chrome'); const { Cc, Ci, Cu } = require('chrome');
const { Class } = require('../core/heritage'); const { Class } = require('../core/heritage');
const { method } = require('../lang/functional'); const { method } = require('../lang/functional');
const { defer, promised, all } = require('../core/promise'); const { defer, promised, all } = require('../core/promise');
@ -22,6 +22,8 @@ const { merge } = require('../util/object');
const bmsrv = Cc["@mozilla.org/browser/nav-bookmarks-service;1"]. const bmsrv = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
getService(Ci.nsINavBookmarksService); getService(Ci.nsINavBookmarksService);
Cu.importGlobalProperties(["URL"]);
/* /*
* TreeNodes are used to construct dependency trees * TreeNodes are used to construct dependency trees
* for BookmarkItems * for BookmarkItems
@ -128,9 +130,9 @@ exports.isRootGroup = isRootGroup;
* --> 'http://moz.com', 'http://moz.com/thunderbird' * --> 'http://moz.com', 'http://moz.com/thunderbird'
* '*.moz.com' // domain: moz.com, domainIsHost: false * '*.moz.com' // domain: moz.com, domainIsHost: false
* --> 'http://moz.com', 'http://moz.com/index', 'http://ff.moz.com/test' * --> 'http://moz.com', 'http://moz.com/index', 'http://ff.moz.com/test'
* 'http://moz.com' // url: http://moz.com/, urlIsPrefix: false * 'http://moz.com' // uri: http://moz.com/
* --> 'http://moz.com/' * --> 'http://moz.com/'
* 'http://moz.com/*' // url: http://moz.com/, urlIsPrefix: true * 'http://moz.com/*' // uri: http://moz.com/, domain: moz.com, domainIsHost: true
* --> 'http://moz.com/', 'http://moz.com/thunderbird' * --> 'http://moz.com/', 'http://moz.com/thunderbird'
*/ */
@ -139,8 +141,21 @@ function urlQueryParser (query, url) {
if (/^https?:\/\//.test(url)) { if (/^https?:\/\//.test(url)) {
query.uri = url.charAt(url.length - 1) === '/' ? url : url + '/'; query.uri = url.charAt(url.length - 1) === '/' ? url : url + '/';
if (/\*$/.test(url)) { if (/\*$/.test(url)) {
query.uri = url.replace(/\*$/, ''); // Wildcard searches on URIs are not supported, so try to extract a
query.uriIsPrefix = true; // domain and filter the data later.
url = url.replace(/\*$/, '');
try {
query.domain = new URL(url).hostname;
query.domainIsHost = true;
// Unfortunately here we cannot use an expando to store the wildcard,
// cause the query is a wrapped native XPCOM object, so we reuse uri.
// We clearly don't want to query for both uri and domain, thus we'll
// have to handle this in host-query.js::execute()
query.uri = url;
} catch (ex) {
// Cannot extract an host cause it's not a valid uri, the query will
// just return nothing.
}
} }
} else { } else {
if (/^\*/.test(url)) { if (/^\*/.test(url)) {

View File

@ -453,8 +453,8 @@
key="bookmarkAllTabsKb"/> key="bookmarkAllTabsKb"/>
<menuseparator/> <menuseparator/>
<menuitem label="&recentBookmarks.label;" <menuitem label="&recentBookmarks.label;"
id="menu_recentBookmarks"
disabled="true"/> disabled="true"/>
<vbox id="menu_recentBookmarks"/>
<menuseparator id="bookmarksToolbarSeparator"/> <menuseparator id="bookmarksToolbarSeparator"/>
<menu id="bookmarksToolbarFolderMenu" <menu id="bookmarksToolbarFolderMenu"
class="menu-iconic bookmark-item" class="menu-iconic bookmark-item"

View File

@ -1341,7 +1341,7 @@ var BookmarkingUI = {
}); });
}, },
_updateRecentBookmarks: function(container, extraCSSClass = "") { _updateRecentBookmarks: function(aHeaderItem, extraCSSClass = "") {
const kMaxResults = 5; const kMaxResults = 5;
let options = PlacesUtils.history.getNewQueryOptions(); let options = PlacesUtils.history.getNewQueryOptions();
@ -1351,8 +1351,9 @@ var BookmarkingUI = {
options.maxResults = kMaxResults; options.maxResults = kMaxResults;
let query = PlacesUtils.history.getNewQuery(); let query = PlacesUtils.history.getNewQuery();
while (container.firstChild) { while (aHeaderItem.nextSibling &&
container.firstChild.remove(); aHeaderItem.nextSibling.localName == "menuitem") {
aHeaderItem.nextSibling.remove();
} }
PlacesUtils.history.QueryInterface(Ci.nsPIPlacesDatabase) PlacesUtils.history.QueryInterface(Ci.nsPIPlacesDatabase)
@ -1385,7 +1386,7 @@ var BookmarkingUI = {
} }
fragment.appendChild(item); fragment.appendChild(item);
} }
container.appendChild(fragment); aHeaderItem.parentNode.insertBefore(fragment, aHeaderItem.nextSibling);
}, },
handleError: function (aError) { handleError: function (aError) {
Cu.reportError("Error while attempting to show recent bookmarks: " + aError); Cu.reportError("Error while attempting to show recent bookmarks: " + aError);

View File

@ -83,6 +83,7 @@ if (AppConstants.platform != "macosx") {
var gEditUIVisible = true; var gEditUIVisible = true;
} }
/*globals gBrowser, gNavToolbox, gURLBar, gNavigatorBundle*/
[ [
["gBrowser", "content"], ["gBrowser", "content"],
["gNavToolbox", "navigator-toolbox"], ["gNavToolbox", "navigator-toolbox"],
@ -157,9 +158,9 @@ XPCOMUtils.defineLazyGetter(this, "PopupNotifications", function () {
}); });
XPCOMUtils.defineLazyGetter(this, "DeveloperToolbar", function() { XPCOMUtils.defineLazyGetter(this, "DeveloperToolbar", function() {
let tmp = {}; let { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
Cu.import("resource://devtools/client/shared/DeveloperToolbar.jsm", tmp); let { DeveloperToolbar } = require("devtools/client/shared/developer-toolbar");
return new tmp.DeveloperToolbar(window, document.getElementById("developer-toolbar")); return new DeveloperToolbar(window, document.getElementById("developer-toolbar"));
}); });
XPCOMUtils.defineLazyGetter(this, "BrowserToolboxProcess", function() { XPCOMUtils.defineLazyGetter(this, "BrowserToolboxProcess", function() {

View File

@ -813,9 +813,9 @@
key="manBookmarkKb"/> key="manBookmarkKb"/>
<menuseparator/> <menuseparator/>
<menuitem label="&recentBookmarks.label;" <menuitem label="&recentBookmarks.label;"
id="BMB_recentBookmarks"
disabled="true" disabled="true"
class="subviewbutton"/> class="subviewbutton"/>
<vbox id="BMB_recentBookmarks"/>
<menuseparator/> <menuseparator/>
<menu id="BMB_bookmarksToolbar" <menu id="BMB_bookmarksToolbar"
class="menu-iconic bookmark-item subviewbutton" class="menu-iconic bookmark-item subviewbutton"

View File

@ -1863,8 +1863,7 @@
}, 0, this.tabContainer); }, 0, this.tabContainer);
} }
// invalidate caches // invalidate cache
this._browsers = null;
this._visibleTabs = null; this._visibleTabs = null;
this.tabContainer.appendChild(t); this.tabContainer.appendChild(t);
@ -2379,10 +2378,6 @@
var wasPinned = aTab.pinned; var wasPinned = aTab.pinned;
// Invalidate browsers cache, as the tab is removed from the
// tab container.
this._browsers = null;
// Remove the tab ... // Remove the tab ...
this.tabContainer.removeChild(aTab); this.tabContainer.removeChild(aTab);
@ -2860,15 +2855,32 @@
onget="return this.mCurrentBrowser;" onget="return this.mCurrentBrowser;"
readonly="true"/> readonly="true"/>
<property name="browsers" readonly="true"> <field name="browsers" readonly="true">
<getter> <![CDATA[
<![CDATA[ // This defines a proxy which allows us to access browsers by
return this._browsers || // index without actually creating a full array of browsers.
(this._browsers = Array.map(this.tabs, tab => tab.linkedBrowser)); new Proxy([], {
]]> has: (target, name) => {
</getter> if (typeof name == "string" && Number.isInteger(parseInt(name))) {
</property> return (name in this.tabs);
<field name="_browsers">null</field> }
return false;
},
get: (target, name) => {
if (name == "length") {
return this.tabs.length;
}
if (typeof name == "string" && Number.isInteger(parseInt(name))) {
if (!(name in this.tabs)) {
return undefined;
}
return this.tabs[name].linkedBrowser;
}
return target[name];
}
});
]]>
</field>
<!-- Moves a tab to a new browser window, unless it's already the only tab <!-- Moves a tab to a new browser window, unless it's already the only tab
in the current window, in which case this will do nothing. --> in the current window, in which case this will do nothing. -->
@ -2929,8 +2941,7 @@
this.mCurrentTab._logicallySelected = false; this.mCurrentTab._logicallySelected = false;
this.mCurrentTab._visuallySelected = false; this.mCurrentTab._visuallySelected = false;
// invalidate caches // invalidate cache
this._browsers = null;
this._visibleTabs = null; this._visibleTabs = null;
// use .item() instead of [] because dragging to the end of the strip goes out of // use .item() instead of [] because dragging to the end of the strip goes out of

View File

@ -136,7 +136,6 @@ skip-if = e10s # Bug 1093153 - no about:home support yet
[browser_action_searchengine_alias.js] [browser_action_searchengine_alias.js]
[browser_addKeywordSearch.js] [browser_addKeywordSearch.js]
[browser_search_favicon.js] [browser_search_favicon.js]
skip-if = e10s # Bug 1212647
[browser_alltabslistener.js] [browser_alltabslistener.js]
[browser_audioTabIcon.js] [browser_audioTabIcon.js]
[browser_autocomplete_a11y_label.js] [browser_autocomplete_a11y_label.js]
@ -290,8 +289,6 @@ skip-if = os == 'win' || e10s # Bug 1159268 - Need a content-process safe versio
skip-if = e10s # Bug 1094510 - test hits the network in e10s mode only skip-if = e10s # Bug 1094510 - test hits the network in e10s mode only
[browser_clipboard.js] [browser_clipboard.js]
[browser_contentAreaClick.js] [browser_contentAreaClick.js]
[browser_contextSearchTabPosition.js]
skip-if = os == "mac" || e10s # bug 967013; e10s: bug 1094761 - test hits the network in e10s, causing next test to crash
[browser_ctrlTab.js] [browser_ctrlTab.js]
[browser_datachoices_notification.js] [browser_datachoices_notification.js]
skip-if = !datareporting skip-if = !datareporting

View File

@ -2,7 +2,7 @@
/* vim: set sts=2 sw=2 et tw=80: */ /* vim: set sts=2 sw=2 et tw=80: */
"use strict"; "use strict";
const { classes: Cc, interfaces: Ci, utils: Cu } = Components; const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/PlacesUtils.jsm"); Cu.import("resource://gre/modules/PlacesUtils.jsm");
var Bookmarks = PlacesUtils.bookmarks; var Bookmarks = PlacesUtils.bookmarks;
@ -111,7 +111,9 @@ extensions.registerSchemaAPI("bookmarks", "bookmarks", (extension, context) => {
return getTree(id, false); return getTree(id, false);
}, },
// search search: function(query) {
return Bookmarks.search(query).then(result => result.map(convert));
},
create: function(bookmark) { create: function(bookmark) {
let info = { let info = {
@ -139,7 +141,7 @@ extensions.registerSchemaAPI("bookmarks", "bookmarks", (extension, context) => {
try { try {
return Bookmarks.insert(info).then(convert); return Bookmarks.insert(info).then(convert);
} catch (e) { } catch (e) {
return Promise.reject({ message: `Invalid bookmark: ${JSON.stringify(info)}` }); return Promise.reject({message: `Invalid bookmark: ${JSON.stringify(info)}`});
} }
}, },
@ -158,7 +160,7 @@ extensions.registerSchemaAPI("bookmarks", "bookmarks", (extension, context) => {
try { try {
return Bookmarks.update(info).then(convert); return Bookmarks.update(info).then(convert);
} catch (e) { } catch (e) {
return Promise.reject({ message: `Invalid bookmark: ${JSON.stringify(info)}` }); return Promise.reject({message: `Invalid bookmark: ${JSON.stringify(info)}`});
} }
}, },
@ -177,7 +179,7 @@ extensions.registerSchemaAPI("bookmarks", "bookmarks", (extension, context) => {
try { try {
return Bookmarks.update(info).then(convert); return Bookmarks.update(info).then(convert);
} catch (e) { } catch (e) {
return Promise.reject({ message: `Invalid bookmark: ${JSON.stringify(info)}` }); return Promise.reject({message: `Invalid bookmark: ${JSON.stringify(info)}`});
} }
}, },
@ -190,7 +192,7 @@ extensions.registerSchemaAPI("bookmarks", "bookmarks", (extension, context) => {
try { try {
return Bookmarks.remove(info).then(result => {}); return Bookmarks.remove(info).then(result => {});
} catch (e) { } catch (e) {
return Promise.reject({ message: `Invalid bookmark: ${JSON.stringify(info)}` }); return Promise.reject({message: `Invalid bookmark: ${JSON.stringify(info)}`});
} }
}, },
}, },

View File

@ -44,7 +44,7 @@ function BrowserAction(options, extension) {
title: title || extension.name, title: title || extension.name,
badgeText: "", badgeText: "",
badgeBackgroundColor: null, badgeBackgroundColor: null,
icon: IconDetails.normalize({ path: options.default_icon }, extension, icon: IconDetails.normalize({path: options.default_icon}, extension,
null, true), null, true),
popup: popup, popup: popup,
}; };

View File

@ -310,7 +310,7 @@ MenuItem.prototype = {
let extension = this.extension; let extension = this.extension;
if (!rootItems.has(extension)) { if (!rootItems.has(extension)) {
let root = new MenuItem(extension, this.context, let root = new MenuItem(extension, this.context,
{ title: extension.name }, {title: extension.name},
/* isRoot = */ true); /* isRoot = */ true);
rootItems.set(extension, root); rootItems.set(extension, root);
} }

View File

@ -4,7 +4,7 @@
extensions.on("uninstall", (msg, extension) => { extensions.on("uninstall", (msg, extension) => {
if (extension.uninstallURL) { if (extension.uninstallURL) {
let browser = Services.wm.getMostRecentWindow("navigator:browser").gBrowser; let browser = Services.wm.getMostRecentWindow("navigator:browser").gBrowser;
browser.addTab(extension.uninstallURL, { relatedToCurrent: true }); browser.addTab(extension.uninstallURL, {relatedToCurrent: true});
} }
}); });

View File

@ -28,7 +28,7 @@ function PageAction(options, extension) {
this.defaults = { this.defaults = {
show: false, show: false,
title: title || extension.name, title: title || extension.name,
icon: IconDetails.normalize({ path: options.default_icon }, extension, icon: IconDetails.normalize({path: options.default_icon}, extension,
null, true), null, true),
popup: popup && extension.baseURI.resolve(popup), popup: popup && extension.baseURI.resolve(popup),
}; };

View File

@ -465,7 +465,7 @@ extensions.registerSchemaAPI("tabs", null, (extension, context) => {
captureVisibleTab: function(windowId, options) { captureVisibleTab: function(windowId, options) {
if (!extension.hasPermission("<all_urls>")) { if (!extension.hasPermission("<all_urls>")) {
return Promise.reject({ message: "The <all_urls> permission is required to use the captureVisibleTab API" }); return Promise.reject({message: "The <all_urls> permission is required to use the captureVisibleTab API"});
} }
let window = windowId == null ? let window = windowId == null ?
@ -524,7 +524,7 @@ extensions.registerSchemaAPI("tabs", null, (extension, context) => {
if (details.file !== null) { if (details.file !== null) {
let url = context.uri.resolve(details.file); let url = context.uri.resolve(details.file);
if (!extension.isExtensionURL(url)) { if (!extension.isExtensionURL(url)) {
return Promise.reject({ message: "Files to be injected must be within the extension" }); return Promise.reject({message: "Files to be injected must be within the extension"});
} }
options[kind].push(url); options[kind].push(url);
} }
@ -538,7 +538,7 @@ extensions.registerSchemaAPI("tabs", null, (extension, context) => {
options.run_at = details.runAt; options.run_at = details.runAt;
} }
return context.sendMessage(mm, "Extension:Execute", { options }, recipient); return context.sendMessage(mm, "Extension:Execute", {options}, recipient);
}, },
executeScript: function(tabId, details) { executeScript: function(tabId, details) {

View File

@ -235,7 +235,7 @@ class BasePopup {
}; };
this.browser.addEventListener("load", loadListener, true); this.browser.addEventListener("load", loadListener, true);
}).then(() => { }).then(() => {
let { contentWindow } = this.browser; let {contentWindow} = this.browser;
contentWindow.QueryInterface(Ci.nsIInterfaceRequestor) contentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils) .getInterface(Ci.nsIDOMWindowUtils)
@ -423,7 +423,7 @@ ExtensionTabManager.prototype = {
convert(tab) { convert(tab) {
let window = tab.ownerDocument.defaultView; let window = tab.ownerDocument.defaultView;
let mutedInfo = { muted: tab.muted }; let mutedInfo = {muted: tab.muted};
if (tab.muteReason === null) { if (tab.muteReason === null) {
mutedInfo.reason = "user"; mutedInfo.reason = "user";
} else if (tab.muteReason) { } else if (tab.muteReason) {

View File

@ -234,7 +234,6 @@
}, },
{ {
"name": "search", "name": "search",
"unsupported": true,
"type": "function", "type": "function",
"description": "Searches for BookmarkTreeNodes matching the given query. Queries specified with an object produce BookmarkTreeNodes matching all specified properties.", "description": "Searches for BookmarkTreeNodes matching the given query. Queries specified with an object produce BookmarkTreeNodes matching all specified properties.",
"async": "callback", "async": "callback",
@ -258,6 +257,7 @@
}, },
"url": { "url": {
"type": "string", "type": "string",
"format": "url",
"optional": true, "optional": true,
"description": "The URL of the bookmark; matches verbatim. Note that folders have no URL." "description": "The URL of the bookmark; matches verbatim. Note that folders have no URL."
}, },

View File

@ -13,10 +13,10 @@ function* runTests(options) {
browser.browserAction.getBadgeText({tabId}), browser.browserAction.getBadgeText({tabId}),
browser.browserAction.getBadgeBackgroundColor({tabId})] browser.browserAction.getBadgeBackgroundColor({tabId})]
).then(details => { ).then(details => {
return Promise.resolve({ title: details[0], return Promise.resolve({title: details[0],
popup: details[1], popup: details[1],
badge: details[2], badge: details[2],
badgeBackgroundColor: details[3] }); badgeBackgroundColor: details[3]});
}); });
} }
@ -53,7 +53,7 @@ function* runTests(options) {
// Check that the API returns the expected values, and then // Check that the API returns the expected values, and then
// run the next test. // run the next test.
new Promise(resolve => { new Promise(resolve => {
return browser.tabs.query({ active: true, currentWindow: true }, resolve); return browser.tabs.query({active: true, currentWindow: true}, resolve);
}).then(tabs => { }).then(tabs => {
return checkDetails(expecting, tabs[0].id); return checkDetails(expecting, tabs[0].id);
}).then(() => { }).then(() => {
@ -72,7 +72,7 @@ function* runTests(options) {
nextTest(); nextTest();
}); });
browser.tabs.query({ active: true, currentWindow: true }, resultTabs => { browser.tabs.query({active: true, currentWindow: true}, resultTabs => {
tabs[0] = resultTabs[0].id; tabs[0] = resultTabs[0].id;
nextTest(); nextTest();
@ -148,39 +148,39 @@ add_task(function* testTabSwitchContext() {
getTests(tabs, expectDefaults) { getTests(tabs, expectDefaults) {
let details = [ let details = [
{ "icon": browser.runtime.getURL("default.png"), {"icon": browser.runtime.getURL("default.png"),
"popup": browser.runtime.getURL("default.html"), "popup": browser.runtime.getURL("default.html"),
"title": "Default Title", "title": "Default Title",
"badge": "", "badge": "",
"badgeBackgroundColor": null }, "badgeBackgroundColor": null},
{ "icon": browser.runtime.getURL("1.png"), {"icon": browser.runtime.getURL("1.png"),
"popup": browser.runtime.getURL("default.html"), "popup": browser.runtime.getURL("default.html"),
"title": "Default Title", "title": "Default Title",
"badge": "", "badge": "",
"badgeBackgroundColor": null }, "badgeBackgroundColor": null},
{ "icon": browser.runtime.getURL("2.png"), {"icon": browser.runtime.getURL("2.png"),
"popup": browser.runtime.getURL("2.html"), "popup": browser.runtime.getURL("2.html"),
"title": "Title 2", "title": "Title 2",
"badge": "2", "badge": "2",
"badgeBackgroundColor": [0xff, 0, 0, 0xff], "badgeBackgroundColor": [0xff, 0, 0, 0xff],
"disabled": true }, "disabled": true},
{ "icon": browser.runtime.getURL("1.png"), {"icon": browser.runtime.getURL("1.png"),
"popup": browser.runtime.getURL("default-2.html"), "popup": browser.runtime.getURL("default-2.html"),
"title": "Default Title 2", "title": "Default Title 2",
"badge": "d2", "badge": "d2",
"badgeBackgroundColor": [0, 0xff, 0, 0xff], "badgeBackgroundColor": [0, 0xff, 0, 0xff],
"disabled": true }, "disabled": true},
{ "icon": browser.runtime.getURL("1.png"), {"icon": browser.runtime.getURL("1.png"),
"popup": browser.runtime.getURL("default-2.html"), "popup": browser.runtime.getURL("default-2.html"),
"title": "Default Title 2", "title": "Default Title 2",
"badge": "d2", "badge": "d2",
"badgeBackgroundColor": [0, 0xff, 0, 0xff], "badgeBackgroundColor": [0, 0xff, 0, 0xff],
"disabled": false }, "disabled": false},
{ "icon": browser.runtime.getURL("default-2.png"), {"icon": browser.runtime.getURL("default-2.png"),
"popup": browser.runtime.getURL("default-2.html"), "popup": browser.runtime.getURL("default-2.html"),
"title": "Default Title 2", "title": "Default Title 2",
"badge": "d2", "badge": "d2",
"badgeBackgroundColor": [0, 0xff, 0, 0xff] }, "badgeBackgroundColor": [0, 0xff, 0, 0xff]},
]; ];
return [ return [
@ -192,14 +192,14 @@ add_task(function* testTabSwitchContext() {
}, },
expect => { expect => {
browser.test.log("Change the icon in the current tab. Expect default properties excluding the icon."); browser.test.log("Change the icon in the current tab. Expect default properties excluding the icon.");
browser.browserAction.setIcon({ tabId: tabs[0], path: "1.png" }); browser.browserAction.setIcon({tabId: tabs[0], path: "1.png"});
expectDefaults(details[0]).then(() => { expectDefaults(details[0]).then(() => {
expect(details[1]); expect(details[1]);
}); });
}, },
expect => { expect => {
browser.test.log("Create a new tab. Expect default properties."); browser.test.log("Create a new tab. Expect default properties.");
browser.tabs.create({ active: true, url: "about:blank?0" }, tab => { browser.tabs.create({active: true, url: "about:blank?0"}, tab => {
tabs.push(tab.id); tabs.push(tab.id);
expectDefaults(details[0]).then(() => { expectDefaults(details[0]).then(() => {
expect(details[0]); expect(details[0]);
@ -209,11 +209,11 @@ add_task(function* testTabSwitchContext() {
expect => { expect => {
browser.test.log("Change properties. Expect new properties."); browser.test.log("Change properties. Expect new properties.");
let tabId = tabs[1]; let tabId = tabs[1];
browser.browserAction.setIcon({ tabId, path: "2.png" }); browser.browserAction.setIcon({tabId, path: "2.png"});
browser.browserAction.setPopup({ tabId, popup: "2.html" }); browser.browserAction.setPopup({tabId, popup: "2.html"});
browser.browserAction.setTitle({ tabId, title: "Title 2" }); browser.browserAction.setTitle({tabId, title: "Title 2"});
browser.browserAction.setBadgeText({ tabId, text: "2" }); browser.browserAction.setBadgeText({tabId, text: "2"});
browser.browserAction.setBadgeBackgroundColor({ tabId, color: [0xff, 0, 0, 0xff] }); browser.browserAction.setBadgeBackgroundColor({tabId, color: [0xff, 0, 0, 0xff]});
browser.browserAction.disable(tabId); browser.browserAction.disable(tabId);
expectDefaults(details[0]).then(() => { expectDefaults(details[0]).then(() => {
@ -232,21 +232,21 @@ add_task(function* testTabSwitchContext() {
} }
}); });
browser.tabs.update(tabs[1], { url: "about:blank?1" }); browser.tabs.update(tabs[1], {url: "about:blank?1"});
}, },
expect => { expect => {
browser.test.log("Switch back to the first tab. Expect previously set properties."); browser.test.log("Switch back to the first tab. Expect previously set properties.");
browser.tabs.update(tabs[0], { active: true }, () => { browser.tabs.update(tabs[0], {active: true}, () => {
expect(details[1]); expect(details[1]);
}); });
}, },
expect => { expect => {
browser.test.log("Change default values, expect those changes reflected."); browser.test.log("Change default values, expect those changes reflected.");
browser.browserAction.setIcon({ path: "default-2.png" }); browser.browserAction.setIcon({path: "default-2.png"});
browser.browserAction.setPopup({ popup: "default-2.html" }); browser.browserAction.setPopup({popup: "default-2.html"});
browser.browserAction.setTitle({ title: "Default Title 2" }); browser.browserAction.setTitle({title: "Default Title 2"});
browser.browserAction.setBadgeText({ text: "d2" }); browser.browserAction.setBadgeText({text: "d2"});
browser.browserAction.setBadgeBackgroundColor({ color: [0, 0xff, 0, 0xff] }); browser.browserAction.setBadgeBackgroundColor({color: [0, 0xff, 0, 0xff]});
browser.browserAction.disable(); browser.browserAction.disable();
expectDefaults(details[3]).then(() => { expectDefaults(details[3]).then(() => {
expect(details[3]); expect(details[3]);
@ -261,7 +261,7 @@ add_task(function* testTabSwitchContext() {
}, },
expect => { expect => {
browser.test.log("Switch back to tab 2. Expect former value, unaffected by changes to defaults in previous step."); browser.test.log("Switch back to tab 2. Expect former value, unaffected by changes to defaults in previous step.");
browser.tabs.update(tabs[1], { active: true }, () => { browser.tabs.update(tabs[1], {active: true}, () => {
expectDefaults(details[3]).then(() => { expectDefaults(details[3]).then(() => {
expect(details[2]); expect(details[2]);
}); });
@ -275,7 +275,7 @@ add_task(function* testTabSwitchContext() {
}, },
expect => { expect => {
browser.test.log("Create a new tab. Expect new default properties."); browser.test.log("Create a new tab. Expect new default properties.");
browser.tabs.create({ active: true, url: "about:blank?2" }, tab => { browser.tabs.create({active: true, url: "about:blank?2"}, tab => {
tabs.push(tab.id); tabs.push(tab.id);
expect(details[5]); expect(details[5]);
}); });
@ -305,26 +305,26 @@ add_task(function* testDefaultTitle() {
getTests(tabs, expectDefaults) { getTests(tabs, expectDefaults) {
let details = [ let details = [
{ "title": "Foo Extension", {"title": "Foo Extension",
"popup": "", "popup": "",
"badge": "", "badge": "",
"badgeBackgroundColor": null, "badgeBackgroundColor": null,
"icon": browser.runtime.getURL("icon.png") }, "icon": browser.runtime.getURL("icon.png")},
{ "title": "Foo Title", {"title": "Foo Title",
"popup": "", "popup": "",
"badge": "", "badge": "",
"badgeBackgroundColor": null, "badgeBackgroundColor": null,
"icon": browser.runtime.getURL("icon.png") }, "icon": browser.runtime.getURL("icon.png")},
{ "title": "Bar Title", {"title": "Bar Title",
"popup": "", "popup": "",
"badge": "", "badge": "",
"badgeBackgroundColor": null, "badgeBackgroundColor": null,
"icon": browser.runtime.getURL("icon.png") }, "icon": browser.runtime.getURL("icon.png")},
{ "title": "", {"title": "",
"popup": "", "popup": "",
"badge": "", "badge": "",
"badgeBackgroundColor": null, "badgeBackgroundColor": null,
"icon": browser.runtime.getURL("icon.png") }, "icon": browser.runtime.getURL("icon.png")},
]; ];
return [ return [
@ -336,28 +336,28 @@ add_task(function* testDefaultTitle() {
}, },
expect => { expect => {
browser.test.log("Change the title. Expect new title."); browser.test.log("Change the title. Expect new title.");
browser.browserAction.setTitle({ tabId: tabs[0], title: "Foo Title" }); browser.browserAction.setTitle({tabId: tabs[0], title: "Foo Title"});
expectDefaults(details[0]).then(() => { expectDefaults(details[0]).then(() => {
expect(details[1]); expect(details[1]);
}); });
}, },
expect => { expect => {
browser.test.log("Change the default. Expect same properties."); browser.test.log("Change the default. Expect same properties.");
browser.browserAction.setTitle({ title: "Bar Title" }); browser.browserAction.setTitle({title: "Bar Title"});
expectDefaults(details[2]).then(() => { expectDefaults(details[2]).then(() => {
expect(details[1]); expect(details[1]);
}); });
}, },
expect => { expect => {
browser.test.log("Clear the title. Expect new default title."); browser.test.log("Clear the title. Expect new default title.");
browser.browserAction.setTitle({ tabId: tabs[0], title: "" }); browser.browserAction.setTitle({tabId: tabs[0], title: ""});
expectDefaults(details[2]).then(() => { expectDefaults(details[2]).then(() => {
expect(details[2]); expect(details[2]);
}); });
}, },
expect => { expect => {
browser.test.log("Set default title to null string. Expect null string from API, extension title in UI."); browser.test.log("Set default title to null string. Expect null string from API, extension title in UI.");
browser.browserAction.setTitle({ title: "" }); browser.browserAction.setTitle({title: ""});
expectDefaults(details[3]).then(() => { expectDefaults(details[3]).then(() => {
expect(details[3]); expect(details[3]);
}); });

View File

@ -31,100 +31,100 @@ add_task(function* testDetailsObjects() {
/* eslint-disable comma-dangle, indent */ /* eslint-disable comma-dangle, indent */
let iconDetails = [ let iconDetails = [
// Only paths. // Only paths.
{ details: { "path": "a.png" }, {details: {"path": "a.png"},
resolutions: { resolutions: {
"1": browser.runtime.getURL("data/a.png"), "1": browser.runtime.getURL("data/a.png"),
"2": browser.runtime.getURL("data/a.png"), } }, "2": browser.runtime.getURL("data/a.png")}},
{ details: { "path": "/a.png" }, {details: {"path": "/a.png"},
resolutions: { resolutions: {
"1": browser.runtime.getURL("a.png"), "1": browser.runtime.getURL("a.png"),
"2": browser.runtime.getURL("a.png"), } }, "2": browser.runtime.getURL("a.png")}},
{ details: { "path": { "19": "a.png" } }, {details: {"path": {"19": "a.png"}},
resolutions: { resolutions: {
"1": browser.runtime.getURL("data/a.png"), "1": browser.runtime.getURL("data/a.png"),
"2": browser.runtime.getURL("data/a.png"), } }, "2": browser.runtime.getURL("data/a.png")}},
{ details: { "path": { "38": "a.png" } }, {details: {"path": {"38": "a.png"}},
resolutions: { resolutions: {
"1": browser.runtime.getURL("data/a.png"), "1": browser.runtime.getURL("data/a.png"),
"2": browser.runtime.getURL("data/a.png"), } }, "2": browser.runtime.getURL("data/a.png")}},
{ details: { "path": { "19": "a.png", "38": "a-x2.png" } }, {details: {"path": {"19": "a.png", "38": "a-x2.png"}},
resolutions: { resolutions: {
"1": browser.runtime.getURL("data/a.png"), "1": browser.runtime.getURL("data/a.png"),
"2": browser.runtime.getURL("data/a-x2.png"), } }, "2": browser.runtime.getURL("data/a-x2.png")}},
// Only ImageData objects. // Only ImageData objects.
{ details: { "imageData": imageData.red.imageData }, {details: {"imageData": imageData.red.imageData},
resolutions: { resolutions: {
"1": imageData.red.url, "1": imageData.red.url,
"2": imageData.red.url, } }, "2": imageData.red.url}},
{ details: { "imageData": { "19": imageData.red.imageData } }, {details: {"imageData": {"19": imageData.red.imageData}},
resolutions: { resolutions: {
"1": imageData.red.url, "1": imageData.red.url,
"2": imageData.red.url, } }, "2": imageData.red.url}},
{ details: { "imageData": { "38": imageData.red.imageData } }, {details: {"imageData": {"38": imageData.red.imageData}},
resolutions: { resolutions: {
"1": imageData.red.url, "1": imageData.red.url,
"2": imageData.red.url, } }, "2": imageData.red.url}},
{ details: { "imageData": { {details: {"imageData": {
"19": imageData.red.imageData, "19": imageData.red.imageData,
"38": imageData.green.imageData } }, "38": imageData.green.imageData}},
resolutions: { resolutions: {
"1": imageData.red.url, "1": imageData.red.url,
"2": imageData.green.url, } }, "2": imageData.green.url}},
// Mixed path and imageData objects. // Mixed path and imageData objects.
// //
// The behavior is currently undefined if both |path| and // The behavior is currently undefined if both |path| and
// |imageData| specify icons of the same size. // |imageData| specify icons of the same size.
{ details: { {details: {
"path": { "19": "a.png" }, "path": {"19": "a.png"},
"imageData": { "38": imageData.red.imageData } }, "imageData": {"38": imageData.red.imageData}},
resolutions: { resolutions: {
"1": browser.runtime.getURL("data/a.png"), "1": browser.runtime.getURL("data/a.png"),
"2": imageData.red.url, } }, "2": imageData.red.url}},
{ details: { {details: {
"path": { "38": "a.png" }, "path": {"38": "a.png"},
"imageData": { "19": imageData.red.imageData } }, "imageData": {"19": imageData.red.imageData}},
resolutions: { resolutions: {
"1": imageData.red.url, "1": imageData.red.url,
"2": browser.runtime.getURL("data/a.png"), } }, "2": browser.runtime.getURL("data/a.png")}},
// A path or ImageData object by itself is treated as a 19px icon. // A path or ImageData object by itself is treated as a 19px icon.
{ details: { {details: {
"path": "a.png", "path": "a.png",
"imageData": { "38": imageData.red.imageData } }, "imageData": {"38": imageData.red.imageData}},
resolutions: { resolutions: {
"1": browser.runtime.getURL("data/a.png"), "1": browser.runtime.getURL("data/a.png"),
"2": imageData.red.url, } }, "2": imageData.red.url}},
{ details: { {details: {
"path": { "38": "a.png" }, "path": {"38": "a.png"},
"imageData": imageData.red.imageData, }, "imageData": imageData.red.imageData},
resolutions: { resolutions: {
"1": imageData.red.url, "1": imageData.red.url,
"2": browser.runtime.getURL("data/a.png"), } }, "2": browser.runtime.getURL("data/a.png")}},
// Various resolutions // Various resolutions
{ details: { "path": { "18": "a.png", "32": "a-x2.png" } }, {details: {"path": {"18": "a.png", "32": "a-x2.png"}},
resolutions: { resolutions: {
"1": browser.runtime.getURL("data/a.png"), "1": browser.runtime.getURL("data/a.png"),
"2": browser.runtime.getURL("data/a-x2.png"), } }, "2": browser.runtime.getURL("data/a-x2.png")}},
{ details: { "path": { "16": "16.png", "100": "100.png" } }, {details: {"path": {"16": "16.png", "100": "100.png"}},
resolutions: { resolutions: {
"1": browser.runtime.getURL("data/100.png"), "1": browser.runtime.getURL("data/100.png"),
"2": browser.runtime.getURL("data/100.png"), } }, "2": browser.runtime.getURL("data/100.png")}},
{ details: { "path": { "2": "2.png"} }, {details: {"path": {"2": "2.png"}},
resolutions: { resolutions: {
"1": browser.runtime.getURL("data/2.png"), "1": browser.runtime.getURL("data/2.png"),
"2": browser.runtime.getURL("data/2.png"), } }, "2": browser.runtime.getURL("data/2.png")}},
{ details: { "path": { {details: {"path": {
"6": "6.png", "6": "6.png",
"18": "18.png", "18": "18.png",
"32": "32.png", "32": "32.png",
"48": "48.png", "48": "48.png",
"128": "128.png" } }, "128": "128.png"}},
resolutions: { resolutions: {
"1": browser.runtime.getURL("data/18.png"), "1": browser.runtime.getURL("data/18.png"),
"2": browser.runtime.getURL("data/48.png"), } }, "2": browser.runtime.getURL("data/48.png")}},
]; ];
// Allow serializing ImageData objects for logging. // Allow serializing ImageData objects for logging.
@ -162,7 +162,7 @@ add_task(function* testDetailsObjects() {
let tests = []; let tests = [];
for (let [idx, icon] of iconDetails.entries()) { for (let [idx, icon] of iconDetails.entries()) {
for (let res of Object.keys(icon.resolutions)) { for (let res of Object.keys(icon.resolutions)) {
tests.push({ index: idx, resolution: Number(res) }); tests.push({index: idx, resolution: Number(res)});
} }
} }
@ -170,7 +170,7 @@ add_task(function* testDetailsObjects() {
// between each test. // between each test.
tests.sort(test => test.resolution); tests.sort(test => test.resolution);
browser.tabs.query({ active: true, currentWindow: true }, tabs => { browser.tabs.query({active: true, currentWindow: true}, tabs => {
tabId = tabs[0].id; tabId = tabs[0].id;
browser.pageAction.show(tabId); browser.pageAction.show(tabId);
@ -230,7 +230,7 @@ add_task(function* testInvalidIconSizes() {
}, },
background: function() { background: function() {
browser.tabs.query({ active: true, currentWindow: true }, tabs => { browser.tabs.query({active: true, currentWindow: true}, tabs => {
let tabId = tabs[0].id; let tabId = tabs[0].id;
let promises = []; let promises = [];
@ -255,16 +255,16 @@ add_task(function* testInvalidIconSizes() {
for (let type of ["path", "imageData"]) { for (let type of ["path", "imageData"]) {
let img = type == "imageData" ? imageData : "test.png"; let img = type == "imageData" ? imageData : "test.png";
assertSetIconThrows({ [type]: { "abcdef": img } }); assertSetIconThrows({[type]: {"abcdef": img}});
assertSetIconThrows({ [type]: { "48px": img } }); assertSetIconThrows({[type]: {"48px": img}});
assertSetIconThrows({ [type]: { "20.5": img } }); assertSetIconThrows({[type]: {"20.5": img}});
assertSetIconThrows({ [type]: { "5.0": img } }); assertSetIconThrows({[type]: {"5.0": img}});
assertSetIconThrows({ [type]: { "-300": img } }); assertSetIconThrows({[type]: {"-300": img}});
assertSetIconThrows({ [type]: { "abc": img, "5": img }}); assertSetIconThrows({[type]: {"abc": img, "5": img}});
} }
assertSetIconThrows({ imageData: { "abcdef": imageData }, path: {"5": "test.png"} }); assertSetIconThrows({imageData: {"abcdef": imageData}, path: {"5": "test.png"}});
assertSetIconThrows({ path: { "abcdef": "test.png" }, imageData: {"5": imageData} }); assertSetIconThrows({path: {"abcdef": "test.png"}, imageData: {"5": imageData}});
} }
Promise.all(promises).then(() => { Promise.all(promises).then(() => {
@ -287,9 +287,9 @@ add_task(function* testDefaultDetails() {
let icons = [ let icons = [
"foo/bar.png", "foo/bar.png",
"/foo/bar.png", "/foo/bar.png",
{ "19": "foo/bar.png" }, {"19": "foo/bar.png"},
{ "38": "foo/bar.png" }, {"38": "foo/bar.png"},
{ "19": "foo/bar.png", "38": "baz/quux.png" }, {"19": "foo/bar.png", "38": "baz/quux.png"},
]; ];
let expectedURL = new RegExp(String.raw`^moz-extension://[^/]+/foo/bar\.png$`); let expectedURL = new RegExp(String.raw`^moz-extension://[^/]+/foo/bar\.png$`);
@ -297,12 +297,12 @@ add_task(function* testDefaultDetails() {
for (let icon of icons) { for (let icon of icons) {
let extension = ExtensionTestUtils.loadExtension({ let extension = ExtensionTestUtils.loadExtension({
manifest: { manifest: {
"browser_action": { "default_icon": icon }, "browser_action": {"default_icon": icon},
"page_action": { "default_icon": icon }, "page_action": {"default_icon": icon},
}, },
background: function() { background: function() {
browser.tabs.query({ active: true, currentWindow: true }, tabs => { browser.tabs.query({active: true, currentWindow: true}, tabs => {
let tabId = tabs[0].id; let tabId = tabs[0].id;
browser.pageAction.show(tabId); browser.pageAction.show(tabId);
@ -345,7 +345,7 @@ add_task(function* testSecureURLsDenied() {
}, },
background: function() { background: function() {
browser.tabs.query({ active: true, currentWindow: true }, tabs => { browser.tabs.query({active: true, currentWindow: true}, tabs => {
let tabId = tabs[0].id; let tabId = tabs[0].id;
let urls = ["chrome://browser/content/browser.xul", let urls = ["chrome://browser/content/browser.xul",

View File

@ -30,34 +30,34 @@ function* testInArea(area) {
let sendClick; let sendClick;
let tests = [ let tests = [
() => { () => {
sendClick({ expectEvent: false, expectPopup: "a" }); sendClick({expectEvent: false, expectPopup: "a"});
}, },
() => { () => {
sendClick({ expectEvent: false, expectPopup: "a" }); sendClick({expectEvent: false, expectPopup: "a"});
}, },
() => { () => {
browser.browserAction.setPopup({ popup: "popup-b.html" }); browser.browserAction.setPopup({popup: "popup-b.html"});
sendClick({ expectEvent: false, expectPopup: "b" }); sendClick({expectEvent: false, expectPopup: "b"});
}, },
() => { () => {
sendClick({ expectEvent: false, expectPopup: "b" }); sendClick({expectEvent: false, expectPopup: "b"});
}, },
() => { () => {
browser.browserAction.setPopup({ popup: "" }); browser.browserAction.setPopup({popup: ""});
sendClick({ expectEvent: true, expectPopup: null }); sendClick({expectEvent: true, expectPopup: null});
}, },
() => { () => {
sendClick({ expectEvent: true, expectPopup: null }); sendClick({expectEvent: true, expectPopup: null});
}, },
() => { () => {
browser.browserAction.setPopup({ popup: "/popup-a.html" }); browser.browserAction.setPopup({popup: "/popup-a.html"});
sendClick({ expectEvent: false, expectPopup: "a" }); sendClick({expectEvent: false, expectPopup: "a"});
}, },
]; ];
let expect = {}; let expect = {};
sendClick = ({ expectEvent, expectPopup }) => { sendClick = ({expectEvent, expectPopup}) => {
expect = { event: expectEvent, popup: expectPopup }; expect = {event: expectEvent, popup: expectPopup};
browser.test.sendMessage("send-click"); browser.test.sendMessage("send-click");
}; };

View File

@ -43,7 +43,7 @@ add_task(function* () {
}); });
}); });
browser.tabs.executeScript({ file: "script.js" }); browser.tabs.executeScript({file: "script.js"});
}, },
files: { files: {

View File

@ -22,14 +22,14 @@ add_task(function* () {
browser.test.sendMessage("menuItemClick", JSON.stringify(info)); browser.test.sendMessage("menuItemClick", JSON.stringify(info));
} }
browser.contextMenus.create({ contexts: ["all"], type: "separator" }); browser.contextMenus.create({contexts: ["all"], type: "separator"});
let contexts = ["page", "selection", "image"]; let contexts = ["page", "selection", "image"];
for (let i = 0; i < contexts.length; i++) { for (let i = 0; i < contexts.length; i++) {
let context = contexts[i]; let context = contexts[i];
let title = context; let title = context;
browser.contextMenus.create({ title: title, contexts: [context], id: "ext-" + context, browser.contextMenus.create({title: title, contexts: [context], id: "ext-" + context,
onclick: genericOnClick }); onclick: genericOnClick});
if (context == "selection") { if (context == "selection") {
browser.contextMenus.update("ext-selection", { browser.contextMenus.update("ext-selection", {
title: "selection is: '%s'", title: "selection is: '%s'",
@ -41,20 +41,20 @@ add_task(function* () {
} }
} }
let parent = browser.contextMenus.create({ title: "parent" }); let parent = browser.contextMenus.create({title: "parent"});
browser.contextMenus.create( browser.contextMenus.create(
{ title: "child1", parentId: parent, onclick: genericOnClick }); {title: "child1", parentId: parent, onclick: genericOnClick});
let child2 = browser.contextMenus.create( let child2 = browser.contextMenus.create(
{ title: "child2", parentId: parent, onclick: genericOnClick }); {title: "child2", parentId: parent, onclick: genericOnClick});
let parentToDel = browser.contextMenus.create({ title: "parentToDel" }); let parentToDel = browser.contextMenus.create({title: "parentToDel"});
browser.contextMenus.create( browser.contextMenus.create(
{ title: "child1", parentId: parentToDel, onclick: genericOnClick }); {title: "child1", parentId: parentToDel, onclick: genericOnClick});
browser.contextMenus.create( browser.contextMenus.create(
{ title: "child2", parentId: parentToDel, onclick: genericOnClick }); {title: "child2", parentId: parentToDel, onclick: genericOnClick});
browser.contextMenus.remove(parentToDel); browser.contextMenus.remove(parentToDel);
browser.contextMenus.update(parent, { parentId: child2 }).then( browser.contextMenus.update(parent, {parentId: child2}).then(
() => { () => {
browser.test.notifyFail(); browser.test.notifyFail();
}, },
@ -81,7 +81,7 @@ add_task(function* () {
let contentAreaContextMenu = document.getElementById("contentAreaContextMenu"); let contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
let popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown"); let popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouseAtCenter("#img1", yield BrowserTestUtils.synthesizeMouseAtCenter("#img1",
{ type: "contextmenu", button: 2 }, gBrowser.selectedBrowser); {type: "contextmenu", button: 2}, gBrowser.selectedBrowser);
yield popupShownPromise; yield popupShownPromise;
// Check some menu items // Check some menu items
@ -134,7 +134,7 @@ add_task(function* () {
// Bring up context menu again // Bring up context menu again
popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown"); popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouse(null, 1, 1, yield BrowserTestUtils.synthesizeMouse(null, 1, 1,
{ type: "contextmenu", button: 2 }, gBrowser.selectedBrowser); {type: "contextmenu", button: 2}, gBrowser.selectedBrowser);
yield popupShownPromise; yield popupShownPromise;
items = contentAreaContextMenu.getElementsByAttribute("ext-type", "top-level-menu"); items = contentAreaContextMenu.getElementsByAttribute("ext-type", "top-level-menu");
@ -163,7 +163,7 @@ add_task(function* () {
popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown"); popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouseAtCenter("#img1", yield BrowserTestUtils.synthesizeMouseAtCenter("#img1",
{ type: "contextmenu", button: 2 }, gBrowser.selectedBrowser); {type: "contextmenu", button: 2}, gBrowser.selectedBrowser);
yield popupShownPromise; yield popupShownPromise;
items = contentAreaContextMenu.getElementsByAttribute("ext-type", "top-level-menu"); items = contentAreaContextMenu.getElementsByAttribute("ext-type", "top-level-menu");

View File

@ -37,7 +37,7 @@ add_task(function* testLastError() {
SimpleTest.monitorConsole(resolve, [{message: /Invalid extension ID/, forbid: true}]); SimpleTest.monitorConsole(resolve, [{message: /Invalid extension ID/, forbid: true}]);
}); });
yield sendMessage({ checkLastError: api }); yield sendMessage({checkLastError: api});
SimpleTest.endMonitorConsole(); SimpleTest.endMonitorConsole();
yield waitForConsole; yield waitForConsole;

View File

@ -11,7 +11,7 @@ function* runTests(options) {
// promise that resolves to an object containing them. // promise that resolves to an object containing them.
function getDetails() { function getDetails() {
return new Promise(resolve => { return new Promise(resolve => {
return browser.tabs.query({ active: true, currentWindow: true }, resolve); return browser.tabs.query({active: true, currentWindow: true}, resolve);
}).then(([tab]) => { }).then(([tab]) => {
let tabId = tab.id; let tabId = tab.id;
browser.test.log(`Get details: tab={id: ${tabId}, url: ${JSON.stringify(tab.url)}}`); browser.test.log(`Get details: tab={id: ${tabId}, url: ${JSON.stringify(tab.url)}}`);
@ -19,8 +19,8 @@ function* runTests(options) {
browser.pageAction.getTitle({tabId}), browser.pageAction.getTitle({tabId}),
browser.pageAction.getPopup({tabId})]); browser.pageAction.getPopup({tabId})]);
}).then(details => { }).then(details => {
return Promise.resolve({ title: details[0], return Promise.resolve({title: details[0],
popup: details[1] }); popup: details[1]});
}); });
} }
@ -59,7 +59,7 @@ function* runTests(options) {
tabs = []; tabs = [];
tests = getTests(tabs); tests = getTests(tabs);
browser.tabs.query({ active: true, currentWindow: true }, resultTabs => { browser.tabs.query({active: true, currentWindow: true}, resultTabs => {
tabs[0] = resultTabs[0].id; tabs[0] = resultTabs[0].id;
nextTest(); nextTest();
@ -163,18 +163,18 @@ add_task(function* testTabSwitchContext() {
getTests(tabs) { getTests(tabs) {
let details = [ let details = [
{ "icon": browser.runtime.getURL("default.png"), {"icon": browser.runtime.getURL("default.png"),
"popup": browser.runtime.getURL("default.html"), "popup": browser.runtime.getURL("default.html"),
"title": "Default Title \u263a" }, "title": "Default Title \u263a"},
{ "icon": browser.runtime.getURL("1.png"), {"icon": browser.runtime.getURL("1.png"),
"popup": browser.runtime.getURL("default.html"), "popup": browser.runtime.getURL("default.html"),
"title": "Default Title \u263a" }, "title": "Default Title \u263a"},
{ "icon": browser.runtime.getURL("2.png"), {"icon": browser.runtime.getURL("2.png"),
"popup": browser.runtime.getURL("2.html"), "popup": browser.runtime.getURL("2.html"),
"title": "Title 2" }, "title": "Title 2"},
{ "icon": browser.runtime.getURL("2.png"), {"icon": browser.runtime.getURL("2.png"),
"popup": browser.runtime.getURL("2.html"), "popup": browser.runtime.getURL("2.html"),
"title": "Default Title \u263a" }, "title": "Default Title \u263a"},
]; ];
let promiseTabLoad = details => { let promiseTabLoad = details => {
@ -201,13 +201,13 @@ add_task(function* testTabSwitchContext() {
}, },
expect => { expect => {
browser.test.log("Change the icon. Expect default properties excluding the icon."); browser.test.log("Change the icon. Expect default properties excluding the icon.");
browser.pageAction.setIcon({ tabId: tabs[0], path: "1.png" }); browser.pageAction.setIcon({tabId: tabs[0], path: "1.png"});
expect(details[1]); expect(details[1]);
}, },
expect => { expect => {
browser.test.log("Create a new tab. No icon visible."); browser.test.log("Create a new tab. No icon visible.");
browser.tabs.create({ active: true, url: "about:blank?0" }, tab => { browser.tabs.create({active: true, url: "about:blank?0"}, tab => {
tabLoadPromise = promiseTabLoad({ url: "about:blank?0", id: tab.id }); tabLoadPromise = promiseTabLoad({url: "about:blank?0", id: tab.id});
tabs.push(tab.id); tabs.push(tab.id);
expect(null); expect(null);
}); });
@ -222,15 +222,15 @@ add_task(function* testTabSwitchContext() {
browser.test.log("Change properties. Expect new properties."); browser.test.log("Change properties. Expect new properties.");
let tabId = tabs[1]; let tabId = tabs[1];
browser.pageAction.show(tabId); browser.pageAction.show(tabId);
browser.pageAction.setIcon({ tabId, path: "2.png" }); browser.pageAction.setIcon({tabId, path: "2.png"});
browser.pageAction.setPopup({ tabId, popup: "2.html" }); browser.pageAction.setPopup({tabId, popup: "2.html"});
browser.pageAction.setTitle({ tabId, title: "Title 2" }); browser.pageAction.setTitle({tabId, title: "Title 2"});
expect(details[2]); expect(details[2]);
}, },
expect => { expect => {
browser.test.log("Clear the title. Expect default title."); browser.test.log("Clear the title. Expect default title.");
browser.pageAction.setTitle({ tabId: tabs[1], title: "" }); browser.pageAction.setTitle({tabId: tabs[1], title: ""});
expect(details[3]); expect(details[3]);
}, },
@ -239,11 +239,11 @@ add_task(function* testTabSwitchContext() {
// TODO: This listener should not be necessary, but the |tabs.update| // TODO: This listener should not be necessary, but the |tabs.update|
// callback currently fires too early in e10s windows. // callback currently fires too early in e10s windows.
promiseTabLoad({ id: tabs[1], url: "about:blank?1" }).then(() => { promiseTabLoad({id: tabs[1], url: "about:blank?1"}).then(() => {
expect(null); expect(null);
}); });
browser.tabs.update(tabs[1], { url: "about:blank?1" }); browser.tabs.update(tabs[1], {url: "about:blank?1"});
}, },
expect => { expect => {
browser.test.log("Show the icon. Expect default properties again."); browser.test.log("Show the icon. Expect default properties again.");
@ -252,14 +252,14 @@ add_task(function* testTabSwitchContext() {
}, },
expect => { expect => {
browser.test.log("Switch back to the first tab. Expect previously set properties."); browser.test.log("Switch back to the first tab. Expect previously set properties.");
browser.tabs.update(tabs[0], { active: true }, () => { browser.tabs.update(tabs[0], {active: true}, () => {
expect(details[1]); expect(details[1]);
}); });
}, },
expect => { expect => {
browser.test.log("Hide the icon on tab 2. Switch back, expect hidden."); browser.test.log("Hide the icon on tab 2. Switch back, expect hidden.");
browser.pageAction.hide(tabs[1]); browser.pageAction.hide(tabs[1]);
browser.tabs.update(tabs[1], { active: true }, () => { browser.tabs.update(tabs[1], {active: true}, () => {
expect(null); expect(null);
}); });
}, },
@ -293,12 +293,12 @@ add_task(function* testDefaultTitle() {
getTests(tabs) { getTests(tabs) {
let details = [ let details = [
{ "title": "Foo Extension", {"title": "Foo Extension",
"popup": "", "popup": "",
"icon": browser.runtime.getURL("icon.png") }, "icon": browser.runtime.getURL("icon.png")},
{ "title": "Foo Title", {"title": "Foo Title",
"popup": "", "popup": "",
"icon": browser.runtime.getURL("icon.png") }, "icon": browser.runtime.getURL("icon.png")},
]; ];
return [ return [
@ -313,12 +313,12 @@ add_task(function* testDefaultTitle() {
}, },
expect => { expect => {
browser.test.log("Change the title. Expect new title."); browser.test.log("Change the title. Expect new title.");
browser.pageAction.setTitle({ tabId: tabs[0], title: "Foo Title" }); browser.pageAction.setTitle({tabId: tabs[0], title: "Foo Title"});
expect(details[1]); expect(details[1]);
}, },
expect => { expect => {
browser.test.log("Clear the title. Expect extension title."); browser.test.log("Clear the title. Expect extension title.");
browser.pageAction.setTitle({ tabId: tabs[0], title: "" }); browser.pageAction.setTitle({tabId: tabs[0], title: ""});
expect(details[0]); expect(details[0]);
}, },
]; ];

View File

@ -34,34 +34,34 @@ add_task(function* testPageActionPopup() {
let sendClick; let sendClick;
let tests = [ let tests = [
() => { () => {
sendClick({ expectEvent: false, expectPopup: "a" }); sendClick({expectEvent: false, expectPopup: "a"});
}, },
() => { () => {
sendClick({ expectEvent: false, expectPopup: "a" }); sendClick({expectEvent: false, expectPopup: "a"});
}, },
() => { () => {
browser.pageAction.setPopup({ tabId, popup: "popup-b.html" }); browser.pageAction.setPopup({tabId, popup: "popup-b.html"});
sendClick({ expectEvent: false, expectPopup: "b" }); sendClick({expectEvent: false, expectPopup: "b"});
}, },
() => { () => {
sendClick({ expectEvent: false, expectPopup: "b" }); sendClick({expectEvent: false, expectPopup: "b"});
}, },
() => { () => {
browser.pageAction.setPopup({ tabId, popup: "" }); browser.pageAction.setPopup({tabId, popup: ""});
sendClick({ expectEvent: true, expectPopup: null }); sendClick({expectEvent: true, expectPopup: null});
}, },
() => { () => {
sendClick({ expectEvent: true, expectPopup: null }); sendClick({expectEvent: true, expectPopup: null});
}, },
() => { () => {
browser.pageAction.setPopup({ tabId, popup: "/popup-a.html" }); browser.pageAction.setPopup({tabId, popup: "/popup-a.html"});
sendClick({ expectEvent: false, expectPopup: "a" }); sendClick({expectEvent: false, expectPopup: "a"});
}, },
]; ];
let expect = {}; let expect = {};
sendClick = ({ expectEvent, expectPopup }) => { sendClick = ({expectEvent, expectPopup}) => {
expect = { event: expectEvent, popup: expectPopup }; expect = {event: expectEvent, popup: expectPopup};
browser.test.sendMessage("send-click"); browser.test.sendMessage("send-click");
}; };
@ -101,7 +101,7 @@ add_task(function* testPageActionPopup() {
} }
}); });
browser.tabs.query({ active: true, currentWindow: true }, tabs => { browser.tabs.query({active: true, currentWindow: true}, tabs => {
tabId = tabs[0].id; tabId = tabs[0].id;
browser.pageAction.show(tabId); browser.pageAction.show(tabId);
@ -165,7 +165,7 @@ add_task(function* testPageActionSecurity() {
let extension = ExtensionTestUtils.loadExtension({ let extension = ExtensionTestUtils.loadExtension({
manifest: { manifest: {
[api]: { "default_popup": URL }, [api]: {"default_popup": URL},
}, },
}); });

View File

@ -27,15 +27,15 @@ add_task(function* testPageActionPopup() {
background: function() { background: function() {
let tabId; let tabId;
browser.tabs.query({ active: true, currentWindow: true }, tabs => { browser.tabs.query({active: true, currentWindow: true}, tabs => {
tabId = tabs[0].id; tabId = tabs[0].id;
browser.pageAction.show(tabId); browser.pageAction.show(tabId);
browser.test.sendMessage("ready"); browser.test.sendMessage("ready");
}); });
browser.test.onMessage.addListener(() => { browser.test.onMessage.addListener(() => {
browser.browserAction.setPopup({ popup: "/popup-a.html" }); browser.browserAction.setPopup({popup: "/popup-a.html"});
browser.pageAction.setPopup({ tabId, popup: "popup-b.html" }); browser.pageAction.setPopup({tabId, popup: "popup-b.html"});
browser.test.sendMessage("ok"); browser.test.sendMessage("ok");
}); });

View File

@ -1,7 +1,7 @@
"use strict"; "use strict";
let { AddonManager } = Components.utils.import("resource://gre/modules/AddonManager.jsm", {}); let {AddonManager} = Components.utils.import("resource://gre/modules/AddonManager.jsm", {});
let { Extension } = Components.utils.import("resource://gre/modules/Extension.jsm", {}); let {Extension} = Components.utils.import("resource://gre/modules/Extension.jsm", {});
function install(url) { function install(url) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -78,7 +78,7 @@ add_task(function* test_setuninstallurl_badargs() {
add_task(function* test_setuninstall_empty_url() { add_task(function* test_setuninstall_empty_url() {
function backgroundScript() { function backgroundScript() {
browser.runtime.setUninstallURL("") browser.runtime.setUninstallURL("")
.then(() => browser.tabs.create({ url: "http://example.com/addon_loaded" })); .then(() => browser.tabs.create({url: "http://example.com/addon_loaded"}));
} }
let addon = yield makeAndInstallXPI("test_uinstallurl2@tests.mozilla.org", let addon = yield makeAndInstallXPI("test_uinstallurl2@tests.mozilla.org",
@ -95,7 +95,7 @@ add_task(function* test_setuninstall_empty_url() {
add_task(function* test_setuninstallurl() { add_task(function* test_setuninstallurl() {
function backgroundScript() { function backgroundScript() {
browser.runtime.setUninstallURL("http://example.com/addon_uninstalled") browser.runtime.setUninstallURL("http://example.com/addon_uninstalled")
.then(() => browser.tabs.create({ url: "http://example.com/addon_loaded" })); .then(() => browser.tabs.create({url: "http://example.com/addon_loaded"}));
} }
let addon = yield makeAndInstallXPI("test_uinstallurl@tests.mozilla.org", let addon = yield makeAndInstallXPI("test_uinstallurl@tests.mozilla.org",

View File

@ -38,16 +38,16 @@ add_task(function* () {
}); });
}); });
browser.tabs.create({ url: "tab.html" }, browser.tabs.create({url: "tab.html"},
(tab) => { tabId = tab.id; }); (tab) => { tabId = tab.id; });
}, },
files: { files: {
"tab.js": function() { "tab.js": function() {
let port = browser.runtime.connect({ name: "tab-connection-name"}); let port = browser.runtime.connect({name: "tab-connection-name"});
port.postMessage("tab to background port message"); port.postMessage("tab to background port message");
port.onMessage.addListener((msg) => { port.onMessage.addListener((msg) => {
port.postMessage({ tabReceived: msg }); port.postMessage({tabReceived: msg});
}); });
}, },
"tab.html": ` "tab.html": `

View File

@ -49,7 +49,7 @@ add_task(function* () {
let windowId; let windowId;
let tabIds; let tabIds;
promiseTabs.query({ lastFocusedWindow: true }).then(tabs => { promiseTabs.query({lastFocusedWindow: true}).then(tabs => {
browser.test.assertEq(tabs.length, 3, "We have three tabs"); browser.test.assertEq(tabs.length, 3, "We have three tabs");
for (let tab of tabs) { for (let tab of tabs) {
@ -65,10 +65,10 @@ add_task(function* () {
browser.test.log("Test initial queries for muted and audible return no tabs"); browser.test.log("Test initial queries for muted and audible return no tabs");
return Promise.all([ return Promise.all([
promiseTabs.query({ windowId, audible: false }), promiseTabs.query({windowId, audible: false}),
promiseTabs.query({ windowId, audible: true }), promiseTabs.query({windowId, audible: true}),
promiseTabs.query({ windowId, muted: true }), promiseTabs.query({windowId, muted: true}),
promiseTabs.query({ windowId, muted: false }), promiseTabs.query({windowId, muted: false}),
]); ]);
}).then(([silent, audible, muted, nonMuted]) => { }).then(([silent, audible, muted, nonMuted]) => {
browser.test.assertEq(3, silent.length, "Three silent tabs"); browser.test.assertEq(3, silent.length, "Three silent tabs");
@ -95,10 +95,10 @@ add_task(function* () {
browser.test.log("Re-check queries. Expect one audible and one muted tab"); browser.test.log("Re-check queries. Expect one audible and one muted tab");
return Promise.all([ return Promise.all([
promiseTabs.query({ windowId, audible: false }), promiseTabs.query({windowId, audible: false}),
promiseTabs.query({ windowId, audible: true }), promiseTabs.query({windowId, audible: true}),
promiseTabs.query({ windowId, muted: true }), promiseTabs.query({windowId, muted: true}),
promiseTabs.query({ windowId, muted: false }), promiseTabs.query({windowId, muted: false}),
]); ]);
}).then(([silent, audible, muted, nonMuted]) => { }).then(([silent, audible, muted, nonMuted]) => {
browser.test.assertEq(2, silent.length, "Two silent tabs"); browser.test.assertEq(2, silent.length, "Two silent tabs");
@ -116,8 +116,8 @@ add_task(function* () {
return Promise.all([ return Promise.all([
promiseUpdated(tabIds[0], "mutedInfo"), promiseUpdated(tabIds[0], "mutedInfo"),
promiseUpdated(tabIds[1], "mutedInfo"), promiseUpdated(tabIds[1], "mutedInfo"),
promiseTabs.update(tabIds[0], { muted: false }), promiseTabs.update(tabIds[0], {muted: false}),
promiseTabs.update(tabIds[1], { muted: true }), promiseTabs.update(tabIds[1], {muted: true}),
]); ]);
}).then(([unmuted, muted]) => { }).then(([unmuted, muted]) => {
for (let obj of [unmuted.changeInfo, unmuted.tab]) { for (let obj of [unmuted.changeInfo, unmuted.tab]) {

View File

@ -39,11 +39,11 @@ function* runTest(options) {
browser.test.log(`Test color ${options.color} at fullZoom=${options.fullZoom}`); browser.test.log(`Test color ${options.color} at fullZoom=${options.fullZoom}`);
promiseTabs.query({ currentWindow: true, active: true }).then(([tab]) => { promiseTabs.query({currentWindow: true, active: true}).then(([tab]) => {
return Promise.all([ return Promise.all([
promiseTabs.captureVisibleTab(tab.windowId, { format: "jpeg", quality: 95 }), promiseTabs.captureVisibleTab(tab.windowId, {format: "jpeg", quality: 95}),
promiseTabs.captureVisibleTab(tab.windowId, { format: "png", quality: 95 }), promiseTabs.captureVisibleTab(tab.windowId, {format: "png", quality: 95}),
promiseTabs.captureVisibleTab(tab.windowId, { quality: 95 }), promiseTabs.captureVisibleTab(tab.windowId, {quality: 95}),
promiseTabs.captureVisibleTab(tab.windowId), promiseTabs.captureVisibleTab(tab.windowId),
]).then(([jpeg, png, ...pngs]) => { ]).then(([jpeg, png, ...pngs]) => {
browser.test.assertTrue(pngs.every(url => url == png), "All PNGs are identical"); browser.test.assertTrue(pngs.every(url => url == png), "All PNGs are identical");
@ -60,7 +60,7 @@ function* runTest(options) {
}).then(([jpeg, png]) => { }).then(([jpeg, png]) => {
let tabDims = `${tab.width}\u00d7${tab.height}`; let tabDims = `${tab.width}\u00d7${tab.height}`;
let images = { jpeg, png }; let images = {jpeg, png};
for (let format of Object.keys(images)) { for (let format of Object.keys(images)) {
let img = images[format]; let img = images[format];
@ -78,17 +78,17 @@ function* runTest(options) {
// Check the colors of the first and last pixels of the image, to make // Check the colors of the first and last pixels of the image, to make
// sure we capture the entire frame, and scale it correctly. // sure we capture the entire frame, and scale it correctly.
let coords = [ let coords = [
{ x: 0, y: 0, {x: 0, y: 0,
color: options.color }, color: options.color},
{ x: img.width - 1, {x: img.width - 1,
y: img.height - 1, y: img.height - 1,
color: options.color }, color: options.color},
{ x: img.width / 2 | 0, {x: img.width / 2 | 0,
y: img.height / 2 | 0, y: img.height / 2 | 0,
color: options.neutral }, color: options.neutral},
]; ];
for (let { x, y, color } of coords) { for (let {x, y, color} of coords) {
let imageData = ctx.getImageData(x, y, 1, 1).data; let imageData = ctx.getImageData(x, y, 1, 1).data;
if (format == "png") { if (format == "png") {
@ -133,13 +133,13 @@ function* runTest(options) {
} }
add_task(function* testCaptureVisibleTab() { add_task(function* testCaptureVisibleTab() {
yield runTest({ color: [0, 0, 0], fullZoom: 1 }); yield runTest({color: [0, 0, 0], fullZoom: 1});
yield runTest({ color: [0, 0, 0], fullZoom: 2 }); yield runTest({color: [0, 0, 0], fullZoom: 2});
yield runTest({ color: [0, 0, 0], fullZoom: 0.5 }); yield runTest({color: [0, 0, 0], fullZoom: 0.5});
yield runTest({ color: [255, 255, 255], fullZoom: 1 }); yield runTest({color: [255, 255, 255], fullZoom: 1});
}); });
add_task(function* testCaptureVisibleTabPermissions() { add_task(function* testCaptureVisibleTabPermissions() {
@ -149,7 +149,7 @@ add_task(function* testCaptureVisibleTabPermissions() {
}, },
background: function(x) { background: function(x) {
browser.tabs.query({ currentWindow: true, active: true }, tab => { browser.tabs.query({currentWindow: true, active: true}, tab => {
browser.tabs.captureVisibleTab(tab.windowId).then( browser.tabs.captureVisibleTab(tab.windowId).then(
() => { () => {
browser.test.notifyFail("captureVisibleTabPermissions"); browser.test.notifyFail("captureVisibleTabPermissions");

View File

@ -19,7 +19,7 @@ add_task(function* () {
manifest: { manifest: {
"permissions": ["tabs"], "permissions": ["tabs"],
"background": { "page": "bg/background.html" }, "background": {"page": "bg/background.html"},
}, },
files: { files: {
@ -45,48 +45,48 @@ add_task(function* () {
let tests = [ let tests = [
{ {
create: { url: "http://example.com/" }, create: {url: "http://example.com/"},
result: { url: "http://example.com/" }, result: {url: "http://example.com/"},
}, },
{ {
create: { url: "blank.html" }, create: {url: "blank.html"},
result: { url: browser.runtime.getURL("bg/blank.html") }, result: {url: browser.runtime.getURL("bg/blank.html")},
}, },
{ {
create: {}, create: {},
result: { url: "about:newtab" }, result: {url: "about:newtab"},
}, },
{ {
create: { active: false }, create: {active: false},
result: { active: false }, result: {active: false},
}, },
{ {
create: { active: true }, create: {active: true},
result: { active: true }, result: {active: true},
}, },
{ {
create: { pinned: true }, create: {pinned: true},
result: { pinned: true, index: 0 }, result: {pinned: true, index: 0},
}, },
{ {
create: { pinned: true, active: true }, create: {pinned: true, active: true},
result: { pinned: true, active: true, index: 0 }, result: {pinned: true, active: true, index: 0},
}, },
{ {
create: { pinned: true, active: false }, create: {pinned: true, active: false},
result: { pinned: true, active: false, index: 0 }, result: {pinned: true, active: false, index: 0},
}, },
{ {
create: { index: 1 }, create: {index: 1},
result: { index: 1 }, result: {index: 1},
}, },
{ {
create: { index: 1, active: false }, create: {index: 1, active: false},
result: { index: 1, active: false }, result: {index: 1, active: false},
}, },
{ {
create: { windowId: activeWindow }, create: {windowId: activeWindow},
result: { windowId: activeWindow }, result: {windowId: activeWindow},
}, },
]; ];
@ -141,7 +141,7 @@ add_task(function* () {
return browser.tabs.remove(tabId); return browser.tabs.remove(tabId);
}).then(() => { }).then(() => {
return browser.tabs.update(activeTab, { active: true }); return browser.tabs.update(activeTab, {active: true});
}).then(() => { }).then(() => {
nextTest(); nextTest();
}); });
@ -150,7 +150,7 @@ add_task(function* () {
nextTest(); nextTest();
} }
browser.tabs.query({ active: true, currentWindow: true }, tabs => { browser.tabs.query({active: true, currentWindow: true}, tabs => {
activeTab = tabs[0].id; activeTab = tabs[0].id;
activeWindow = tabs[0].windowId; activeWindow = tabs[0].windowId;

View File

@ -14,7 +14,7 @@ function* testHasNoPermission(params) {
browser.test.onMessage.addListener(msg => { browser.test.onMessage.addListener(msg => {
browser.test.assertEq(msg, "execute-script"); browser.test.assertEq(msg, "execute-script");
browser.tabs.query({ currentWindow: true }, tabs => { browser.tabs.query({currentWindow: true}, tabs => {
browser.tabs.executeScript({ browser.tabs.executeScript({
file: "script.js", file: "script.js",
}); });
@ -70,12 +70,12 @@ add_task(function* testBadPermissions() {
info("Test no special permissions"); info("Test no special permissions");
yield testHasNoPermission({ yield testHasNoPermission({
manifest: { "permissions": ["http://example.com/"] }, manifest: {"permissions": ["http://example.com/"]},
}); });
info("Test tabs permissions"); info("Test tabs permissions");
yield testHasNoPermission({ yield testHasNoPermission({
manifest: { "permissions": ["http://example.com/", "tabs"] }, manifest: {"permissions": ["http://example.com/", "tabs"]},
}); });
info("Test active tab, browser action, no click"); info("Test active tab, browser action, no click");
@ -94,7 +94,7 @@ add_task(function* testBadPermissions() {
}, },
contentSetup() { contentSetup() {
return new Promise(resolve => { return new Promise(resolve => {
browser.tabs.query({ active: true, currentWindow: true }, tabs => { browser.tabs.query({active: true, currentWindow: true}, tabs => {
browser.pageAction.show(tabs[0].id); browser.pageAction.show(tabs[0].id);
resolve(); resolve();
}); });
@ -108,7 +108,7 @@ add_task(function* testBadPermissions() {
add_task(function* testBadURL() { add_task(function* testBadURL() {
function background() { function background() {
browser.tabs.query({ currentWindow: true }, tabs => { browser.tabs.query({currentWindow: true}, tabs => {
let promises = [ let promises = [
new Promise(resolve => { new Promise(resolve => {
browser.tabs.executeScript({ browser.tabs.executeScript({

View File

@ -61,17 +61,17 @@ add_task(function* testGoodPermissions() {
info("Test explicit host permission"); info("Test explicit host permission");
yield testHasPermission({ yield testHasPermission({
manifest: { "permissions": ["http://mochi.test/"] }, manifest: {"permissions": ["http://mochi.test/"]},
}); });
info("Test explicit host subdomain permission"); info("Test explicit host subdomain permission");
yield testHasPermission({ yield testHasPermission({
manifest: { "permissions": ["http://*.mochi.test/"] }, manifest: {"permissions": ["http://*.mochi.test/"]},
}); });
info("Test explicit <all_urls> permission"); info("Test explicit <all_urls> permission");
yield testHasPermission({ yield testHasPermission({
manifest: { "permissions": ["<all_urls>"] }, manifest: {"permissions": ["<all_urls>"]},
}); });
info("Test activeTab permission with a browser action click"); info("Test activeTab permission with a browser action click");
@ -98,7 +98,7 @@ add_task(function* testGoodPermissions() {
}, },
contentSetup() { contentSetup() {
return new Promise(resolve => { return new Promise(resolve => {
browser.tabs.query({ active: true, currentWindow: true }, tabs => { browser.tabs.query({active: true, currentWindow: true}, tabs => {
browser.pageAction.show(tabs[0].id); browser.pageAction.show(tabs[0].id);
resolve(); resolve();
}); });
@ -112,7 +112,7 @@ add_task(function* testGoodPermissions() {
yield testHasPermission({ yield testHasPermission({
manifest: { manifest: {
"permissions": ["activeTab"], "permissions": ["activeTab"],
"browser_action": { "default_popup": "_blank.html" }, "browser_action": {"default_popup": "_blank.html"},
}, },
setup: clickBrowserAction, setup: clickBrowserAction,
tearDown: closeBrowserAction, tearDown: closeBrowserAction,
@ -122,11 +122,11 @@ add_task(function* testGoodPermissions() {
yield testHasPermission({ yield testHasPermission({
manifest: { manifest: {
"permissions": ["activeTab"], "permissions": ["activeTab"],
"page_action": { "default_popup": "_blank.html" }, "page_action": {"default_popup": "_blank.html"},
}, },
contentSetup() { contentSetup() {
return new Promise(resolve => { return new Promise(resolve => {
browser.tabs.query({ active: true, currentWindow: true }, tabs => { browser.tabs.query({active: true, currentWindow: true}, tabs => {
browser.pageAction.show(tabs[0].id); browser.pageAction.show(tabs[0].id);
resolve(); resolve();
}); });
@ -142,7 +142,7 @@ add_task(function* testGoodPermissions() {
"permissions": ["activeTab", "contextMenus"], "permissions": ["activeTab", "contextMenus"],
}, },
contentSetup() { contentSetup() {
browser.contextMenus.create({ title: "activeTab", contexts: ["all"] }); browser.contextMenus.create({title: "activeTab", contexts: ["all"]});
return Promise.resolve(); return Promise.resolve();
}, },
setup: function* (extension) { setup: function* (extension) {
@ -150,7 +150,7 @@ add_task(function* testGoodPermissions() {
let awaitPopupShown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown"); let awaitPopupShown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
let awaitPopupHidden = BrowserTestUtils.waitForEvent(contextMenu, "popuphidden"); let awaitPopupHidden = BrowserTestUtils.waitForEvent(contextMenu, "popuphidden");
yield BrowserTestUtils.synthesizeMouseAtCenter("a[href]", { type: "contextmenu", button: 2 }, yield BrowserTestUtils.synthesizeMouseAtCenter("a[href]", {type: "contextmenu", button: 2},
gBrowser.selectedBrowser); gBrowser.selectedBrowser);
yield awaitPopupShown; yield awaitPopupShown;

View File

@ -7,7 +7,7 @@ add_task(function* () {
manifest: { manifest: {
"permissions": ["tabs"], "permissions": ["tabs"],
"browser_action": { "default_popup": "popup.html" }, "browser_action": {"default_popup": "popup.html"},
}, },
files: { files: {
@ -18,7 +18,7 @@ add_task(function* () {
browser.test.assertEq(currentTab.url, url, "getCurrent in non-active background tab"); browser.test.assertEq(currentTab.url, url, "getCurrent in non-active background tab");
// Activate the tab. // Activate the tab.
browser.tabs.onActivated.addListener(function listener({ tabId }) { browser.tabs.onActivated.addListener(function listener({tabId}) {
if (tabId == currentTab.id) { if (tabId == currentTab.id) {
browser.tabs.onActivated.removeListener(listener); browser.tabs.onActivated.removeListener(listener);
@ -31,7 +31,7 @@ add_task(function* () {
}); });
} }
}); });
browser.tabs.update(currentTab.id, { active: true }); browser.tabs.update(currentTab.id, {active: true});
}); });
}, },
@ -52,7 +52,7 @@ add_task(function* () {
browser.test.sendMessage("background-finished"); browser.test.sendMessage("background-finished");
}); });
browser.tabs.create({ url: "tab.html", active: false }); browser.tabs.create({url: "tab.html", active: false});
}, },
}); });

View File

@ -62,7 +62,7 @@ add_task(function* testExecuteScript() {
return; return;
} }
let { promise, background, foreground } = promises.shift(); let {promise, background, foreground} = promises.shift();
new Promise(promise).then(() => { new Promise(promise).then(() => {
browser.tabs.executeScript({ browser.tabs.executeScript({
code: `(${checkCSS})()`, code: `(${checkCSS})()`,

View File

@ -20,7 +20,7 @@ add_task(function* () {
let tab = tabs[0]; let tab = tabs[0];
browser.tabs.move(tab.id, {index: 0}); browser.tabs.move(tab.id, {index: 0});
browser.tabs.query( browser.tabs.query(
{ lastFocusedWindow: true }, {lastFocusedWindow: true},
tabs => { tabs => {
browser.test.assertEq(tabs[0].url, tab.url, "should be first tab"); browser.test.assertEq(tabs[0].url, tab.url, "should be first tab");
browser.test.notifyPass("tabs.move.single"); browser.test.notifyPass("tabs.move.single");
@ -40,12 +40,12 @@ add_task(function* () {
background: function() { background: function() {
browser.tabs.query( browser.tabs.query(
{ lastFocusedWindow: true }, {lastFocusedWindow: true},
tabs => { tabs => {
tabs.sort(function(a, b) { return a.url > b.url; }); tabs.sort(function(a, b) { return a.url > b.url; });
browser.tabs.move(tabs.map(tab => tab.id), {index: 0}); browser.tabs.move(tabs.map(tab => tab.id), {index: 0});
browser.tabs.query( browser.tabs.query(
{ lastFocusedWindow: true }, {lastFocusedWindow: true},
tabs => { tabs => {
browser.test.assertEq(tabs[0].url, "about:blank", "should be first tab"); browser.test.assertEq(tabs[0].url, "about:blank", "should be first tab");
browser.test.assertEq(tabs[1].url, "about:config", "should be second tab"); browser.test.assertEq(tabs[1].url, "about:config", "should be second tab");
@ -67,13 +67,13 @@ add_task(function* () {
background: function() { background: function() {
browser.tabs.query( browser.tabs.query(
{ lastFocusedWindow: true }, {lastFocusedWindow: true},
tabs => { tabs => {
let tab = tabs[0]; let tab = tabs[0];
// Assuming that tab.id of 12345 does not exist. // Assuming that tab.id of 12345 does not exist.
browser.tabs.move([12345, tab.id], {index: 0}); browser.tabs.move([12345, tab.id], {index: 0});
browser.tabs.query( browser.tabs.query(
{ lastFocusedWindow: true }, {lastFocusedWindow: true},
tabs => { tabs => {
browser.test.assertEq(tabs[0].url, tab.url, "should be first tab"); browser.test.assertEq(tabs[0].url, tab.url, "should be first tab");
browser.test.notifyPass("tabs.move.invalid"); browser.test.notifyPass("tabs.move.invalid");
@ -93,12 +93,12 @@ add_task(function* () {
background: function() { background: function() {
browser.tabs.query( browser.tabs.query(
{ lastFocusedWindow: true }, {lastFocusedWindow: true},
tabs => { tabs => {
let tab = tabs[0]; let tab = tabs[0];
browser.tabs.move(tab.id, {index: -1}); browser.tabs.move(tab.id, {index: -1});
browser.tabs.query( browser.tabs.query(
{ lastFocusedWindow: true }, {lastFocusedWindow: true},
tabs => { tabs => {
browser.test.assertEq(tabs[2].url, tab.url, "should be last tab"); browser.test.assertEq(tabs[2].url, tab.url, "should be last tab");
browser.test.notifyPass("tabs.move.last"); browser.test.notifyPass("tabs.move.last");

View File

@ -21,7 +21,7 @@ add_task(function* () {
browser.tabs.move(source.id, {windowId: destination.windowId, index: 0}); browser.tabs.move(source.id, {windowId: destination.windowId, index: 0});
browser.tabs.query( browser.tabs.query(
{ url: "<all_urls>" }, {url: "<all_urls>"},
tabs => { tabs => {
browser.test.assertEq(tabs[0].url, "http://example.com/"); browser.test.assertEq(tabs[0].url, "http://example.com/");
browser.test.assertEq(tabs[0].windowId, destination.windowId); browser.test.assertEq(tabs[0].windowId, destination.windowId);
@ -54,14 +54,14 @@ add_task(function* () {
background: function() { background: function() {
browser.tabs.query( browser.tabs.query(
{ url: "<all_urls>" }, {url: "<all_urls>"},
tabs => { tabs => {
let destination = tabs[0]; let destination = tabs[0];
let source = tabs[1]; // remember, pinning moves it to the left. let source = tabs[1]; // remember, pinning moves it to the left.
browser.tabs.move(source.id, {windowId: destination.windowId, index: 0}); browser.tabs.move(source.id, {windowId: destination.windowId, index: 0});
browser.tabs.query( browser.tabs.query(
{ url: "<all_urls>" }, {url: "<all_urls>"},
tabs => { tabs => {
browser.test.assertEq(true, tabs[0].pinned); browser.test.assertEq(true, tabs[0].pinned);
browser.test.notifyPass("tabs.move.pin"); browser.test.notifyPass("tabs.move.pin");
@ -94,13 +94,13 @@ add_task(function* () {
background: function() { background: function() {
browser.tabs.query( browser.tabs.query(
{ url: "<all_urls>" }, {url: "<all_urls>"},
tabs => { tabs => {
let move1 = tabs[1]; let move1 = tabs[1];
let move3 = tabs[3]; let move3 = tabs[3];
browser.tabs.move([move1.id, move3.id], {index: 0}); browser.tabs.move([move1.id, move3.id], {index: 0});
browser.tabs.query( browser.tabs.query(
{ url: "<all_urls>" }, {url: "<all_urls>"},
tabs => { tabs => {
browser.test.assertEq(tabs[0].url, move1.url); browser.test.assertEq(tabs[0].url, move1.url);
browser.test.assertEq(tabs[2].url, move3.url); browser.test.assertEq(tabs[2].url, move3.url);

View File

@ -23,9 +23,9 @@ add_task(function* () {
let pageURL = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context_tabs_onUpdated_page.html"; let pageURL = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context_tabs_onUpdated_page.html";
let expectedSequence = [ let expectedSequence = [
{ status: "loading" }, {status: "loading"},
{ status: "loading", url: pageURL }, {status: "loading", url: pageURL},
{ status: "complete" }, {status: "complete"},
]; ];
let collectedSequence = []; let collectedSequence = [];
@ -60,7 +60,7 @@ add_task(function* () {
browser.test.notifyPass("tabs.onUpdated"); browser.test.notifyPass("tabs.onUpdated");
}); });
browser.tabs.create({ url: pageURL }); browser.tabs.create({url: pageURL});
}, },
files: { files: {
"content-script.js": ` "content-script.js": `

View File

@ -9,7 +9,7 @@ add_task(function* tabsSendMessageNoExceptionOnNonExistentTab() {
}, },
background: function() { background: function() {
browser.tabs.create({ url: "about:robots"}, tab => { browser.tabs.create({url: "about:robots"}, tab => {
let exception; let exception;
try { try {
browser.tabs.sendMessage(tab.id, "message"); browser.tabs.sendMessage(tab.id, "message");

View File

@ -8,7 +8,7 @@ add_task(function* testWebNavigationGetNonExistentTab() {
let results = [ let results = [
// There is no "tabId = 0" because the id assigned by TabManager (defined in ext-utils.js) // There is no "tabId = 0" because the id assigned by TabManager (defined in ext-utils.js)
// starts from 1. // starts from 1.
browser.webNavigation.getAllFrames({ tabId: 0 }).then(() => { browser.webNavigation.getAllFrames({tabId: 0}).then(() => {
browser.test.fail("getAllFrames Promise should be rejected on error"); browser.test.fail("getAllFrames Promise should be rejected on error");
}, (error) => { }, (error) => {
browser.test.assertEq("No tab found with tabId: 0", error.message, browser.test.assertEq("No tab found with tabId: 0", error.message,
@ -16,7 +16,7 @@ add_task(function* testWebNavigationGetNonExistentTab() {
}), }),
// There is no "tabId = 0" because the id assigned by TabManager (defined in ext-utils.js) // There is no "tabId = 0" because the id assigned by TabManager (defined in ext-utils.js)
// starts from 1, processId is currently marked as optional and it is ignored. // starts from 1, processId is currently marked as optional and it is ignored.
browser.webNavigation.getFrame({ tabId: 0, frameId: 15, processId: 20 }).then(() => { browser.webNavigation.getFrame({tabId: 0, frameId: 15, processId: 20}).then(() => {
browser.test.fail("getFrame Promise should be rejected on error"); browser.test.fail("getFrame Promise should be rejected on error");
}, (error) => { }, (error) => {
browser.test.assertEq("No tab found with tabId: 0", error.message, browser.test.assertEq("No tab found with tabId: 0", error.message,
@ -57,11 +57,11 @@ add_task(function* testWebNavigationFrames() {
return; return;
} }
browser.webNavigation.getAllFrames({ tabId }).then((getAllFramesDetails) => { browser.webNavigation.getAllFrames({tabId}).then((getAllFramesDetails) => {
let getFramePromises = getAllFramesDetails.map((frameDetail) => { let getFramePromises = getAllFramesDetails.map((frameDetail) => {
let { frameId } = frameDetail; let {frameId} = frameDetail;
// processId is currently marked as optional and it is ignored. // processId is currently marked as optional and it is ignored.
return browser.webNavigation.getFrame({ tabId, frameId, processId: 0 }); return browser.webNavigation.getFrame({tabId, frameId, processId: 0});
}); });
Promise.all(getFramePromises).then((getFrameResults) => { Promise.all(getFramePromises).then((getFrameResults) => {
@ -81,7 +81,7 @@ add_task(function* testWebNavigationFrames() {
} }
// Check that getFrame Promise is rejected with the expected error message on nonexistent frameId. // Check that getFrame Promise is rejected with the expected error message on nonexistent frameId.
browser.webNavigation.getFrame({ tabId, frameId: nonExistentFrameId, processId: 20 }).then(() => { browser.webNavigation.getFrame({tabId, frameId: nonExistentFrameId, processId: 20}).then(() => {
browser.test.fail("getFrame promise should be rejected for an unexistent frameId"); browser.test.fail("getFrame promise should be rejected for an unexistent frameId");
}, (error) => { }, (error) => {
browser.test.assertEq(`No frame found with frameId: ${nonExistentFrameId}`, error.message, browser.test.assertEq(`No frame found with frameId: ${nonExistentFrameId}`, error.message,
@ -93,7 +93,7 @@ add_task(function* testWebNavigationFrames() {
}); });
}); });
browser.tabs.create({ url: "tab.html" }, (tab) => { browser.tabs.create({url: "tab.html"}, (tab) => {
tabId = tab.id; tabId = tab.id;
}); });
} + ")();", } + ")();",

View File

@ -21,6 +21,8 @@ support-files =
[browser_bing.js] [browser_bing.js]
[browser_bing_behavior.js] [browser_bing_behavior.js]
[browser_contextmenu.js] [browser_contextmenu.js]
[browser_contextSearchTabPosition.js]
skip-if = os == "mac" # bug 967013
[browser_eBay.js] [browser_eBay.js]
[browser_eBay_behavior.js] [browser_eBay_behavior.js]
[browser_google.js] [browser_google.js]

View File

@ -3,12 +3,10 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
add_task(function* test() { add_task(function* test() {
let engine = yield promiseNewEngine("testEngine.xml");
// Will need to be changed if Google isn't the default search engine. let histogramKey = "other-" + engine.name + ".contextmenu";
// Note: geoSpecificDefaults are disabled for mochitests, so this is the
// non-US en-US default.
let histogramKey = "google.contextmenu";
let numSearchesBefore = 0; let numSearchesBefore = 0;
try { try {
let hs = Services.telemetry.getKeyedHistogramById("SEARCH_COUNTS").snapshot(); let hs = Services.telemetry.getKeyedHistogramById("SEARCH_COUNTS").snapshot();
if (histogramKey in hs) { if (histogramKey in hs) {
@ -19,7 +17,7 @@ add_task(function* test() {
} }
let tabs = []; let tabs = [];
let tabsLoadedDeferred = Promise.defer(); let tabsLoadedDeferred = new Deferred();
function tabAdded(event) { function tabAdded(event) {
let tab = event.target; let tab = event.target;
@ -54,3 +52,10 @@ add_task(function* test() {
Assert.equal(hs[histogramKey].sum, numSearchesBefore + 2, Assert.equal(hs[histogramKey].sum, numSearchesBefore + 2,
"The histogram must contain the correct search count"); "The histogram must contain the correct search count");
}); });
function Deferred() {
this.promise = new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
}

View File

@ -21,6 +21,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "console",
"resource://gre/modules/Console.jsm"); "resource://gre/modules/Console.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "PrivacyFilter", XPCOMUtils.defineLazyModuleGetter(this, "PrivacyFilter",
"resource:///modules/sessionstore/PrivacyFilter.jsm"); "resource:///modules/sessionstore/PrivacyFilter.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "RunState",
"resource:///modules/sessionstore/RunState.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "SessionStore", XPCOMUtils.defineLazyModuleGetter(this, "SessionStore",
"resource:///modules/sessionstore/SessionStore.jsm"); "resource:///modules/sessionstore/SessionStore.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "SessionFile", XPCOMUtils.defineLazyModuleGetter(this, "SessionFile",
@ -209,6 +211,19 @@ var SessionSaverInternal = {
} }
} }
// If this is the final write on a clean shutdown, and the user changed
// their cookie preferences to "Keep until I close Firefox", then we
// should remove all cookies. Check "resume_session_once" so we keep
// cookies when restarting due to a Firefox update.
if (RunState.isClosing &&
Services.prefs.getIntPref("network.cookie.lifetimePolicy") ==
Services.cookies.ACCEPT_SESSION &&
!Services.prefs.getBoolPref("browser.sessionstore.resume_session_once")) {
for (let window of state.windows) {
delete window.cookies;
}
}
stopWatchFinish("COLLECT_DATA_MS", "COLLECT_DATA_LONGEST_OP_MS"); stopWatchFinish("COLLECT_DATA_MS", "COLLECT_DATA_LONGEST_OP_MS");
return this._writeState(state); return this._writeState(state);
}, },

View File

@ -1236,9 +1236,7 @@ var SessionStoreInternal = {
var tabbrowser = aWindow.gBrowser; var tabbrowser = aWindow.gBrowser;
// The tabbrowser binding will go away once the window is closed, let browsers = Array.from(tabbrowser.browsers);
// so we'll hold a reference to the browsers in the closure here.
let browsers = tabbrowser.browsers;
TAB_EVENTS.forEach(function(aEvent) { TAB_EVENTS.forEach(function(aEvent) {
tabbrowser.tabContainer.removeEventListener(aEvent, this, true); tabbrowser.tabContainer.removeEventListener(aEvent, this, true);
@ -1320,7 +1318,6 @@ var SessionStoreInternal = {
// access any DOM elements from aWindow within this callback unless // access any DOM elements from aWindow within this callback unless
// you're holding on to them in the closure. // you're holding on to them in the closure.
// We can still access tabbrowser.browsers, thankfully.
for (let browser of browsers) { for (let browser of browsers) {
if (this._closedWindowTabs.has(browser.permanentKey)) { if (this._closedWindowTabs.has(browser.permanentKey)) {
let tabData = this._closedWindowTabs.get(browser.permanentKey); let tabData = this._closedWindowTabs.get(browser.permanentKey);

View File

@ -1,4 +1,3 @@
[DEFAULT] [DEFAULT]
[browser_bug538331.js] [browser_bug538331.js]
skip-if = e10s # Bug ?????? - child process crash, but only when run as part of the suite (ie, probably not actually this tests fault!?)

View File

@ -361,11 +361,8 @@ function testShowNotification()
if (i == (BG_NOTIFY_TESTS.length - 1)) { if (i == (BG_NOTIFY_TESTS.length - 1)) {
// Wait for any windows caught by the windowcatcher to close // Wait for any windows caught by the windowcatcher to close
gWindowCatcher.finish(function () { gWindowCatcher.finish(function () {
BrowserTestUtils.waitForNewTab(gBrowser).then(testNotificationURL);
button.click(); button.click();
gBrowser.selectedBrowser.addEventListener("load", function () {
gBrowser.selectedBrowser.removeEventListener("load", arguments.callee, true);
testNotificationURL();
}, true);
}); });
} else { } else {
notifyBox.removeAllNotifications(true); notifyBox.removeAllNotifications(true);
@ -389,7 +386,7 @@ function testNotificationURL()
{ {
ok(true, "Test testNotificationURL: clicking the notification button " + ok(true, "Test testNotificationURL: clicking the notification button " +
"opened the url specified by the update"); "opened the url specified by the update");
let href = gBrowser.selectedBrowser.contentWindow.location.href; let href = gBrowser.currentURI.spec;
let expectedURL = BG_NOTIFY_TESTS[BG_NOTIFY_TESTS.length - 1].notificationURL; let expectedURL = BG_NOTIFY_TESTS[BG_NOTIFY_TESTS.length - 1].notificationURL;
is(href, expectedURL, "The url opened from the notification should be the " + is(href, expectedURL, "The url opened from the notification should be the " +
"url provided by the update"); "url provided by the update");

View File

@ -9,7 +9,9 @@ allprojects {
} }
repositories { repositories {
jcenter() maven {
url gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORY
}
} }
} }
@ -17,8 +19,9 @@ buildDir "${topobjdir}/gradle/build"
buildscript { buildscript {
repositories { repositories {
jcenter() maven {
url gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORY
}
} }
dependencies { dependencies {

View File

@ -5252,12 +5252,56 @@ if test -n "$MOZ_OMX_PLUGIN"; then
fi fi
dnl ======================================================== dnl ========================================================
dnl = Enable building mobile/android with Gradle dnl Gradle support
dnl
dnl If --with-gradle is specified, build mobile/android with Gradle.
dnl
dnl If no Gradle binary is specified, use the in tree Gradle wrapper.
dnl The wrapper downloads and installs Gradle, which is good for local
dnl developers but not good in automation.
dnl ======================================================== dnl ========================================================
MOZ_ARG_ENABLE_BOOL(gradle-mobile-android-builds,
[ --enable-gradle-mobile-android-builds Enable building mobile/android with Gradle], GRADLE=
MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE=1, MOZ_ARG_WITH_STRING(gradle,
MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE=) [ --with-gradle=/path/to/bin/gradle
Enable building mobile/android with Gradle (argument: location of binary or wrapper (gradle/gradlew))],
if test "$withval" = "no" ; then
dnl --without-gradle => use the wrapper in |mach gradle|, don't build
dnl with Gradle by default.
GRADLE=$srcdir/gradlew
MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE=
elif test "$withval" = "yes" ; then
dnl --with-gradle => use the wrapper in |mach gradle|, build with
dnl Gradle by default.
GRADLE=$srcdir/gradlew
MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE=1
else
dnl --with-gradle=/path/to/gradle => use the given binary in |mach
dnl gradle|, build with Gradle by default.
GRADLE=$withval
MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE=1
fi
,
dnl No --with{out}-gradle => use the wrapper in |mach gradle|, don't build
dnl with Gradle by default.
GRADLE=$srcdir/gradlew
MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE=
)
if test "$OS_TARGET" = Android -a x"$MOZ_WIDGET_TOOLKIT" != x"gonk" ; then
if test -z "$GRADLE" -o ! -x "$GRADLE" ; then
AC_MSG_ERROR([The program gradlew/gradle was not found. Use --with-gradle=/path/to/bin/gradle}])
fi
fi
AC_SUBST(GRADLE)
dnl Path to Maven repository containing Gradle dependencies. Automation will
dnl set this to file:///path/to/local via the mozconfig. Local developer
dnl default is jcenter.
if test -z "$GRADLE_MAVEN_REPOSITORY" ; then
GRADLE_MAVEN_REPOSITORY=https://jcenter.bintray.com/
fi
AC_SUBST(GRADLE_MAVEN_REPOSITORY)
if test -n "$MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE"; then if test -n "$MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE"; then
if test "$OS_TARGET" = "Android" -a x"$MOZ_WIDGET_TOOLKIT" != x"gonk"; then if test "$OS_TARGET" = "Android" -a x"$MOZ_WIDGET_TOOLKIT" != x"gonk"; then

74
devtools/bootstrap.js vendored
View File

@ -79,11 +79,77 @@ function reload(event) {
// Ask the loader to update itself and reopen the toolbox if needed // Ask the loader to update itself and reopen the toolbox if needed
const {devtools} = Cu.import("resource://devtools/shared/Loader.jsm", {}); const {devtools} = Cu.import("resource://devtools/shared/Loader.jsm", {});
devtools.reload(reloadToolbox); devtools.reload();
// Also tells gDevTools to reload its dependencies // Go over all top level windows to reload all devtools related things
const {gDevTools} = devtools.require("devtools/client/framework/devtools"); let windowsEnum = Services.wm.getEnumerator(null);
gDevTools.reload(); while (windowsEnum.hasMoreElements()) {
let window = windowsEnum.getNext();
let windowtype = window.document.documentElement.getAttribute("windowtype");
if (windowtype == "navigator:browser" && window.gBrowser) {
// Enumerate tabs on firefox windows
for (let tab of window.gBrowser.tabs) {
let browser = tab.linkedBrowser;
let location = browser.documentURI.spec;
let mm = browser.messageManager;
// To reload JSON-View tabs and any devtools document
if (location.startsWith("about:debugging") ||
location.startsWith("chrome://devtools/")) {
browser.reload();
}
// We have to use a frame script to query "baseURI"
mm.loadFrameScript("data:text/javascript,new " + function () {
let isJSONView = content.document.baseURI.startsWith("resource://devtools/");
if (isJSONView) {
content.location.reload();
}
}, false);
}
// Manually reload gcli if it has been used
// Bug 1248348: Inject the developer toolbar dynamically within browser/
// so that we can easily remove/reinject it
const desc = Object.getOwnPropertyDescriptor(window, "DeveloperToolbar");
if (desc && !desc.get) {
let wasVisible = window.DeveloperToolbar.visible;
window.DeveloperToolbar.hide()
.then(() => {
window.DeveloperToolbar.destroy();
let { DeveloperToolbar } = devtools.require("devtools/client/shared/developer-toolbar");
window.DeveloperToolbar = new DeveloperToolbar(window, window.document.getElementById("developer-toolbar"));
if (wasVisible) {
window.DeveloperToolbar.show();
}
});
}
} else if (windowtype === "devtools:webide") {
window.location.reload();
} else if (windowtype === "devtools:webconsole") {
// Browser console document can't just be reloaded.
// HUDService is going to close it on unload.
// Instead we have to manually toggle it.
let HUDService = devtools.require("devtools/client/webconsole/hudservice");
HUDService.toggleBrowserConsole()
.then(() => {
HUDService.toggleBrowserConsole();
});
}
}
if (reloadToolbox) {
// Reopen the toolbox automatically if we are reloading from toolbox shortcut
// and are on a browser window.
// Wait for a second before opening the toolbox to avoid races
// between the old and the new one.
let {setTimeout} = Cu.import("resource://gre/modules/Timer.jsm", {});
setTimeout(() => {
let { TargetFactory } = devtools.require("devtools/client/framework/target");
let { gDevTools } = devtools.require("devtools/client/framework/devtools");
let target = TargetFactory.forTab(top.gBrowser.selectedTab);
gDevTools.showToolbox(target);
}, 1000);
}
} }
let listener; let listener;

View File

@ -10,7 +10,6 @@
<head> <head>
<title>&animationInspectorTitle;</title> <title>&animationInspectorTitle;</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" href="chrome://devtools/skin/common.css" type="text/css"/>
<link rel="stylesheet" href="chrome://devtools/skin/animationinspector.css" type="text/css"/> <link rel="stylesheet" href="chrome://devtools/skin/animationinspector.css" type="text/css"/>
<script type="application/javascript;version=1.8" src="chrome://devtools/content/shared/theme-switching.js"/> <script type="application/javascript;version=1.8" src="chrome://devtools/content/shared/theme-switching.js"/>
</head> </head>

View File

@ -65,8 +65,10 @@ add_task(function*() {
info("Select a finite animation, reload the page and wait for the " + info("Select a finite animation, reload the page and wait for the " +
"animation to complete"); "animation to complete");
yield selectNode(".negative-delay", inspector); yield selectNode(".negative-delay", inspector);
let onScrubberStopped = waitForScrubberStopped(timeline);
yield reloadTab(inspector); yield reloadTab(inspector);
yield waitForScrubberStopped(timeline); yield onScrubberStopped;
ok(btn.classList.contains("paused"), ok(btn.classList.contains("paused"),
"The button is in paused state once finite animations are done"); "The button is in paused state once finite animations are done");

View File

@ -4,7 +4,6 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/content/shared/widgets/widgets.css" type="text/css"?> <?xml-stylesheet href="chrome://devtools/content/shared/widgets/widgets.css" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/skin/common.css" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/skin/widgets.css" type="text/css"?> <?xml-stylesheet href="chrome://devtools/skin/widgets.css" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/skin/canvasdebugger.css" type="text/css"?> <?xml-stylesheet href="chrome://devtools/skin/canvasdebugger.css" type="text/css"?>
<!DOCTYPE window [ <!DOCTYPE window [

View File

@ -5,7 +5,6 @@
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/content/shared/widgets/widgets.css" type="text/css"?> <?xml-stylesheet href="chrome://devtools/content/shared/widgets/widgets.css" type="text/css"?>
<?xml-stylesheet href="debugger.css" type="text/css"?> <?xml-stylesheet href="debugger.css" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/skin/common.css" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/skin/widgets.css" type="text/css"?> <?xml-stylesheet href="chrome://devtools/skin/widgets.css" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/skin/debugger.css" type="text/css"?> <?xml-stylesheet href="chrome://devtools/skin/debugger.css" type="text/css"?>
<!DOCTYPE window [ <!DOCTYPE window [

View File

@ -6,7 +6,6 @@
<!DOCTYPE window []> <!DOCTYPE window []>
<?xml-stylesheet href="chrome://devtools/skin/common.css"?>
<?xml-stylesheet href="chrome://devtools/skin/eyedropper.css" type="text/css"?> <?xml-stylesheet href="chrome://devtools/skin/eyedropper.css" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"

View File

@ -3,6 +3,7 @@
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict"; "use strict";
const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
@ -198,6 +199,8 @@ BrowserToolboxProcess.prototype = {
if (this._options.addonID) { if (this._options.addonID) {
xulURI += "?addonID=" + this._options.addonID; xulURI += "?addonID=" + this._options.addonID;
} else if (this._options.testScript) {
xulURI += "?testScript=" + encodeURIComponent(this._options.testScript);
} }
dumpn("Running chrome debugging process."); dumpn("Running chrome debugging process.");

View File

@ -1,3 +1,9 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* 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/. */
const {Cc, Ci, Cu} = require("chrome"); const {Cc, Ci, Cu} = require("chrome");
const Services = Cu.import("resource://gre/modules/Services.jsm", {}).Services; const Services = Cu.import("resource://gre/modules/Services.jsm", {}).Services;
const promise = require("promise"); const promise = require("promise");

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

View File

@ -17,6 +17,7 @@ support-files =
browser_toolbox_options_enable_serviceworkers_testing.html browser_toolbox_options_enable_serviceworkers_testing.html
serviceworker.js serviceworker.js
[browser_browser_toolbox.js]
[browser_devtools_api.js] [browser_devtools_api.js]
[browser_devtools_api_destroy.js] [browser_devtools_api_destroy.js]
[browser_dynamic_tool_enabling.js] [browser_dynamic_tool_enabling.js]

View File

@ -0,0 +1,63 @@
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
// On debug test slave, it takes about 50s to run the test.
requestLongerTimeout(4);
add_task(function* runTest() {
yield new Promise(done => {
let options = {"set": [
["devtools.debugger.prompt-connection", false],
["devtools.debugger.remote-enabled", true],
["devtools.chrome.enabled", true],
// Test-only pref to allow passing `testScript` argument to the browser
// toolbox
["devtools.browser-toolbox.allow-unsafe-script", true],
// On debug test slave, it takes more than the default time (20s)
// to get a initialized console
["devtools.debugger.remote-timeout", 120000]
]};
SpecialPowers.pushPrefEnv(options, done);
});
// Wait for a notification sent by a script evaluated in the webconsole
// of the browser toolbox.
let onCustomMessage = new Promise(done => {
Services.obs.addObserver(function listener() {
Services.obs.removeObserver(listener, "browser-toolbox-console-works");
done();
}, "browser-toolbox-console-works", false);
});
let { BrowserToolboxProcess } = Cu.import("resource://devtools/client/framework/ToolboxProcess.jsm", {});
let closePromise;
yield new Promise(onRun => {
let options = {
// Pass a test script evaluated in the browser toolbox window
// living in a distinct process. It has access to `toolbox` object
// in its global scope.
testScript: "new " + function () {
toolbox.selectTool("webconsole")
.then(() => toolbox.getPanel("webconsole"))
.then(() => {
let { jsterm } = toolbox.getPanel("webconsole").hud;
let js = "Services.obs.notifyObservers(null, 'browser-toolbox-console-works', null);";
return jsterm.execute(js);
})
.then(() => toolbox.destroy());
}
};
closePromise = new Promise(onClose => {
info("Opening the browser toolbox\n");
BrowserToolboxProcess.init(onClose, onRun, options);
});
});
ok(true, "Browser toolbox started\n");
yield onCustomMessage;
ok(true, "Received the custom message");
yield closePromise;
ok(true, "Browser toolbox process just closed");
});

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,5 +1,8 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict"; "use strict";
// Test that network requests originating from the toolbox don't get recorded in // Test that network requests originating from the toolbox don't get recorded in

View File

@ -1,5 +1,7 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
// Tests that the keybindings for opening and closing the inspector work as expected // Tests that the keybindings for opening and closing the inspector work as expected
// Can probably make this a shared test that tests all of the tools global keybindings // Can probably make this a shared test that tests all of the tools global keybindings

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,6 +1,7 @@
/* vim: set ts=2 et sw=2 tw=80: */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
var target; var target;

View File

@ -1,5 +1,7 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
// Ensure target is closed if client is closed directly // Ensure target is closed if client is closed directly
function test() { function test() {

View File

@ -1,5 +1,7 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
// Test support methods on Target, such as `hasActor`, `getActorDescription`, // Test support methods on Target, such as `hasActor`, `getActorDescription`,
// `actorHasMethod` and `getTrait`. // `actorHasMethod` and `getTrait`.

View File

@ -1,6 +1,7 @@
/* vim: set ts=2 et sw=2 tw=80: */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
function test() { function test() {
let {Toolbox} = require("devtools/client/framework/toolbox"); let {Toolbox} = require("devtools/client/framework/toolbox");

View File

@ -1,6 +1,7 @@
/* vim: set ts=2 et sw=2 tw=80: */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
var toolbox; var toolbox;

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,6 +1,7 @@
/* vim: set ts=2 et sw=2 tw=80: */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict"; "use strict";

View File

@ -1,7 +1,5 @@
/* vim: set ts=2 et sw=2 tw=80: */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* Any copyright is dedicated to the Public Domain. /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
http://creativecommons.org/publicdomain/zero/1.0/ */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,6 +1,8 @@
/* vim: set ts=2 et sw=2 tw=80: */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict"; "use strict";
requestLongerTimeout(2); requestLongerTimeout(2);

View File

@ -1,6 +1,8 @@
/* vim: set ts=2 et sw=2 tw=80: */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict"; "use strict";
requestLongerTimeout(2); requestLongerTimeout(2);

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,5 +1,7 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
// A helper frame-script for devtools/client/framework service worker tests. // A helper frame-script for devtools/client/framework service worker tests.

View File

@ -1,6 +1,7 @@
/* vim: set ts=2 et sw=2 tw=80: */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
var {Toolbox} = require("devtools/client/framework/toolbox"); var {Toolbox} = require("devtools/client/framework/toolbox");

View File

@ -1,6 +1,7 @@
/* vim: set ts=2 et sw=2 tw=80: */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
function test() { function test() {
gBrowser.selectedTab = gBrowser.addTab(); gBrowser.selectedTab = gBrowser.addTab();

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,5 +1,8 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict"; "use strict";
// Test that opening the toolbox doesn't throw when the previously selected // Test that opening the toolbox doesn't throw when the previously selected

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
@ -6,7 +8,6 @@ function test() {
let {ToolSidebar} = require("devtools/client/framework/sidebar"); let {ToolSidebar} = require("devtools/client/framework/sidebar");
const toolURL = "data:text/xml;charset=utf8,<?xml version='1.0'?>" + const toolURL = "data:text/xml;charset=utf8,<?xml version='1.0'?>" +
"<?xml-stylesheet href='chrome://devtools/skin/common.css' type='text/css'?>" +
"<window xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'>" + "<window xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'>" +
"<hbox flex='1'><description flex='1'>foo</description><splitter class='devtools-side-splitter'/>" + "<hbox flex='1'><description flex='1'>foo</description><splitter class='devtools-side-splitter'/>" +
"<tabbox flex='1' id='sidebar' class='devtools-sidebar-tabs'><tabs/><tabpanels flex='1'/></tabbox>" + "<tabbox flex='1' id='sidebar' class='devtools-sidebar-tabs'><tabs/><tabpanels flex='1'/></tabbox>" +

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
@ -6,7 +8,6 @@ function test() {
const { ToolSidebar } = require("devtools/client/framework/sidebar"); const { ToolSidebar } = require("devtools/client/framework/sidebar");
const toolURL = "data:text/xml;charset=utf8,<?xml version='1.0'?>" + const toolURL = "data:text/xml;charset=utf8,<?xml version='1.0'?>" +
"<?xml-stylesheet href='chrome://devtools/skin/common.css' type='text/css'?>" +
"<window xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'>" + "<window xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'>" +
"<hbox flex='1'><description flex='1'>foo</description><splitter class='devtools-side-splitter'/>" + "<hbox flex='1'><description flex='1'>foo</description><splitter class='devtools-side-splitter'/>" +
"<tabbox flex='1' id='sidebar' class='devtools-sidebar-tabs'><tabs/><tabpanels flex='1'/></tabbox>" + "<tabbox flex='1' id='sidebar' class='devtools-sidebar-tabs'><tabs/><tabpanels flex='1'/></tabbox>" +

View File

@ -1,5 +1,8 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict"; "use strict";
// Test that the sidebar widget auto-registers existing tabs. // Test that the sidebar widget auto-registers existing tabs.
@ -7,7 +10,6 @@
const {ToolSidebar} = require("devtools/client/framework/sidebar"); const {ToolSidebar} = require("devtools/client/framework/sidebar");
const testToolURL = "data:text/xml;charset=utf8,<?xml version='1.0'?>" + const testToolURL = "data:text/xml;charset=utf8,<?xml version='1.0'?>" +
"<?xml-stylesheet href='chrome://devtools/skin/common.css' type='text/css'?>" +
"<window xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'>" + "<window xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'>" +
"<hbox flex='1'><description flex='1'>test tool</description>" + "<hbox flex='1'><description flex='1'>test tool</description>" +
"<splitter class='devtools-side-splitter'/>" + "<splitter class='devtools-side-splitter'/>" +

View File

@ -1,5 +1,8 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict"; "use strict";
// Test that the sidebar widget correctly displays the "all tabs..." button // Test that the sidebar widget correctly displays the "all tabs..." button

View File

@ -4,7 +4,6 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/content/shared/widgets/widgets.css" type="text/css"?> <?xml-stylesheet href="chrome://devtools/content/shared/widgets/widgets.css" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/skin/common.css" type="text/css"?>
<?xml-stylesheet href="chrome://devtools/skin/widgets.css" type="text/css"?> <?xml-stylesheet href="chrome://devtools/skin/widgets.css" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript;version=1.8" src="chrome://devtools/content/shared/theme-switching.js"/> <script type="application/javascript;version=1.8" src="chrome://devtools/content/shared/theme-switching.js"/>

View File

@ -1,5 +1,5 @@
/* Any copyright is dedicated to the Public Domain. /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
* http://creativecommons.org/publicdomain/zero/1.0/ */ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,3 +1,5 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */

View File

@ -1,6 +1,7 @@
/* vim: set ts=2 et sw=2 tw=80: */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
// Test for dynamically registering and unregistering themes // Test for dynamically registering and unregistering themes
const CHROME_URL = "chrome://mochitests/content/browser/devtools/client/framework/test/"; const CHROME_URL = "chrome://mochitests/content/browser/devtools/client/framework/test/";

View File

@ -1,5 +1,7 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict"; "use strict";

Some files were not shown because too many files have changed in this diff Show More