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/**
# Uses preprocessing
toolkit/content/contentAreaUtils.js
toolkit/content/widgets/videocontrols.xml
toolkit/content/widgets/wizard.xml
toolkit/components/jsdownloads/src/DownloadIntegration.jsm
toolkit/components/search/nsSearchService.js
toolkit/components/url-classifier/**

View File

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

View File

@ -47,18 +47,32 @@ function execute (queries, options) {
return new Promise(resolve => {
let root = historyService
.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;
for (let i = 0; i < node.childCount; i++) {
let child = node.getChild(i);
if (!uriWildcard || child.uri.startsWith(uriWildcard)) {
acc.push(child);
}
if (child.type === child.RESULT_TYPE_FOLDER) {
let container = child.QueryInterface(Ci.nsINavHistoryContainerResultNode);
collect(acc, container);
collect(acc, container, uriWildcard);
}
}
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 { method } = require('../lang/functional');
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"].
getService(Ci.nsINavBookmarksService);
Cu.importGlobalProperties(["URL"]);
/*
* TreeNodes are used to construct dependency trees
* for BookmarkItems
@ -128,9 +130,9 @@ exports.isRootGroup = isRootGroup;
* --> 'http://moz.com', 'http://moz.com/thunderbird'
* '*.moz.com' // domain: moz.com, domainIsHost: false
* --> '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/*' // 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'
*/
@ -139,8 +141,21 @@ function urlQueryParser (query, url) {
if (/^https?:\/\//.test(url)) {
query.uri = url.charAt(url.length - 1) === '/' ? url : url + '/';
if (/\*$/.test(url)) {
query.uri = url.replace(/\*$/, '');
query.uriIsPrefix = true;
// Wildcard searches on URIs are not supported, so try to extract a
// 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 {
if (/^\*/.test(url)) {

View File

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

View File

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

View File

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

View File

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

View File

@ -1863,8 +1863,7 @@
}, 0, this.tabContainer);
}
// invalidate caches
this._browsers = null;
// invalidate cache
this._visibleTabs = null;
this.tabContainer.appendChild(t);
@ -2379,10 +2378,6 @@
var wasPinned = aTab.pinned;
// Invalidate browsers cache, as the tab is removed from the
// tab container.
this._browsers = null;
// Remove the tab ...
this.tabContainer.removeChild(aTab);
@ -2860,15 +2855,32 @@
onget="return this.mCurrentBrowser;"
readonly="true"/>
<property name="browsers" readonly="true">
<getter>
<field name="browsers" readonly="true">
<![CDATA[
return this._browsers ||
(this._browsers = Array.map(this.tabs, tab => tab.linkedBrowser));
// This defines a proxy which allows us to access browsers by
// index without actually creating a full array of browsers.
new Proxy([], {
has: (target, name) => {
if (typeof name == "string" && Number.isInteger(parseInt(name))) {
return (name in this.tabs);
}
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];
}
});
]]>
</getter>
</property>
<field name="_browsers">null</field>
</field>
<!-- 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. -->
@ -2929,8 +2941,7 @@
this.mCurrentTab._logicallySelected = false;
this.mCurrentTab._visuallySelected = false;
// invalidate caches
this._browsers = null;
// invalidate cache
this._visibleTabs = null;
// 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_addKeywordSearch.js]
[browser_search_favicon.js]
skip-if = e10s # Bug 1212647
[browser_alltabslistener.js]
[browser_audioTabIcon.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
[browser_clipboard.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_datachoices_notification.js]
skip-if = !datareporting

View File

@ -2,7 +2,7 @@
/* vim: set sts=2 sw=2 et tw=80: */
"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");
var Bookmarks = PlacesUtils.bookmarks;
@ -111,7 +111,9 @@ extensions.registerSchemaAPI("bookmarks", "bookmarks", (extension, context) => {
return getTree(id, false);
},
// search
search: function(query) {
return Bookmarks.search(query).then(result => result.map(convert));
},
create: function(bookmark) {
let info = {
@ -139,7 +141,7 @@ extensions.registerSchemaAPI("bookmarks", "bookmarks", (extension, context) => {
try {
return Bookmarks.insert(info).then(convert);
} 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 {
return Bookmarks.update(info).then(convert);
} 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 {
return Bookmarks.update(info).then(convert);
} 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 {
return Bookmarks.remove(info).then(result => {});
} 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,
badgeText: "",
badgeBackgroundColor: null,
icon: IconDetails.normalize({ path: options.default_icon }, extension,
icon: IconDetails.normalize({path: options.default_icon}, extension,
null, true),
popup: popup,
};

View File

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

View File

@ -4,7 +4,7 @@
extensions.on("uninstall", (msg, extension) => {
if (extension.uninstallURL) {
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 = {
show: false,
title: title || extension.name,
icon: IconDetails.normalize({ path: options.default_icon }, extension,
icon: IconDetails.normalize({path: options.default_icon}, extension,
null, true),
popup: popup && extension.baseURI.resolve(popup),
};

View File

@ -465,7 +465,7 @@ extensions.registerSchemaAPI("tabs", null, (extension, context) => {
captureVisibleTab: function(windowId, options) {
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 ?
@ -524,7 +524,7 @@ extensions.registerSchemaAPI("tabs", null, (extension, context) => {
if (details.file !== null) {
let url = context.uri.resolve(details.file);
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);
}
@ -538,7 +538,7 @@ extensions.registerSchemaAPI("tabs", null, (extension, context) => {
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) {

View File

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

View File

@ -234,7 +234,6 @@
},
{
"name": "search",
"unsupported": true,
"type": "function",
"description": "Searches for BookmarkTreeNodes matching the given query. Queries specified with an object produce BookmarkTreeNodes matching all specified properties.",
"async": "callback",
@ -258,6 +257,7 @@
},
"url": {
"type": "string",
"format": "url",
"optional": true,
"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.getBadgeBackgroundColor({tabId})]
).then(details => {
return Promise.resolve({ title: details[0],
return Promise.resolve({title: details[0],
popup: details[1],
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
// run the next test.
new Promise(resolve => {
return browser.tabs.query({ active: true, currentWindow: true }, resolve);
return browser.tabs.query({active: true, currentWindow: true}, resolve);
}).then(tabs => {
return checkDetails(expecting, tabs[0].id);
}).then(() => {
@ -72,7 +72,7 @@ function* runTests(options) {
nextTest();
});
browser.tabs.query({ active: true, currentWindow: true }, resultTabs => {
browser.tabs.query({active: true, currentWindow: true}, resultTabs => {
tabs[0] = resultTabs[0].id;
nextTest();
@ -148,39 +148,39 @@ add_task(function* testTabSwitchContext() {
getTests(tabs, expectDefaults) {
let details = [
{ "icon": browser.runtime.getURL("default.png"),
{"icon": browser.runtime.getURL("default.png"),
"popup": browser.runtime.getURL("default.html"),
"title": "Default Title",
"badge": "",
"badgeBackgroundColor": null },
{ "icon": browser.runtime.getURL("1.png"),
"badgeBackgroundColor": null},
{"icon": browser.runtime.getURL("1.png"),
"popup": browser.runtime.getURL("default.html"),
"title": "Default Title",
"badge": "",
"badgeBackgroundColor": null },
{ "icon": browser.runtime.getURL("2.png"),
"badgeBackgroundColor": null},
{"icon": browser.runtime.getURL("2.png"),
"popup": browser.runtime.getURL("2.html"),
"title": "Title 2",
"badge": "2",
"badgeBackgroundColor": [0xff, 0, 0, 0xff],
"disabled": true },
{ "icon": browser.runtime.getURL("1.png"),
"disabled": true},
{"icon": browser.runtime.getURL("1.png"),
"popup": browser.runtime.getURL("default-2.html"),
"title": "Default Title 2",
"badge": "d2",
"badgeBackgroundColor": [0, 0xff, 0, 0xff],
"disabled": true },
{ "icon": browser.runtime.getURL("1.png"),
"disabled": true},
{"icon": browser.runtime.getURL("1.png"),
"popup": browser.runtime.getURL("default-2.html"),
"title": "Default Title 2",
"badge": "d2",
"badgeBackgroundColor": [0, 0xff, 0, 0xff],
"disabled": false },
{ "icon": browser.runtime.getURL("default-2.png"),
"disabled": false},
{"icon": browser.runtime.getURL("default-2.png"),
"popup": browser.runtime.getURL("default-2.html"),
"title": "Default Title 2",
"badge": "d2",
"badgeBackgroundColor": [0, 0xff, 0, 0xff] },
"badgeBackgroundColor": [0, 0xff, 0, 0xff]},
];
return [
@ -192,14 +192,14 @@ add_task(function* testTabSwitchContext() {
},
expect => {
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(() => {
expect(details[1]);
});
},
expect => {
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);
expectDefaults(details[0]).then(() => {
expect(details[0]);
@ -209,11 +209,11 @@ add_task(function* testTabSwitchContext() {
expect => {
browser.test.log("Change properties. Expect new properties.");
let tabId = tabs[1];
browser.browserAction.setIcon({ tabId, path: "2.png" });
browser.browserAction.setPopup({ tabId, popup: "2.html" });
browser.browserAction.setTitle({ tabId, title: "Title 2" });
browser.browserAction.setBadgeText({ tabId, text: "2" });
browser.browserAction.setBadgeBackgroundColor({ tabId, color: [0xff, 0, 0, 0xff] });
browser.browserAction.setIcon({tabId, path: "2.png"});
browser.browserAction.setPopup({tabId, popup: "2.html"});
browser.browserAction.setTitle({tabId, title: "Title 2"});
browser.browserAction.setBadgeText({tabId, text: "2"});
browser.browserAction.setBadgeBackgroundColor({tabId, color: [0xff, 0, 0, 0xff]});
browser.browserAction.disable(tabId);
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 => {
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 => {
browser.test.log("Change default values, expect those changes reflected.");
browser.browserAction.setIcon({ path: "default-2.png" });
browser.browserAction.setPopup({ popup: "default-2.html" });
browser.browserAction.setTitle({ title: "Default Title 2" });
browser.browserAction.setBadgeText({ text: "d2" });
browser.browserAction.setBadgeBackgroundColor({ color: [0, 0xff, 0, 0xff] });
browser.browserAction.setIcon({path: "default-2.png"});
browser.browserAction.setPopup({popup: "default-2.html"});
browser.browserAction.setTitle({title: "Default Title 2"});
browser.browserAction.setBadgeText({text: "d2"});
browser.browserAction.setBadgeBackgroundColor({color: [0, 0xff, 0, 0xff]});
browser.browserAction.disable();
expectDefaults(details[3]).then(() => {
expect(details[3]);
@ -261,7 +261,7 @@ add_task(function* testTabSwitchContext() {
},
expect => {
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(() => {
expect(details[2]);
});
@ -275,7 +275,7 @@ add_task(function* testTabSwitchContext() {
},
expect => {
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);
expect(details[5]);
});
@ -305,26 +305,26 @@ add_task(function* testDefaultTitle() {
getTests(tabs, expectDefaults) {
let details = [
{ "title": "Foo Extension",
{"title": "Foo Extension",
"popup": "",
"badge": "",
"badgeBackgroundColor": null,
"icon": browser.runtime.getURL("icon.png") },
{ "title": "Foo Title",
"icon": browser.runtime.getURL("icon.png")},
{"title": "Foo Title",
"popup": "",
"badge": "",
"badgeBackgroundColor": null,
"icon": browser.runtime.getURL("icon.png") },
{ "title": "Bar Title",
"icon": browser.runtime.getURL("icon.png")},
{"title": "Bar Title",
"popup": "",
"badge": "",
"badgeBackgroundColor": null,
"icon": browser.runtime.getURL("icon.png") },
{ "title": "",
"icon": browser.runtime.getURL("icon.png")},
{"title": "",
"popup": "",
"badge": "",
"badgeBackgroundColor": null,
"icon": browser.runtime.getURL("icon.png") },
"icon": browser.runtime.getURL("icon.png")},
];
return [
@ -336,28 +336,28 @@ add_task(function* testDefaultTitle() {
},
expect => {
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(() => {
expect(details[1]);
});
},
expect => {
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(() => {
expect(details[1]);
});
},
expect => {
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(() => {
expect(details[2]);
});
},
expect => {
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(() => {
expect(details[3]);
});

View File

@ -31,100 +31,100 @@ add_task(function* testDetailsObjects() {
/* eslint-disable comma-dangle, indent */
let iconDetails = [
// Only paths.
{ details: { "path": "a.png" },
{details: {"path": "a.png"},
resolutions: {
"1": browser.runtime.getURL("data/a.png"),
"2": browser.runtime.getURL("data/a.png"), } },
{ details: { "path": "/a.png" },
"2": browser.runtime.getURL("data/a.png")}},
{details: {"path": "/a.png"},
resolutions: {
"1": browser.runtime.getURL("a.png"),
"2": browser.runtime.getURL("a.png"), } },
{ details: { "path": { "19": "a.png" } },
"2": browser.runtime.getURL("a.png")}},
{details: {"path": {"19": "a.png"}},
resolutions: {
"1": browser.runtime.getURL("data/a.png"),
"2": browser.runtime.getURL("data/a.png"), } },
{ details: { "path": { "38": "a.png" } },
"2": browser.runtime.getURL("data/a.png")}},
{details: {"path": {"38": "a.png"}},
resolutions: {
"1": browser.runtime.getURL("data/a.png"),
"2": browser.runtime.getURL("data/a.png"), } },
{ details: { "path": { "19": "a.png", "38": "a-x2.png" } },
"2": browser.runtime.getURL("data/a.png")}},
{details: {"path": {"19": "a.png", "38": "a-x2.png"}},
resolutions: {
"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.
{ details: { "imageData": imageData.red.imageData },
{details: {"imageData": imageData.red.imageData},
resolutions: {
"1": imageData.red.url,
"2": imageData.red.url, } },
{ details: { "imageData": { "19": imageData.red.imageData } },
"2": imageData.red.url}},
{details: {"imageData": {"19": imageData.red.imageData}},
resolutions: {
"1": imageData.red.url,
"2": imageData.red.url, } },
{ details: { "imageData": { "38": imageData.red.imageData } },
"2": imageData.red.url}},
{details: {"imageData": {"38": imageData.red.imageData}},
resolutions: {
"1": imageData.red.url,
"2": imageData.red.url, } },
{ details: { "imageData": {
"2": imageData.red.url}},
{details: {"imageData": {
"19": imageData.red.imageData,
"38": imageData.green.imageData } },
"38": imageData.green.imageData}},
resolutions: {
"1": imageData.red.url,
"2": imageData.green.url, } },
"2": imageData.green.url}},
// Mixed path and imageData objects.
//
// The behavior is currently undefined if both |path| and
// |imageData| specify icons of the same size.
{ details: {
"path": { "19": "a.png" },
"imageData": { "38": imageData.red.imageData } },
{details: {
"path": {"19": "a.png"},
"imageData": {"38": imageData.red.imageData}},
resolutions: {
"1": browser.runtime.getURL("data/a.png"),
"2": imageData.red.url, } },
{ details: {
"path": { "38": "a.png" },
"imageData": { "19": imageData.red.imageData } },
"2": imageData.red.url}},
{details: {
"path": {"38": "a.png"},
"imageData": {"19": imageData.red.imageData}},
resolutions: {
"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.
{ details: {
{details: {
"path": "a.png",
"imageData": { "38": imageData.red.imageData } },
"imageData": {"38": imageData.red.imageData}},
resolutions: {
"1": browser.runtime.getURL("data/a.png"),
"2": imageData.red.url, } },
{ details: {
"path": { "38": "a.png" },
"imageData": imageData.red.imageData, },
"2": imageData.red.url}},
{details: {
"path": {"38": "a.png"},
"imageData": imageData.red.imageData},
resolutions: {
"1": imageData.red.url,
"2": browser.runtime.getURL("data/a.png"), } },
"2": browser.runtime.getURL("data/a.png")}},
// Various resolutions
{ details: { "path": { "18": "a.png", "32": "a-x2.png" } },
{details: {"path": {"18": "a.png", "32": "a-x2.png"}},
resolutions: {
"1": browser.runtime.getURL("data/a.png"),
"2": browser.runtime.getURL("data/a-x2.png"), } },
{ details: { "path": { "16": "16.png", "100": "100.png" } },
"2": browser.runtime.getURL("data/a-x2.png")}},
{details: {"path": {"16": "16.png", "100": "100.png"}},
resolutions: {
"1": browser.runtime.getURL("data/100.png"),
"2": browser.runtime.getURL("data/100.png"), } },
{ details: { "path": { "2": "2.png"} },
"2": browser.runtime.getURL("data/100.png")}},
{details: {"path": {"2": "2.png"}},
resolutions: {
"1": browser.runtime.getURL("data/2.png"),
"2": browser.runtime.getURL("data/2.png"), } },
{ details: { "path": {
"2": browser.runtime.getURL("data/2.png")}},
{details: {"path": {
"6": "6.png",
"18": "18.png",
"32": "32.png",
"48": "48.png",
"128": "128.png" } },
"128": "128.png"}},
resolutions: {
"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.
@ -162,7 +162,7 @@ add_task(function* testDetailsObjects() {
let tests = [];
for (let [idx, icon] of iconDetails.entries()) {
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.
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;
browser.pageAction.show(tabId);
@ -230,7 +230,7 @@ add_task(function* testInvalidIconSizes() {
},
background: function() {
browser.tabs.query({ active: true, currentWindow: true }, tabs => {
browser.tabs.query({active: true, currentWindow: true}, tabs => {
let tabId = tabs[0].id;
let promises = [];
@ -255,16 +255,16 @@ add_task(function* testInvalidIconSizes() {
for (let type of ["path", "imageData"]) {
let img = type == "imageData" ? imageData : "test.png";
assertSetIconThrows({ [type]: { "abcdef": img } });
assertSetIconThrows({ [type]: { "48px": img } });
assertSetIconThrows({ [type]: { "20.5": img } });
assertSetIconThrows({ [type]: { "5.0": img } });
assertSetIconThrows({ [type]: { "-300": img } });
assertSetIconThrows({ [type]: { "abc": img, "5": img }});
assertSetIconThrows({[type]: {"abcdef": img}});
assertSetIconThrows({[type]: {"48px": img}});
assertSetIconThrows({[type]: {"20.5": img}});
assertSetIconThrows({[type]: {"5.0": img}});
assertSetIconThrows({[type]: {"-300": img}});
assertSetIconThrows({[type]: {"abc": img, "5": img}});
}
assertSetIconThrows({ imageData: { "abcdef": imageData }, path: {"5": "test.png"} });
assertSetIconThrows({ path: { "abcdef": "test.png" }, imageData: {"5": imageData} });
assertSetIconThrows({imageData: {"abcdef": imageData}, path: {"5": "test.png"}});
assertSetIconThrows({path: {"abcdef": "test.png"}, imageData: {"5": imageData}});
}
Promise.all(promises).then(() => {
@ -287,9 +287,9 @@ add_task(function* testDefaultDetails() {
let icons = [
"foo/bar.png",
"/foo/bar.png",
{ "19": "foo/bar.png" },
{ "38": "foo/bar.png" },
{ "19": "foo/bar.png", "38": "baz/quux.png" },
{"19": "foo/bar.png"},
{"38": "foo/bar.png"},
{"19": "foo/bar.png", "38": "baz/quux.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) {
let extension = ExtensionTestUtils.loadExtension({
manifest: {
"browser_action": { "default_icon": icon },
"page_action": { "default_icon": icon },
"browser_action": {"default_icon": icon},
"page_action": {"default_icon": icon},
},
background: function() {
browser.tabs.query({ active: true, currentWindow: true }, tabs => {
browser.tabs.query({active: true, currentWindow: true}, tabs => {
let tabId = tabs[0].id;
browser.pageAction.show(tabId);
@ -345,7 +345,7 @@ add_task(function* testSecureURLsDenied() {
},
background: function() {
browser.tabs.query({ active: true, currentWindow: true }, tabs => {
browser.tabs.query({active: true, currentWindow: true}, tabs => {
let tabId = tabs[0].id;
let urls = ["chrome://browser/content/browser.xul",

View File

@ -30,34 +30,34 @@ function* testInArea(area) {
let sendClick;
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" });
sendClick({ expectEvent: false, expectPopup: "b" });
browser.browserAction.setPopup({popup: "popup-b.html"});
sendClick({expectEvent: false, expectPopup: "b"});
},
() => {
sendClick({ expectEvent: false, expectPopup: "b" });
sendClick({expectEvent: false, expectPopup: "b"});
},
() => {
browser.browserAction.setPopup({ popup: "" });
sendClick({ expectEvent: true, expectPopup: null });
browser.browserAction.setPopup({popup: ""});
sendClick({expectEvent: true, expectPopup: null});
},
() => {
sendClick({ expectEvent: true, expectPopup: null });
sendClick({expectEvent: true, expectPopup: null});
},
() => {
browser.browserAction.setPopup({ popup: "/popup-a.html" });
sendClick({ expectEvent: false, expectPopup: "a" });
browser.browserAction.setPopup({popup: "/popup-a.html"});
sendClick({expectEvent: false, expectPopup: "a"});
},
];
let expect = {};
sendClick = ({ expectEvent, expectPopup }) => {
expect = { event: expectEvent, popup: expectPopup };
sendClick = ({expectEvent, expectPopup}) => {
expect = {event: expectEvent, popup: expectPopup};
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: {

View File

@ -22,14 +22,14 @@ add_task(function* () {
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"];
for (let i = 0; i < contexts.length; i++) {
let context = contexts[i];
let title = context;
browser.contextMenus.create({ title: title, contexts: [context], id: "ext-" + context,
onclick: genericOnClick });
browser.contextMenus.create({title: title, contexts: [context], id: "ext-" + context,
onclick: genericOnClick});
if (context == "selection") {
browser.contextMenus.update("ext-selection", {
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(
{ title: "child1", parentId: parent, onclick: genericOnClick });
{title: "child1", parentId: parent, onclick: genericOnClick});
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(
{ title: "child1", parentId: parentToDel, onclick: genericOnClick });
{title: "child1", parentId: parentToDel, onclick: genericOnClick});
browser.contextMenus.create(
{ title: "child2", parentId: parentToDel, onclick: genericOnClick });
{title: "child2", parentId: parentToDel, onclick: genericOnClick});
browser.contextMenus.remove(parentToDel);
browser.contextMenus.update(parent, { parentId: child2 }).then(
browser.contextMenus.update(parent, {parentId: child2}).then(
() => {
browser.test.notifyFail();
},
@ -81,7 +81,7 @@ add_task(function* () {
let contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
let popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouseAtCenter("#img1",
{ type: "contextmenu", button: 2 }, gBrowser.selectedBrowser);
{type: "contextmenu", button: 2}, gBrowser.selectedBrowser);
yield popupShownPromise;
// Check some menu items
@ -134,7 +134,7 @@ add_task(function* () {
// Bring up context menu again
popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouse(null, 1, 1,
{ type: "contextmenu", button: 2 }, gBrowser.selectedBrowser);
{type: "contextmenu", button: 2}, gBrowser.selectedBrowser);
yield popupShownPromise;
items = contentAreaContextMenu.getElementsByAttribute("ext-type", "top-level-menu");
@ -163,7 +163,7 @@ add_task(function* () {
popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouseAtCenter("#img1",
{ type: "contextmenu", button: 2 }, gBrowser.selectedBrowser);
{type: "contextmenu", button: 2}, gBrowser.selectedBrowser);
yield popupShownPromise;
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}]);
});
yield sendMessage({ checkLastError: api });
yield sendMessage({checkLastError: api});
SimpleTest.endMonitorConsole();
yield waitForConsole;

View File

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

View File

@ -34,34 +34,34 @@ add_task(function* testPageActionPopup() {
let sendClick;
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" });
sendClick({ expectEvent: false, expectPopup: "b" });
browser.pageAction.setPopup({tabId, popup: "popup-b.html"});
sendClick({expectEvent: false, expectPopup: "b"});
},
() => {
sendClick({ expectEvent: false, expectPopup: "b" });
sendClick({expectEvent: false, expectPopup: "b"});
},
() => {
browser.pageAction.setPopup({ tabId, popup: "" });
sendClick({ expectEvent: true, expectPopup: null });
browser.pageAction.setPopup({tabId, popup: ""});
sendClick({expectEvent: true, expectPopup: null});
},
() => {
sendClick({ expectEvent: true, expectPopup: null });
sendClick({expectEvent: true, expectPopup: null});
},
() => {
browser.pageAction.setPopup({ tabId, popup: "/popup-a.html" });
sendClick({ expectEvent: false, expectPopup: "a" });
browser.pageAction.setPopup({tabId, popup: "/popup-a.html"});
sendClick({expectEvent: false, expectPopup: "a"});
},
];
let expect = {};
sendClick = ({ expectEvent, expectPopup }) => {
expect = { event: expectEvent, popup: expectPopup };
sendClick = ({expectEvent, expectPopup}) => {
expect = {event: expectEvent, popup: expectPopup};
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;
browser.pageAction.show(tabId);
@ -165,7 +165,7 @@ add_task(function* testPageActionSecurity() {
let extension = ExtensionTestUtils.loadExtension({
manifest: {
[api]: { "default_popup": URL },
[api]: {"default_popup": URL},
},
});

View File

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

View File

@ -1,7 +1,7 @@
"use strict";
let { AddonManager } = Components.utils.import("resource://gre/modules/AddonManager.jsm", {});
let { Extension } = Components.utils.import("resource://gre/modules/Extension.jsm", {});
let {AddonManager} = Components.utils.import("resource://gre/modules/AddonManager.jsm", {});
let {Extension} = Components.utils.import("resource://gre/modules/Extension.jsm", {});
function install(url) {
return new Promise((resolve, reject) => {
@ -78,7 +78,7 @@ add_task(function* test_setuninstallurl_badargs() {
add_task(function* test_setuninstall_empty_url() {
function backgroundScript() {
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",
@ -95,7 +95,7 @@ add_task(function* test_setuninstall_empty_url() {
add_task(function* test_setuninstallurl() {
function backgroundScript() {
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",

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; });
},
files: {
"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.onMessage.addListener((msg) => {
port.postMessage({ tabReceived: msg });
port.postMessage({tabReceived: msg});
});
},
"tab.html": `

View File

@ -49,7 +49,7 @@ add_task(function* () {
let windowId;
let tabIds;
promiseTabs.query({ lastFocusedWindow: true }).then(tabs => {
promiseTabs.query({lastFocusedWindow: true}).then(tabs => {
browser.test.assertEq(tabs.length, 3, "We have three 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");
return Promise.all([
promiseTabs.query({ windowId, audible: false }),
promiseTabs.query({ windowId, audible: true }),
promiseTabs.query({ windowId, muted: true }),
promiseTabs.query({ windowId, muted: false }),
promiseTabs.query({windowId, audible: false}),
promiseTabs.query({windowId, audible: true}),
promiseTabs.query({windowId, muted: true}),
promiseTabs.query({windowId, muted: false}),
]);
}).then(([silent, audible, muted, nonMuted]) => {
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");
return Promise.all([
promiseTabs.query({ windowId, audible: false }),
promiseTabs.query({ windowId, audible: true }),
promiseTabs.query({ windowId, muted: true }),
promiseTabs.query({ windowId, muted: false }),
promiseTabs.query({windowId, audible: false}),
promiseTabs.query({windowId, audible: true}),
promiseTabs.query({windowId, muted: true}),
promiseTabs.query({windowId, muted: false}),
]);
}).then(([silent, audible, muted, nonMuted]) => {
browser.test.assertEq(2, silent.length, "Two silent tabs");
@ -116,8 +116,8 @@ add_task(function* () {
return Promise.all([
promiseUpdated(tabIds[0], "mutedInfo"),
promiseUpdated(tabIds[1], "mutedInfo"),
promiseTabs.update(tabIds[0], { muted: false }),
promiseTabs.update(tabIds[1], { muted: true }),
promiseTabs.update(tabIds[0], {muted: false}),
promiseTabs.update(tabIds[1], {muted: true}),
]);
}).then(([unmuted, muted]) => {
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}`);
promiseTabs.query({ currentWindow: true, active: true }).then(([tab]) => {
promiseTabs.query({currentWindow: true, active: true}).then(([tab]) => {
return Promise.all([
promiseTabs.captureVisibleTab(tab.windowId, { format: "jpeg", quality: 95 }),
promiseTabs.captureVisibleTab(tab.windowId, { format: "png", quality: 95 }),
promiseTabs.captureVisibleTab(tab.windowId, { quality: 95 }),
promiseTabs.captureVisibleTab(tab.windowId, {format: "jpeg", quality: 95}),
promiseTabs.captureVisibleTab(tab.windowId, {format: "png", quality: 95}),
promiseTabs.captureVisibleTab(tab.windowId, {quality: 95}),
promiseTabs.captureVisibleTab(tab.windowId),
]).then(([jpeg, png, ...pngs]) => {
browser.test.assertTrue(pngs.every(url => url == png), "All PNGs are identical");
@ -60,7 +60,7 @@ function* runTest(options) {
}).then(([jpeg, png]) => {
let tabDims = `${tab.width}\u00d7${tab.height}`;
let images = { jpeg, png };
let images = {jpeg, png};
for (let format of Object.keys(images)) {
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
// sure we capture the entire frame, and scale it correctly.
let coords = [
{ x: 0, y: 0,
color: options.color },
{ x: img.width - 1,
{x: 0, y: 0,
color: options.color},
{x: img.width - 1,
y: img.height - 1,
color: options.color },
{ x: img.width / 2 | 0,
color: options.color},
{x: img.width / 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;
if (format == "png") {
@ -133,13 +133,13 @@ function* runTest(options) {
}
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() {
@ -149,7 +149,7 @@ add_task(function* testCaptureVisibleTabPermissions() {
},
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.test.notifyFail("captureVisibleTabPermissions");

View File

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

View File

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

View File

@ -61,17 +61,17 @@ add_task(function* testGoodPermissions() {
info("Test explicit host permission");
yield testHasPermission({
manifest: { "permissions": ["http://mochi.test/"] },
manifest: {"permissions": ["http://mochi.test/"]},
});
info("Test explicit host subdomain permission");
yield testHasPermission({
manifest: { "permissions": ["http://*.mochi.test/"] },
manifest: {"permissions": ["http://*.mochi.test/"]},
});
info("Test explicit <all_urls> permission");
yield testHasPermission({
manifest: { "permissions": ["<all_urls>"] },
manifest: {"permissions": ["<all_urls>"]},
});
info("Test activeTab permission with a browser action click");
@ -98,7 +98,7 @@ add_task(function* testGoodPermissions() {
},
contentSetup() {
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);
resolve();
});
@ -112,7 +112,7 @@ add_task(function* testGoodPermissions() {
yield testHasPermission({
manifest: {
"permissions": ["activeTab"],
"browser_action": { "default_popup": "_blank.html" },
"browser_action": {"default_popup": "_blank.html"},
},
setup: clickBrowserAction,
tearDown: closeBrowserAction,
@ -122,11 +122,11 @@ add_task(function* testGoodPermissions() {
yield testHasPermission({
manifest: {
"permissions": ["activeTab"],
"page_action": { "default_popup": "_blank.html" },
"page_action": {"default_popup": "_blank.html"},
},
contentSetup() {
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);
resolve();
});
@ -142,7 +142,7 @@ add_task(function* testGoodPermissions() {
"permissions": ["activeTab", "contextMenus"],
},
contentSetup() {
browser.contextMenus.create({ title: "activeTab", contexts: ["all"] });
browser.contextMenus.create({title: "activeTab", contexts: ["all"]});
return Promise.resolve();
},
setup: function* (extension) {
@ -150,7 +150,7 @@ add_task(function* testGoodPermissions() {
let awaitPopupShown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
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);
yield awaitPopupShown;

View File

@ -7,7 +7,7 @@ add_task(function* () {
manifest: {
"permissions": ["tabs"],
"browser_action": { "default_popup": "popup.html" },
"browser_action": {"default_popup": "popup.html"},
},
files: {
@ -18,7 +18,7 @@ add_task(function* () {
browser.test.assertEq(currentTab.url, url, "getCurrent in non-active background tab");
// Activate the tab.
browser.tabs.onActivated.addListener(function listener({ tabId }) {
browser.tabs.onActivated.addListener(function listener({tabId}) {
if (tabId == currentTab.id) {
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.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;
}
let { promise, background, foreground } = promises.shift();
let {promise, background, foreground} = promises.shift();
new Promise(promise).then(() => {
browser.tabs.executeScript({
code: `(${checkCSS})()`,

View File

@ -20,7 +20,7 @@ add_task(function* () {
let tab = tabs[0];
browser.tabs.move(tab.id, {index: 0});
browser.tabs.query(
{ lastFocusedWindow: true },
{lastFocusedWindow: true},
tabs => {
browser.test.assertEq(tabs[0].url, tab.url, "should be first tab");
browser.test.notifyPass("tabs.move.single");
@ -40,12 +40,12 @@ add_task(function* () {
background: function() {
browser.tabs.query(
{ lastFocusedWindow: true },
{lastFocusedWindow: true},
tabs => {
tabs.sort(function(a, b) { return a.url > b.url; });
browser.tabs.move(tabs.map(tab => tab.id), {index: 0});
browser.tabs.query(
{ lastFocusedWindow: true },
{lastFocusedWindow: true},
tabs => {
browser.test.assertEq(tabs[0].url, "about:blank", "should be first tab");
browser.test.assertEq(tabs[1].url, "about:config", "should be second tab");
@ -67,13 +67,13 @@ add_task(function* () {
background: function() {
browser.tabs.query(
{ lastFocusedWindow: true },
{lastFocusedWindow: true},
tabs => {
let tab = tabs[0];
// Assuming that tab.id of 12345 does not exist.
browser.tabs.move([12345, tab.id], {index: 0});
browser.tabs.query(
{ lastFocusedWindow: true },
{lastFocusedWindow: true},
tabs => {
browser.test.assertEq(tabs[0].url, tab.url, "should be first tab");
browser.test.notifyPass("tabs.move.invalid");
@ -93,12 +93,12 @@ add_task(function* () {
background: function() {
browser.tabs.query(
{ lastFocusedWindow: true },
{lastFocusedWindow: true},
tabs => {
let tab = tabs[0];
browser.tabs.move(tab.id, {index: -1});
browser.tabs.query(
{ lastFocusedWindow: true },
{lastFocusedWindow: true},
tabs => {
browser.test.assertEq(tabs[2].url, tab.url, "should be last tab");
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.query(
{ url: "<all_urls>" },
{url: "<all_urls>"},
tabs => {
browser.test.assertEq(tabs[0].url, "http://example.com/");
browser.test.assertEq(tabs[0].windowId, destination.windowId);
@ -54,14 +54,14 @@ add_task(function* () {
background: function() {
browser.tabs.query(
{ url: "<all_urls>" },
{url: "<all_urls>"},
tabs => {
let destination = tabs[0];
let source = tabs[1]; // remember, pinning moves it to the left.
browser.tabs.move(source.id, {windowId: destination.windowId, index: 0});
browser.tabs.query(
{ url: "<all_urls>" },
{url: "<all_urls>"},
tabs => {
browser.test.assertEq(true, tabs[0].pinned);
browser.test.notifyPass("tabs.move.pin");
@ -94,13 +94,13 @@ add_task(function* () {
background: function() {
browser.tabs.query(
{ url: "<all_urls>" },
{url: "<all_urls>"},
tabs => {
let move1 = tabs[1];
let move3 = tabs[3];
browser.tabs.move([move1.id, move3.id], {index: 0});
browser.tabs.query(
{ url: "<all_urls>" },
{url: "<all_urls>"},
tabs => {
browser.test.assertEq(tabs[0].url, move1.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 expectedSequence = [
{ status: "loading" },
{ status: "loading", url: pageURL },
{ status: "complete" },
{status: "loading"},
{status: "loading", url: pageURL},
{status: "complete"},
];
let collectedSequence = [];
@ -60,7 +60,7 @@ add_task(function* () {
browser.test.notifyPass("tabs.onUpdated");
});
browser.tabs.create({ url: pageURL });
browser.tabs.create({url: pageURL});
},
files: {
"content-script.js": `

View File

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

View File

@ -8,7 +8,7 @@ add_task(function* testWebNavigationGetNonExistentTab() {
let results = [
// There is no "tabId = 0" because the id assigned by TabManager (defined in ext-utils.js)
// 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");
}, (error) => {
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)
// 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");
}, (error) => {
browser.test.assertEq("No tab found with tabId: 0", error.message,
@ -57,11 +57,11 @@ add_task(function* testWebNavigationFrames() {
return;
}
browser.webNavigation.getAllFrames({ tabId }).then((getAllFramesDetails) => {
browser.webNavigation.getAllFrames({tabId}).then((getAllFramesDetails) => {
let getFramePromises = getAllFramesDetails.map((frameDetail) => {
let { frameId } = frameDetail;
let {frameId} = frameDetail;
// 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) => {
@ -81,7 +81,7 @@ add_task(function* testWebNavigationFrames() {
}
// 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");
}, (error) => {
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;
});
} + ")();",

View File

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

View File

@ -3,12 +3,10 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
add_task(function* test() {
// Will need to be changed if Google isn't the default search engine.
// Note: geoSpecificDefaults are disabled for mochitests, so this is the
// non-US en-US default.
let histogramKey = "google.contextmenu";
let engine = yield promiseNewEngine("testEngine.xml");
let histogramKey = "other-" + engine.name + ".contextmenu";
let numSearchesBefore = 0;
try {
let hs = Services.telemetry.getKeyedHistogramById("SEARCH_COUNTS").snapshot();
if (histogramKey in hs) {
@ -19,7 +17,7 @@ add_task(function* test() {
}
let tabs = [];
let tabsLoadedDeferred = Promise.defer();
let tabsLoadedDeferred = new Deferred();
function tabAdded(event) {
let tab = event.target;
@ -54,3 +52,10 @@ add_task(function* test() {
Assert.equal(hs[histogramKey].sum, numSearchesBefore + 2,
"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");
XPCOMUtils.defineLazyModuleGetter(this, "PrivacyFilter",
"resource:///modules/sessionstore/PrivacyFilter.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "RunState",
"resource:///modules/sessionstore/RunState.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "SessionStore",
"resource:///modules/sessionstore/SessionStore.jsm");
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");
return this._writeState(state);
},

View File

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

View File

@ -1,4 +1,3 @@
[DEFAULT]
[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)) {
// Wait for any windows caught by the windowcatcher to close
gWindowCatcher.finish(function () {
BrowserTestUtils.waitForNewTab(gBrowser).then(testNotificationURL);
button.click();
gBrowser.selectedBrowser.addEventListener("load", function () {
gBrowser.selectedBrowser.removeEventListener("load", arguments.callee, true);
testNotificationURL();
}, true);
});
} else {
notifyBox.removeAllNotifications(true);
@ -389,7 +386,7 @@ function testNotificationURL()
{
ok(true, "Test testNotificationURL: clicking the notification button " +
"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;
is(href, expectedURL, "The url opened from the notification should be the " +
"url provided by the update");

View File

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

View File

@ -5252,12 +5252,56 @@ if test -n "$MOZ_OMX_PLUGIN"; then
fi
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 ========================================================
MOZ_ARG_ENABLE_BOOL(gradle-mobile-android-builds,
[ --enable-gradle-mobile-android-builds Enable building mobile/android with Gradle],
MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE=1,
MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE=)
GRADLE=
MOZ_ARG_WITH_STRING(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 "$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
const {devtools} = Cu.import("resource://devtools/shared/Loader.jsm", {});
devtools.reload(reloadToolbox);
devtools.reload();
// Also tells gDevTools to reload its dependencies
const {gDevTools} = devtools.require("devtools/client/framework/devtools");
gDevTools.reload();
// Go over all top level windows to reload all devtools related things
let windowsEnum = Services.wm.getEnumerator(null);
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;

View File

@ -10,7 +10,6 @@
<head>
<title>&animationInspectorTitle;</title>
<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"/>
<script type="application/javascript;version=1.8" src="chrome://devtools/content/shared/theme-switching.js"/>
</head>

View File

@ -65,8 +65,10 @@ add_task(function*() {
info("Select a finite animation, reload the page and wait for the " +
"animation to complete");
yield selectNode(".negative-delay", inspector);
let onScrubberStopped = waitForScrubberStopped(timeline);
yield reloadTab(inspector);
yield waitForScrubberStopped(timeline);
yield onScrubberStopped;
ok(btn.classList.contains("paused"),
"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/. -->
<?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/skin/common.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"?>
<!DOCTYPE window [

View File

@ -5,7 +5,6 @@
<?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="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/debugger.css" type="text/css"?>
<!DOCTYPE window [

View File

@ -6,7 +6,6 @@
<!DOCTYPE window []>
<?xml-stylesheet href="chrome://devtools/skin/common.css"?>
<?xml-stylesheet href="chrome://devtools/skin/eyedropper.css" type="text/css"?>
<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
* 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/. */
"use strict";
const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
@ -198,6 +199,8 @@ BrowserToolboxProcess.prototype = {
if (this._options.addonID) {
xulURI += "?addonID=" + this._options.addonID;
} else if (this._options.testScript) {
xulURI += "?testScript=" + encodeURIComponent(this._options.testScript);
}
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 Services = Cu.import("resource://gre/modules/Services.jsm", {}).Services;
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
* 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/. */

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
* 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/. */

View File

@ -17,6 +17,7 @@ support-files =
browser_toolbox_options_enable_serviceworkers_testing.html
serviceworker.js
[browser_browser_toolbox.js]
[browser_devtools_api.js]
[browser_devtools_api_destroy.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.
* 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.
* 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.
* 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.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// 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.
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
// 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.
* 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.
* 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.
* 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.
http://creativecommons.org/publicdomain/zero/1.0/ */
* http://creativecommons.org/publicdomain/zero/1.0/ */
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.
http://creativecommons.org/publicdomain/zero/1.0/ */
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Ensure target is closed if client is closed directly
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.
http://creativecommons.org/publicdomain/zero/1.0/ */
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Test support methods on Target, such as `hasActor`, `getActorDescription`,
// `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.
http://creativecommons.org/publicdomain/zero/1.0/ */
* http://creativecommons.org/publicdomain/zero/1.0/ */
function test() {
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.
http://creativecommons.org/publicdomain/zero/1.0/ */
* http://creativecommons.org/publicdomain/zero/1.0/ */
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.
* 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.
* 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.
http://creativecommons.org/publicdomain/zero/1.0/ */
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";

View File

@ -1,7 +1,5 @@
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* -*- 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.
* 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.
* 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.
* 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.
* 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.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
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.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
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.
* 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.
* 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.
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.

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.
http://creativecommons.org/publicdomain/zero/1.0/ */
* http://creativecommons.org/publicdomain/zero/1.0/ */
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.
http://creativecommons.org/publicdomain/zero/1.0/ */
* http://creativecommons.org/publicdomain/zero/1.0/ */
function test() {
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.
* 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.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// 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.
* http://creativecommons.org/publicdomain/zero/1.0/ */
@ -6,7 +8,6 @@ function test() {
let {ToolSidebar} = require("devtools/client/framework/sidebar");
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'>" +
"<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>" +

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.
* http://creativecommons.org/publicdomain/zero/1.0/ */
@ -6,7 +8,6 @@ function test() {
const { ToolSidebar } = require("devtools/client/framework/sidebar");
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'>" +
"<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>" +

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.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Test that the sidebar widget auto-registers existing tabs.
@ -7,7 +10,6 @@
const {ToolSidebar} = require("devtools/client/framework/sidebar");
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'>" +
"<hbox flex='1'><description flex='1'>test tool</description>" +
"<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.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// 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/. -->
<?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/skin/common.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">
<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.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/* -*- 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.
* 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.
* 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.
* 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.
http://creativecommons.org/publicdomain/zero/1.0/ */
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Test for dynamically registering and unregistering themes
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.
http://creativecommons.org/publicdomain/zero/1.0/ */
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";

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