Merge remote-tracking branch 'origin/tracking' into custom

This commit is contained in:
roytam1 2023-12-15 10:29:04 +08:00
commit 5a362aa15b
68 changed files with 186 additions and 2246 deletions

View file

@ -457,6 +457,16 @@ pref("dom.disable_window_move_resize", false);
// prevent JS from monkeying with window focus, etc // prevent JS from monkeying with window focus, etc
pref("dom.disable_window_flip", true); pref("dom.disable_window_flip", true);
// Whether performance.GetEntries* will contain an entry for the active document
// Disabled by default in Basilisk (unlike in UXP) since it can be used for
// tracking/profiling.
pref("dom.enable_performance_navigation_timing", false);
// This pref controls whether PerformanceObserver is enabled or not.
// We enable it by default, unlike UXP and Pale Moon because several sites are
// beginning to expect this to be present.
pref("dom.enable_performance_observer", true);
// popups.policy 1=allow,2=reject // popups.policy 1=allow,2=reject
pref("privacy.popups.policy", 1); pref("privacy.popups.policy", 1);
pref("privacy.popups.usecustom", true); pref("privacy.popups.usecustom", true);

View file

@ -9,7 +9,7 @@
#define GK_SLICE Gecko/20100101 #define GK_SLICE Gecko/20100101
#define FX_SLICE Firefox/@GK_VERSION@ #define FX_SLICE Firefox/@GK_VERSION@
#define PALE_MOON_VERSION 32.0.1 #define PALE_MOON_VERSION 32.4.1
#define PALE_MOON_SLICE PaleMoon/@PALE_MOON_VERSION@ #define PALE_MOON_SLICE PaleMoon/@PALE_MOON_VERSION@
// %OS_SLICE% macro is resolved at runtime, see MoonchildProductions/UXP/issues/1473 // %OS_SLICE% macro is resolved at runtime, see MoonchildProductions/UXP/issues/1473
@ -56,7 +56,6 @@ pref("@GUAO_PREF@.firefox.com","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_D
pref("@GUAO_PREF@.mozilla.org","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@"); pref("@GUAO_PREF@.mozilla.org","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@");
pref("@GUAO_PREF@.mozilla.com","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@"); pref("@GUAO_PREF@.mozilla.com","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@");
pref("@GUAO_PREF@.github.com","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@"); pref("@GUAO_PREF@.github.com","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@");
pref("@GUAO_PREF@.spotify.com","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@");
pref("@GUAO_PREF@.twitter.com","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@"); pref("@GUAO_PREF@.twitter.com","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@");
pref("@GUAO_PREF@.zoho.com","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@"); pref("@GUAO_PREF@.zoho.com","Mozilla/5.0 (%OS_SLICE% rv:@UXP_VERSION@) @UXP_DATE_SLICE@ @APP_SLICE@");
@ -65,9 +64,8 @@ pref("@GUAO_PREF@.humblebundle.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @G
pref("@GUAO_PREF@.privat24.ua","Mozilla/5.0 (%OS_SLICE% rv:38.0) @GK_SLICE@ Firefox/38.0"); pref("@GUAO_PREF@.privat24.ua","Mozilla/5.0 (%OS_SLICE% rv:38.0) @GK_SLICE@ Firefox/38.0");
pref("@GUAO_PREF@.citi.com","Mozilla/5.0 (%OS_SLICE% rv:68.0) @GK_SLICE@ Firefox/68.0 SeaMonkey/2.53.12"); pref("@GUAO_PREF@.citi.com","Mozilla/5.0 (%OS_SLICE% rv:68.0) @GK_SLICE@ Firefox/68.0 SeaMonkey/2.53.12");
pref("@GUAO_PREF@.facebook.com","Mozilla/5.0 (%OS_SLICE% rv:68.0) @GK_SLICE@ Firefox/68.0 @APP_SLICE@"); pref("@GUAO_PREF@.facebook.com","Mozilla/5.0 (%OS_SLICE% rv:68.0) @GK_SLICE@ Firefox/68.0 @APP_SLICE@");
pref("@GUAO_PREF@.netflix.com","Mozilla/5.0 (Windows NT 6.1; rv:45.9) @GK_SLICE@ Firefox/45.9");
pref("@GUAO_PREF@.netflximg.net","Mozilla/5.0 (Windows NT 6.1; rv:45.9) @GK_SLICE@ Firefox/45.9");
pref("@GUAO_PREF@.mewe.com", "Mozilla/5.0 (%OS_SLICE% rv:102.0) Gecko/20100101 Firefox/102.0"); pref("@GUAO_PREF@.mewe.com", "Mozilla/5.0 (%OS_SLICE% rv:102.0) Gecko/20100101 Firefox/102.0");
pref("@GUAO_PREF@.spotify.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@");
// UA-sniffing domains that are "app/vendor-specific" and do not like Basilisk // UA-sniffing domains that are "app/vendor-specific" and do not like Basilisk
pref("@GUAO_PREF@.web.whatsapp.com","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"); pref("@GUAO_PREF@.web.whatsapp.com","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36");
@ -85,7 +83,7 @@ pref("@GUAO_PREF@.ldoceonline.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK
pref("@GUAO_PREF@.yuku.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@ @APP_SLICE@"); pref("@GUAO_PREF@.yuku.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@ @APP_SLICE@");
// Domains Basilisk overrides that are not in the Pale Moon overrides // Domains Basilisk overrides that are not in the Pale Moon overrides
pref("@GUAO_PREF@.slack.com","Mozilla/5.0 (%OS_SLICE% rv:100.0) @GK_SLICE@ Firefox/100.0 @APP_SLICE@"); pref("@GUAO_PREF@.slack.com","Mozilla/5.0 (%OS_SLICE% rv:120.0) @GK_SLICE@ Firefox/120.0 @APP_SLICE@");
// There are multiple addons on the Pale Moon addons site that work with Basilisk that are not listed on the Basilisk addons site. // There are multiple addons on the Pale Moon addons site that work with Basilisk that are not listed on the Basilisk addons site.
pref("@GUAO_PREF@.addons.palemoon.org","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @UXP_VERSION_SLICE@ @FX_SLICE@ @PALE_MOON_SLICE@"); pref("@GUAO_PREF@.addons.palemoon.org","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @UXP_VERSION_SLICE@ @FX_SLICE@ @PALE_MOON_SLICE@");

View file

@ -22,6 +22,16 @@
<preference id="font.language.group" <preference id="font.language.group"
name="font.language.group" name="font.language.group"
type="wstring"/> type="wstring"/>
<!-- JavaScript -->
<preference id="javascript.options.wasm"
name="javascript.options.wasm"
type="bool"/>
#ifdef MOZ_WEBRTC
<preference id="media.peerconnection.enabled"
name="media.peerconnection.enabled"
type="bool"/>
#endif
</preferences> </preferences>
<script type="application/javascript" <script type="application/javascript"
@ -187,3 +197,32 @@
accesskey="&chooseButton.accesskey;"/> accesskey="&chooseButton.accesskey;"/>
</hbox> </hbox>
</groupbox> </groupbox>
<!-- JavaScript -->
<groupbox id="javascriptGroup" data-category="paneContent" hidden="true">
<caption><label>&javascript.label;</label></caption>
<grid id="javascriptGrid">
<columns>
<column flex="1"/>
<column/>
</columns>
<rows id="javascriptRows">
<row id="javascriptRow1">
<vbox align="start">
<checkbox id="javascriptWasmPolicy"
preference="javascript.options.wasm"
label="&javascriptWasm.label;"
accesskey="&javascriptWasm.accesskey;" />
</vbox>
</row>
<row id="javascriptRow2">
<vbox align="start">
<checkbox id="javascriptWebRTCPolicy"
preference="media.peerconnection.enabled"
label="&javascriptWebrtc.label;"
accesskey="&javascriptWebrtc.accesskey;" />
</vbox>
</row>
</rows>
</grid>
</groupbox>

View file

@ -43,3 +43,12 @@
<!ENTITY playDRMContent.label "Play DRM content"> <!ENTITY playDRMContent.label "Play DRM content">
<!ENTITY playDRMContent.accesskey "P"> <!ENTITY playDRMContent.accesskey "P">
<!ENTITY playDRMContent.learnMore.label "Learn more"> <!ENTITY playDRMContent.learnMore.label "Learn more">
<!ENTITY javascript.label "JavaScript">
<!ENTITY javascriptWasm.label "Enable WebAssembly (WASM)">
<!ENTITY javascriptWasm.accesskey "y">
#ifdef MOZ_WEBRTC
<!ENTITY javascriptWebrtc.label "Enable WebRTC">
<!ENTITY javascriptWebrtc.accesskey "R">
#endif

View file

@ -57,7 +57,7 @@
locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties) locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties)
locale/browser/preferences/colors.dtd (%chrome/browser/preferences/colors.dtd) locale/browser/preferences/colors.dtd (%chrome/browser/preferences/colors.dtd)
locale/browser/preferences/cookies.dtd (%chrome/browser/preferences/cookies.dtd) locale/browser/preferences/cookies.dtd (%chrome/browser/preferences/cookies.dtd)
locale/browser/preferences/content.dtd (%chrome/browser/preferences/content.dtd) * locale/browser/preferences/content.dtd (%chrome/browser/preferences/content.dtd)
locale/browser/preferences/connection.dtd (%chrome/browser/preferences/connection.dtd) locale/browser/preferences/connection.dtd (%chrome/browser/preferences/connection.dtd)
locale/browser/preferences/applications.dtd (%chrome/browser/preferences/applications.dtd) locale/browser/preferences/applications.dtd (%chrome/browser/preferences/applications.dtd)
locale/browser/preferences/fonts.dtd (%chrome/browser/preferences/fonts.dtd) locale/browser/preferences/fonts.dtd (%chrome/browser/preferences/fonts.dtd)

View file

@ -23,10 +23,6 @@ DIRS += [
if CONFIG['MAKENSISU']: if CONFIG['MAKENSISU']:
DIRS += ['installer/windows'] DIRS += ['installer/windows']
TEST_DIRS += [
'tools/mozscreenshots',
]
DIST_SUBDIR = 'browser' DIST_SUBDIR = 'browser'
export('DIST_SUBDIR') export('DIST_SUBDIR')

View file

@ -1,15 +0,0 @@
"use strict";
module.exports = { // eslint-disable-line no-undef
"extends": [
"../../../testing/mochitest/browser.eslintrc.js"
],
"rules": {
"no-unused-vars": ["error", {
"vars": "all",
"varsIgnorePattern": "^(Cc|Ci|Cr|Cu|EXPORTED_SYMBOLS)$",
"args": "none"
}]
}
};

View file

@ -1,12 +0,0 @@
[DEFAULT]
subsuite = screenshots
support-files =
head.js
mozscreenshots/extension/lib/permissionPrompts.html
mozscreenshots/extension/lib/controlCenter/password.html
mozscreenshots/extension/lib/controlCenter/mixed.html
mozscreenshots/extension/lib/controlCenter/mixed_active.html
mozscreenshots/extension/lib/controlCenter/mixed_passive.html
mozscreenshots/extension/lib/borderify.xpi
[browser_screenshots.js]

View file

@ -1,16 +0,0 @@
/* 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";
add_task(function* capture() {
let setsEnv = env.get("MOZSCREENSHOTS_SETS");
if (!setsEnv) {
ok(true, "MOZSCREENSHOTS_SETS wasn't specified so there's nothing to capture");
return;
}
let sets = setsEnv.trim().split(",");
yield TestRunner.start(sets);
});

View file

@ -1,6 +0,0 @@
[DEFAULT]
subsuite = screenshots
support-files =
../head.js
[browser_controlCenter.js]

View file

@ -1,16 +0,0 @@
/* 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/. */
/* import-globals-from ../head.js */
"use strict";
add_task(function* capture() {
if (!shouldCapture()) {
return;
}
let sets = ["LightweightThemes", "ControlCenter"];
yield TestRunner.start(sets, "controlCenter");
});

View file

@ -1,6 +0,0 @@
[DEFAULT]
subsuite = screenshots
support-files =
../head.js
[browser_devtools.js]

View file

@ -1,16 +0,0 @@
/* 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/. */
/* import-globals-from ../head.js */
"use strict";
add_task(function* capture() {
if (!shouldCapture()) {
return;
}
let sets = ["DevTools"];
yield TestRunner.start(sets, "devtools");
});

View file

@ -1,53 +0,0 @@
/* 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/. */
/* exported TestRunner, shouldCapture */
"use strict";
const {AddonWatcher} = Cu.import("resource://gre/modules/AddonWatcher.jsm", {});
const chromeRegistry = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIChromeRegistry);
const env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
const EXTENSION_DIR = "chrome://mochitests/content/extensions/mozscreenshots/browser/";
let TestRunner;
function* setup() {
requestLongerTimeout(10);
info("installing extension temporarily");
let chromeURL = Services.io.newURI(EXTENSION_DIR, null, null);
let dir = chromeRegistry.convertChromeURL(chromeURL).QueryInterface(Ci.nsIFileURL).file;
yield AddonManager.installTemporaryAddon(dir);
info("Checking for mozscreenshots extension");
return new Promise((resolve) => {
AddonManager.getAddonByID("mozscreenshots@mozilla.org", function(aAddon) {
isnot(aAddon, null, "The mozscreenshots extension should be installed");
AddonWatcher.ignoreAddonPermanently(aAddon.id);
TestRunner = Cu.import("chrome://mozscreenshots/content/TestRunner.jsm", {}).TestRunner;
resolve();
});
});
}
function shouldCapture() {
// Try pushes only capture in browser_screenshots.js with MOZSCREENSHOTS_SETS.
if (env.get("MOZSCREENSHOTS_SETS")) {
ok(true, "MOZSCREENSHOTS_SETS was specified so only capture what was " +
"requested (in browser_screenshots.js)");
return false;
}
// Automation isn't able to schedule test jobs to only run on nightlies so we handle it here
// (see also: bug 1116275).
let capture = AppConstants.MOZ_UPDATE_CHANNEL == "nightly" ||
AppConstants.SOURCE_REVISION_URL == "";
if (!capture) {
ok(true, "Capturing is disabled for this MOZ_UPDATE_CHANNEL or REPO");
}
return capture;
}
add_task(setup);

View file

@ -1,19 +0,0 @@
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# 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/.
BROWSER_CHROME_MANIFESTS += [
# Each test is in it's own directory so it gets run in a clean profile with
# run-by-dir.
'browser.ini',
'controlCenter/browser.ini',
'devtools/browser.ini',
'permissionPrompts/browser.ini',
'preferences/browser.ini',
'primaryUI/browser.ini',
]
TEST_DIRS += [
'mozscreenshots/extension',
]

View file

@ -1,12 +0,0 @@
# 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/.
TEST_EXTENSIONS_DIR = $(DEPTH)/_tests/testing/mochitest/extensions
GENERATED_DIRS = $(TEST_EXTENSIONS_DIR)
XPI_PKGNAME = mozscreenshots@mozilla.org
include $(topsrcdir)/config/rules.mk
libs::
(cd $(DIST)/xpi-stage && tar $(TAR_CREATE_FLAGS) - $(XPI_NAME)) | (cd $(TEST_EXTENSIONS_DIR) && tar -xf -)

View file

@ -1,179 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["Screenshot"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/osfile.jsm");
// Create a new instance of the ConsoleAPI so we can control the maxLogLevel with a pref.
// See LOG_LEVELS in Console.jsm. Common examples: "All", "Info", "Warn", & "Error".
const PREF_LOG_LEVEL = "extensions.mozscreenshots@mozilla.org.loglevel";
XPCOMUtils.defineLazyGetter(this, "log", () => {
let ConsoleAPI = Cu.import("resource://gre/modules/Console.jsm", {}).ConsoleAPI;
let consoleOptions = {
maxLogLevel: "info",
maxLogLevelPref: PREF_LOG_LEVEL,
prefix: "mozscreenshots",
};
return new ConsoleAPI(consoleOptions);
});
this.Screenshot = {
_extensionPath: null,
_path: null,
_imagePrefix: "",
_imageExtension: ".png",
_screenshotFunction: null,
init(path, extensionPath, imagePrefix = "") {
this._path = path;
let dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
dir.initWithPath(this._path);
if (!dir.exists()) {
dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
}
this._extensionPath = extensionPath;
this._imagePrefix = imagePrefix;
switch (Services.appinfo.OS) {
case "WINNT":
this._screenshotFunction = this._screenshotWindows;
break;
case "Darwin":
this._screenshotFunction = this._screenshotOSX;
break;
case "Linux":
this._screenshotFunction = this._screenshotLinux;
break;
default:
throw new Error("Unsupported operating system");
}
},
_buildImagePath(baseName) {
return OS.Path.join(this._path, this._imagePrefix + baseName + this._imageExtension);
},
// Capture the whole screen using an external application.
captureExternal(filename) {
let imagePath = this._buildImagePath(filename);
return this._screenshotFunction(imagePath).then(() => {
log.debug("saved screenshot: " + filename);
});
},
// helpers
_screenshotWindows(filename) {
return new Promise((resolve, reject) => {
let exe = Services.dirsvc.get("GreBinD", Ci.nsIFile);
exe.append("screenshot.exe");
if (!exe.exists()) {
exe = Services.dirsvc.get("CurWorkD", Ci.nsIFile).parent;
exe.append("bin");
exe.append("screenshot.exe");
}
let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(exe);
let args = [filename];
process.runAsync(args, args.length, this._processObserver(resolve, reject));
});
},
_screenshotOSX: Task.async(function*(filename) {
let screencapture = (windowID = null) => {
return new Promise((resolve, reject) => {
// Get the screencapture executable
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
file.initWithPath("/usr/sbin/screencapture");
let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(file);
// Run the process.
let args = ["-x", "-t", "png"];
// Darwin version number for OS X 10.6 is 10.x
if (windowID && Services.sysinfo.getProperty("version").indexOf("10.") !== 0) {
// Capture only that window on 10.7+
args.push("-l");
args.push(windowID);
}
args.push(filename);
process.runAsync(args, args.length, this._processObserver(resolve, reject));
});
};
function readWindowID() {
let decoder = new TextDecoder();
let promise = OS.File.read("/tmp/mozscreenshots-windowid");
return promise.then(function onSuccess(array) {
return decoder.decode(array);
});
}
let promiseWindowID = () => {
return new Promise((resolve, reject) => {
// Get the window ID of the application (assuming its front-most)
let osascript = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
osascript.initWithPath("/bin/bash");
let osascriptP = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
osascriptP.init(osascript);
let osaArgs = ["-c", "/usr/bin/osascript -e 'tell application (path to frontmost application as text) to set winID to id of window 1' > /tmp/mozscreenshots-windowid"];
osascriptP.runAsync(osaArgs, osaArgs.length, this._processObserver(resolve, reject));
});
};
yield promiseWindowID();
let windowID = yield readWindowID();
yield screencapture(windowID);
}),
_screenshotLinux(filename) {
return new Promise((resolve, reject) => {
let exe = Services.dirsvc.get("GreBinD", Ci.nsIFile);
exe.append("screentopng");
if (!exe.exists()) {
exe = Services.dirsvc.get("CurWorkD", Ci.nsIFile).parent;
exe.append("bin");
exe.append("screentopng");
}
let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(exe);
let args = [filename];
process.runAsync(args, args.length, this._processObserver(resolve, reject));
});
},
_processObserver(resolve, reject) {
return {
observe(subject, topic, data) {
switch (topic) {
case "process-finished":
try {
// Wait 1s after process to resolve
setTimeout(resolve, 1000);
} catch (ex) {
reject(ex);
}
break;
default:
reject(topic);
break;
}
},
};
},
};

View file

@ -1,279 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["TestRunner"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
const env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
const APPLY_CONFIG_TIMEOUT_MS = 60 * 1000;
const HOME_PAGE = "chrome://mozscreenshots/content/lib/mozscreenshots.html";
Cu.import("resource://gre/modules/FileUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/osfile.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "BrowserTestUtils",
"resource://testing-common/BrowserTestUtils.jsm");
Cu.import("chrome://mozscreenshots/content/Screenshot.jsm");
// Create a new instance of the ConsoleAPI so we can control the maxLogLevel with a pref.
// See LOG_LEVELS in Console.jsm. Common examples: "All", "Info", "Warn", & "Error".
const PREF_LOG_LEVEL = "extensions.mozscreenshots@mozilla.org.loglevel";
XPCOMUtils.defineLazyGetter(this, "log", () => {
let ConsoleAPI = Cu.import("resource://gre/modules/Console.jsm", {}).ConsoleAPI;
let consoleOptions = {
maxLogLevel: "info",
maxLogLevelPref: PREF_LOG_LEVEL,
prefix: "mozscreenshots",
};
return new ConsoleAPI(consoleOptions);
});
this.TestRunner = {
combos: null,
completedCombos: 0,
currentComboIndex: 0,
_lastCombo: null,
_libDir: null,
init(extensionPath) {
log.debug("init");
this._extensionPath = extensionPath;
},
/**
* Load specified sets, execute all combinations of them, and capture screenshots.
*/
start: Task.async(function*(setNames, jobName = null) {
let subDirs = ["mozscreenshots",
(new Date()).toISOString().replace(/:/g, "-") + "_" + Services.appinfo.OS];
let screenshotPath = FileUtils.getFile("TmpD", subDirs).path;
const MOZ_UPLOAD_DIR = env.get("MOZ_UPLOAD_DIR");
if (MOZ_UPLOAD_DIR) {
screenshotPath = MOZ_UPLOAD_DIR;
}
log.info("Saving screenshots to:", screenshotPath);
let screenshotPrefix = Services.appinfo.appBuildID;
if (jobName) {
screenshotPrefix += "-" + jobName;
}
screenshotPrefix += "_";
Screenshot.init(screenshotPath, this._extensionPath, screenshotPrefix);
this._libDir = this._extensionPath.QueryInterface(Ci.nsIFileURL).file.clone();
this._libDir.append("chrome");
this._libDir.append("mozscreenshots");
this._libDir.append("lib");
let sets = this.loadSets(setNames);
log.info(sets.length + " sets:", setNames);
this.combos = new LazyProduct(sets);
log.info(this.combos.length + " combinations");
this.currentComboIndex = this.completedCombos = 0;
this._lastCombo = null;
// Setup some prefs
Services.prefs.setCharPref("browser.aboutHomeSnippets.updateUrl",
"data:text/html;charset=utf-8,Generated by mozscreenshots");
Services.prefs.setCharPref("extensions.ui.lastCategory", "addons://list/extension");
// Don't let the caret blink since it causes false positives for image diffs
Services.prefs.setIntPref("ui.caretBlinkTime", -1);
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let selectedBrowser = browserWindow.gBrowser.selectedBrowser;
yield BrowserTestUtils.loadURI(selectedBrowser, HOME_PAGE);
yield BrowserTestUtils.browserLoaded(selectedBrowser);
for (let i = 0; i < this.combos.length; i++) {
this.currentComboIndex = i;
yield this._performCombo(this.combos.item(this.currentComboIndex));
}
log.info("Done: Completed " + this.completedCombos + " out of " +
this.combos.length + " configurations.");
this.cleanup();
}),
/**
* Load sets of configurations from JSMs.
* @param {String[]} setNames - array of set names (e.g. ["Tabs", "WindowSize"].
* @return {Object[]} Array of sets containing `name` and `configurations` properties.
*/
loadSets(setNames) {
let sets = [];
for (let setName of setNames) {
try {
let imported = {};
Cu.import("chrome://mozscreenshots/content/configurations/" + setName + ".jsm",
imported);
imported[setName].init(this._libDir);
let configurationNames = Object.keys(imported[setName].configurations);
if (!configurationNames.length) {
throw new Error(setName + " has no configurations for this environment");
}
for (let config of configurationNames) {
// Automatically set the name property of the configuration object to
// its name from the configuration object.
imported[setName].configurations[config].name = config;
}
sets.push(imported[setName].configurations);
} catch (ex) {
log.error("Error loading set: " + setName);
log.error(ex);
throw ex;
}
}
return sets;
},
cleanup() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let gBrowser = browserWindow.gBrowser;
while (gBrowser.tabs.length > 1) {
gBrowser.removeTab(gBrowser.selectedTab, {animate: false});
}
gBrowser.unpinTab(gBrowser.selectedTab);
gBrowser.selectedBrowser.loadURI("data:text/html;charset=utf-8,<h1>Done!");
browserWindow.restore();
},
// helpers
_performCombo: function*(combo) {
let paddedComboIndex = padLeft(this.currentComboIndex + 1, String(this.combos.length).length);
log.info("Combination " + paddedComboIndex + "/" + this.combos.length + ": " +
this._comboName(combo).substring(1));
function changeConfig(config) {
log.debug("calling " + config.name);
let applyPromise = Promise.resolve(config.applyConfig());
let timeoutPromise = new Promise((resolve, reject) => {
setTimeout(reject, APPLY_CONFIG_TIMEOUT_MS, "Timed out");
});
log.debug("called " + config.name);
// Add a default timeout of 500ms to avoid conflicts when configurations
// try to apply at the same time. e.g WindowSize and TabsInTitlebar
return Promise.race([applyPromise, timeoutPromise]).then(() => {
return new Promise((resolve) => {
setTimeout(resolve, 500);
});
});
}
try {
// First go through and actually apply all of the configs
for (let i = 0; i < combo.length; i++) {
let config = combo[i];
if (!this._lastCombo || config !== this._lastCombo[i]) {
log.debug("promising", config.name);
yield changeConfig(config);
}
}
// Update the lastCombo since it's now been applied regardless of whether it's accepted below.
log.debug("fulfilled all applyConfig so setting lastCombo.");
this._lastCombo = combo;
// Then ask configs if the current setup is valid. We can't can do this in
// the applyConfig methods of the config since it doesn't know what configs
// later in the loop will do that may invalidate the combo.
for (let i = 0; i < combo.length; i++) {
let config = combo[i];
// A configuration can specify an optional verifyConfig method to indicate
// if the current config is valid for a screenshot. This gets called even
// if the this config was used in the lastCombo since another config may
// have invalidated it.
if (config.verifyConfig) {
log.debug("checking if the combo is valid with", config.name);
yield config.verifyConfig();
}
}
} catch (ex) {
log.warn("\tskipped configuration: " + ex);
// Don't set lastCombo here so that we properly know which configurations
// need to be applied since the last screenshot
// Return so we don't take a screenshot.
return;
}
yield this._onConfigurationReady(combo);
},
_onConfigurationReady(combo) {
let delayedScreenshot = () => {
let filename = padLeft(this.currentComboIndex + 1,
String(this.combos.length).length) + this._comboName(combo);
return Screenshot.captureExternal(filename)
.then(() => {
this.completedCombos++;
});
};
log.debug("_onConfigurationReady");
return Task.spawn(delayedScreenshot);
},
_comboName(combo) {
return combo.reduce(function(a, b) {
return a + "_" + b.name;
}, "");
},
};
/**
* Helper to lazily compute the Cartesian product of all of the sets of configurations.
**/
function LazyProduct(sets) {
/**
* An entry for each set with the value being:
* [the number of permutations of the sets with lower index,
* the number of items in the set at the index]
*/
this.sets = sets;
this.lookupTable = [];
let combinations = 1;
for (let i = this.sets.length - 1; i >= 0; i--) {
let set = this.sets[i];
let setLength = Object.keys(set).length;
this.lookupTable[i] = [combinations, setLength];
combinations *= setLength;
}
}
LazyProduct.prototype = {
get length() {
let last = this.lookupTable[0];
if (!last)
return 0;
return last[0] * last[1];
},
item(n) {
// For set i, get the item from the set with the floored value of
// (n / the number of permutations of the sets already chosen from) modulo the length of set i
let result = [];
for (let i = this.sets.length - 1; i >= 0; i--) {
let priorCombinations = this.lookupTable[i][0];
let setLength = this.lookupTable[i][1];
let keyIndex = Math.floor(n / priorCombinations) % setLength;
let keys = Object.keys(this.sets[i]);
result[i] = this.sets[i][keys[keyIndex]];
}
return result;
},
};
function padLeft(number, width, padding = "0") {
return padding.repeat(Math.max(0, width - String(number).length)) + number;
}

View file

@ -1,65 +0,0 @@
/* 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/. */
/*
#if 0
Workaround a build system bug where this file doesn't get packaged if not pre-processed.
#endif
*/
/* exported install, uninstall, startup, shutdown */
"use strict";
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/AddonManager.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "TestRunner",
"chrome://mozscreenshots/content/TestRunner.jsm");
function install(data, reason) {
if (!isAppSupported()) {
uninstallExtension(data);
return;
}
AddonManager.getAddonByID(data.id, function(addon) {
// Enable on install in case the user disabled a prior version
if (addon) {
addon.userDisabled = false;
}
});
}
function startup(data, reason) {
if (!isAppSupported()) {
uninstallExtension(data);
return;
}
AddonManager.getAddonByID(data.id, function(addon) {
let extensionPath = addon.getResourceURI();
TestRunner.init(extensionPath);
});
}
function shutdown(data, reason) { }
function uninstall(data, reason) { }
/**
* @return boolean whether the test suite applies to the application.
*/
function isAppSupported() {
return true;
}
function uninstallExtension(data) {
AddonManager.getAddonByID(data.id, function(addon) {
addon.uninstall();
});
}

View file

@ -1,84 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["AppMenu"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
this.AppMenu = {
init(libDir) {},
configurations: {
appMenuClosed: {
applyConfig: Task.async(function*() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
browserWindow.PanelUI.hide();
}),
},
appMenuMainView: {
applyConfig() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let promise = browserWindow.PanelUI.show();
browserWindow.PanelUI.showMainView();
return promise;
},
},
appMenuHistorySubview: {
applyConfig() {
// History has a footer
if (isCustomizing()) {
return Promise.reject("Can't show subviews while customizing");
}
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let promise = browserWindow.PanelUI.show();
return promise.then(() => {
browserWindow.PanelUI.showMainView();
browserWindow.document.getElementById("history-panelmenu").click();
});
},
verifyConfig: verifyConfigHelper,
},
appMenuHelpSubview: {
applyConfig() {
if (isCustomizing()) {
return Promise.reject("Can't show subviews while customizing");
}
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let promise = browserWindow.PanelUI.show();
return promise.then(() => {
browserWindow.PanelUI.showMainView();
browserWindow.document.getElementById("PanelUI-help").click();
});
},
verifyConfig: verifyConfigHelper,
},
},
};
function verifyConfigHelper() {
if (isCustomizing()) {
return Promise.reject("AppMenu verifyConfigHelper");
}
return Promise.resolve("AppMenu verifyConfigHelper");
}
function isCustomizing() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
if (browserWindow.document.documentElement.hasAttribute("customizing")) {
return true;
}
return false;
}

View file

@ -1,85 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["Buttons"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource:///modules/CustomizableUI.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
this.Buttons = {
init(libDir) {
createWidget();
},
configurations: {
navBarButtons: {
applyConfig: Task.async(() => {
CustomizableUI.addWidgetToArea("screenshot-widget", CustomizableUI.AREA_NAVBAR);
}),
},
tabsToolbarButtons: {
applyConfig: Task.async(() => {
CustomizableUI.addWidgetToArea("screenshot-widget", CustomizableUI.AREA_TABSTRIP);
}),
},
menuPanelButtons: {
applyConfig: Task.async(() => {
CustomizableUI.addWidgetToArea("screenshot-widget", CustomizableUI.AREA_PANEL);
}),
verifyConfig() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
if (browserWindow.PanelUI.panel.state == "closed") {
return Promise.reject("The button isn't shown when the panel isn't open.");
}
return Promise.resolve("menuPanelButtons.verifyConfig");
},
},
custPaletteButtons: {
applyConfig: Task.async(() => {
CustomizableUI.removeWidgetFromArea("screenshot-widget");
}),
verifyConfig() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
if (browserWindow.document.documentElement.getAttribute("customizing") != "true") {
return Promise.reject("The button isn't shown when we're not in customize mode.");
}
return Promise.resolve("custPaletteButtons.verifyConfig");
},
},
},
};
function createWidget() {
let id = "screenshot-widget";
let spec = {
id: id,
label: "My Button",
removable: true,
tooltiptext: "",
type: "button",
};
CustomizableUI.createWidget(spec);
// Append a <style> for the image
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let st = browserWindow.document.createElementNS("http://www.w3.org/1999/xhtml", "style");
let styles = "" +
"#screenshot-widget > .toolbarbutton-icon {" +
" list-style-image: url(chrome://browser/skin/Toolbar.png);" +
" -moz-image-region: rect(0px, 18px, 18px, 0px);" +
"}";
st.appendChild(browserWindow.document.createTextNode(styles));
browserWindow.document.documentElement.appendChild(st);
}

View file

@ -1,207 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["ControlCenter"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
Cu.import("resource://testing-common/BrowserTestUtils.jsm");
Cu.import("resource:///modules/SitePermissions.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm");
let {UrlClassifierTestUtils} = Cu.import("resource://testing-common/UrlClassifierTestUtils.jsm", {});
const RESOURCE_PATH = "extensions/mozscreenshots/browser/chrome/mozscreenshots/lib/controlCenter";
const HTTP_PAGE = "http://example.com/";
const HTTPS_PAGE = "https://example.com/";
const PERMISSIONS_PAGE = "https://test1.example.com/";
const HTTP_PASSWORD_PAGE = `http://test2.example.org/${RESOURCE_PATH}/password.html`;
const MIXED_CONTENT_URL = `https://example.com/${RESOURCE_PATH}/mixed.html`;
const MIXED_ACTIVE_CONTENT_URL = `https://example.com/${RESOURCE_PATH}/mixed_active.html`;
const MIXED_PASSIVE_CONTENT_URL = `https://example.com/${RESOURCE_PATH}/mixed_passive.html`;
const TRACKING_PAGE = `http://tracking.example.org/${RESOURCE_PATH}/tracking.html`;
this.ControlCenter = {
init(libDir) { },
configurations: {
about: {
applyConfig: Task.async(function* () {
yield loadPage("about:home");
yield openIdentityPopup();
}),
},
localFile: {
applyConfig: Task.async(function* () {
let channel = NetUtil.newChannel({
uri: "chrome://mozscreenshots/content/lib/mozscreenshots.html",
loadUsingSystemPrincipal: true
});
channel = channel.QueryInterface(Ci.nsIFileChannel);
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let gBrowser = browserWindow.gBrowser;
BrowserTestUtils.loadURI(gBrowser.selectedBrowser, channel.file.path);
yield BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
yield openIdentityPopup();
}),
},
http: {
applyConfig: Task.async(function* () {
yield loadPage(HTTP_PAGE);
yield openIdentityPopup();
}),
},
httpSubView: {
applyConfig: Task.async(function* () {
yield loadPage(HTTP_PAGE);
yield openIdentityPopup(true);
}),
},
https: {
applyConfig: Task.async(function* () {
yield loadPage(HTTPS_PAGE);
yield openIdentityPopup();
}),
},
httpsSubView: {
applyConfig: Task.async(function* () {
yield loadPage(HTTPS_PAGE);
yield openIdentityPopup(true);
}),
},
singlePermission: {
applyConfig: Task.async(function* () {
let uri = Services.io.newURI(PERMISSIONS_PAGE, null, null)
SitePermissions.set(uri, "camera", SitePermissions.ALLOW);
yield loadPage(PERMISSIONS_PAGE);
yield openIdentityPopup();
}),
},
allPermissions: {
applyConfig: Task.async(function* () {
// there are 3 possible non-default permission states, so we alternate between them
let states = [SitePermissions.ALLOW, SitePermissions.BLOCK, SitePermissions.SESSION];
let uri = Services.io.newURI(PERMISSIONS_PAGE, null, null)
SitePermissions.listPermissions().forEach(function (permission, index) {
SitePermissions.set(uri, permission, states[index % 3]);
});
yield loadPage(PERMISSIONS_PAGE);
yield openIdentityPopup();
}),
},
mixed: {
applyConfig: Task.async(function* () {
yield loadPage(MIXED_CONTENT_URL);
yield openIdentityPopup();
}),
},
mixedSubView: {
applyConfig: Task.async(function* () {
yield loadPage(MIXED_CONTENT_URL);
yield openIdentityPopup(true);
}),
},
mixedPassive: {
applyConfig: Task.async(function* () {
yield loadPage(MIXED_PASSIVE_CONTENT_URL);
yield openIdentityPopup();
}),
},
mixedPassiveSubView: {
applyConfig: Task.async(function* () {
yield loadPage(MIXED_PASSIVE_CONTENT_URL);
yield openIdentityPopup(true);
}),
},
mixedActive: {
applyConfig: Task.async(function* () {
yield loadPage(MIXED_ACTIVE_CONTENT_URL);
yield openIdentityPopup();
}),
},
mixedActiveSubView: {
applyConfig: Task.async(function* () {
yield loadPage(MIXED_ACTIVE_CONTENT_URL);
yield openIdentityPopup(true);
}),
},
mixedActiveUnblocked: {
applyConfig: Task.async(function* () {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let gBrowser = browserWindow.gBrowser;
yield loadPage(MIXED_ACTIVE_CONTENT_URL);
gBrowser.ownerGlobal.gIdentityHandler.disableMixedContentProtection();
yield BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, MIXED_ACTIVE_CONTENT_URL);
yield openIdentityPopup();
}),
},
mixedActiveUnblockedSubView: {
applyConfig: Task.async(function* () {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let gBrowser = browserWindow.gBrowser;
yield loadPage(MIXED_ACTIVE_CONTENT_URL);
gBrowser.ownerGlobal.gIdentityHandler.disableMixedContentProtection();
yield BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, MIXED_ACTIVE_CONTENT_URL);
yield openIdentityPopup(true);
}),
},
httpPassword: {
applyConfig: Task.async(function* () {
yield loadPage(HTTP_PASSWORD_PAGE);
yield openIdentityPopup();
}),
},
httpPasswordSubView: {
applyConfig: Task.async(function* () {
yield loadPage(HTTP_PASSWORD_PAGE);
yield openIdentityPopup(true);
}),
},
},
};
function* loadPage(url) {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let gBrowser = browserWindow.gBrowser;
BrowserTestUtils.loadURI(gBrowser.selectedBrowser, url);
yield BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, url);
}
function* openIdentityPopup(expand) {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let gBrowser = browserWindow.gBrowser;
let { gIdentityHandler } = gBrowser.ownerGlobal;
gIdentityHandler._identityPopup.hidePopup();
gIdentityHandler._identityBox.querySelector("#identity-icon").click();
if (expand) {
// give some time for opening to avoid weird style issues
yield new Promise((c) => setTimeout(c, 500));
gIdentityHandler._identityPopup.querySelector("#identity-popup-security-expander").click();
}
}

View file

@ -1,61 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["CustomizeMode"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
this.CustomizeMode = {
init(libDir) {},
configurations: {
notCustomizing: {
applyConfig() {
return new Promise((resolve) => {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
if (!browserWindow.document.documentElement.hasAttribute("customizing")) {
resolve("notCustomizing: already not customizing");
return;
}
function onCustomizationEnds() {
browserWindow.gNavToolbox.removeEventListener("aftercustomization",
onCustomizationEnds);
// Wait for final changes
setTimeout(() => resolve("notCustomizing: onCustomizationEnds"), 500);
}
browserWindow.gNavToolbox.addEventListener("aftercustomization",
onCustomizationEnds);
browserWindow.gCustomizeMode.exit();
});
},
},
customizing: {
applyConfig() {
return new Promise((resolve) => {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
if (browserWindow.document.documentElement.hasAttribute("customizing")) {
resolve("customizing: already customizing");
return;
}
function onCustomizing() {
browserWindow.gNavToolbox.removeEventListener("customizationready",
onCustomizing);
// Wait for final changes
setTimeout(() => resolve("customizing: onCustomizing"), 500);
}
browserWindow.gNavToolbox.addEventListener("customizationready",
onCustomizing);
browserWindow.gCustomizeMode.enter();
});
},
},
},
};

View file

@ -1,59 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["DevTools"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://devtools/client/framework/gDevTools.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
let { devtools } = Cu.import("resource://devtools/shared/Loader.jsm", {});
let TargetFactory = devtools.TargetFactory;
function getTargetForSelectedTab() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let target = TargetFactory.forTab(browserWindow.gBrowser.selectedTab);
return target;
}
this.DevTools = {
init(libDir) {
let panels = ["options", "webconsole", "jsdebugger", "styleeditor",
"performance", "netmonitor"];
panels.forEach(panel => {
this.configurations[panel] = {};
this.configurations[panel].applyConfig = Task.async(function* () {
yield gDevTools.showToolbox(getTargetForSelectedTab(), panel, "bottom");
yield new Promise(resolve => setTimeout(resolve, 500));
});
});
},
configurations: {
bottomToolbox: {
applyConfig: Task.async(function* () {
yield gDevTools.showToolbox(getTargetForSelectedTab(), "inspector", "bottom");
yield new Promise(resolve => setTimeout(resolve, 1000));
}),
},
sideToolbox: {
applyConfig: Task.async(function* () {
yield gDevTools.showToolbox(getTargetForSelectedTab(), "inspector", "side");
yield new Promise(resolve => setTimeout(resolve, 500));
}),
},
undockedToolbox: {
applyConfig: Task.async(function* () {
yield gDevTools.showToolbox(getTargetForSelectedTab(), "inspector", "window");
yield new Promise(resolve => setTimeout(resolve, 500));
}),
}
},
};

View file

@ -1,92 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["LightweightThemes"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/LightweightThemeManager.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
this.LightweightThemes = {
init(libDir) {
// convert -size 3000x200 canvas:#333 black_theme.png
let blackImage = libDir.clone();
blackImage.append("black_theme.png");
this._blackImageURL = Services.io.newFileURI(blackImage).spec;
// convert -size 3000x200 canvas:#eee white_theme.png
let whiteImage = libDir.clone();
whiteImage.append("white_theme.png");
this._whiteImageURL = Services.io.newFileURI(whiteImage).spec;
},
configurations: {
noLWT: {
applyConfig: Task.async(function*() {
LightweightThemeManager.currentTheme = null;
}),
},
darkLWT: {
applyConfig() {
LightweightThemeManager.setLocalTheme({
id: "black",
name: "black",
headerURL: LightweightThemes._blackImageURL,
footerURL: LightweightThemes._blackImageURL,
textcolor: "#eeeeee",
accentcolor: "#111111",
});
// Wait for LWT listener
return new Promise(resolve => {
setTimeout(() => {
resolve("darkLWT");
}, 500);
});
},
verifyConfig: verifyConfigHelper,
},
lightLWT: {
applyConfig() {
LightweightThemeManager.setLocalTheme({
id: "white",
name: "white",
headerURL: LightweightThemes._whiteImageURL,
footerURL: LightweightThemes._whiteImageURL,
textcolor: "#111111",
accentcolor: "#eeeeee",
});
// Wait for LWT listener
return new Promise(resolve => {
setTimeout(() => {
resolve("lightLWT");
}, 500);
});
},
verifyConfig: verifyConfigHelper,
},
},
};
function verifyConfigHelper() {
return new Promise((resolve, reject) => {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
if (browserWindow.document.documentElement.hasAttribute("lwtheme")) {
resolve("verifyConfigHelper");
} else {
reject("The @lwtheme attribute wasn't present so themes may not be available");
}
});
}

View file

@ -1,130 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["PermissionPrompts"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource:///modules/E10SUtils.jsm");
Cu.import("resource://testing-common/ContentTask.jsm");
Cu.import("resource://testing-common/BrowserTestUtils.jsm");
const URL = "https://test1.example.com/extensions/mozscreenshots/browser/chrome/mozscreenshots/lib/permissionPrompts.html";
let lastTab = null;
this.PermissionPrompts = {
init(libDir) {
Services.prefs.setBoolPref("media.navigator.permission.fake", true);
Services.prefs.setBoolPref("media.getusermedia.screensharing.allow_on_old_platforms", true);
Services.prefs.setCharPref("media.getusermedia.screensharing.allowed_domains",
"test1.example.com");
Services.prefs.setBoolPref("extensions.install.requireBuiltInCerts", false);
},
configurations: {
shareDevices: {
applyConfig: Task.async(function*() {
yield closeLastTab();
yield clickOn("#webRTC-shareDevices");
}),
},
shareMicrophone: {
applyConfig: Task.async(function*() {
yield closeLastTab();
yield clickOn("#webRTC-shareMicrophone");
}),
},
shareVideoAndMicrophone: {
applyConfig: Task.async(function*() {
yield closeLastTab();
yield clickOn("#webRTC-shareDevices2");
}),
},
shareScreen: {
applyConfig: Task.async(function*() {
yield closeLastTab();
yield clickOn("#webRTC-shareScreen");
}),
},
geo: {
applyConfig: Task.async(function*() {
yield closeLastTab();
yield clickOn("#geo");
}),
},
loginCapture: {
applyConfig: Task.async(function*() {
yield closeLastTab();
yield clickOn("#login-capture", URL);
}),
},
notifications: {
applyConfig: Task.async(function*() {
yield closeLastTab();
yield clickOn("#web-notifications", URL);
}),
},
addons: {
applyConfig: Task.async(function*() {
Services.prefs.setBoolPref("xpinstall.whitelist.required", true);
yield closeLastTab();
yield clickOn("#addons", URL);
}),
},
addonsNoWhitelist: {
applyConfig: Task.async(function*() {
Services.prefs.setBoolPref("xpinstall.whitelist.required", false);
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let notification = browserWindow.document.getElementById("addon-install-confirmation-notification");
yield closeLastTab();
yield clickOn("#addons", URL);
// We want to skip the progress-notification, so we wait for
// the install-confirmation screen to be "not hidden" = shown.
yield BrowserTestUtils.waitForCondition(() => !notification.hasAttribute("hidden"),
"addon install confirmation did not show", 200);
}),
},
},
};
function* closeLastTab(selector) {
if (!lastTab) {
return;
}
yield BrowserTestUtils.removeTab(lastTab);
lastTab = null;
}
function* clickOn(selector) {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
// Save the tab so we can close it later.
lastTab = yield BrowserTestUtils.openNewForegroundTab(browserWindow.gBrowser, URL);
yield ContentTask.spawn(lastTab.linkedBrowser, selector, function* (arg) {
E10SUtils.wrapHandlingUserInput(content, true, function() {
let element = content.document.querySelector(arg);
element.click();
});
});
// Wait for the popup to actually be shown before making the screenshot
yield BrowserTestUtils.waitForEvent(browserWindow.PopupNotifications.panel, "popupshown");
}

View file

@ -1,120 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["Preferences"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://testing-common/TestUtils.jsm");
Cu.import("resource://testing-common/ContentTask.jsm");
this.Preferences = {
init(libDir) {
let panes = [
["paneGeneral", null],
["paneSearch", null],
["paneContent", null],
["paneApplications", null],
["panePrivacy", null],
["panePrivacy", null, clearRecentHistoryDialog],
["paneSecurity", null],
["paneSync", null],
["paneAdvanced", "generalTab"],
["paneAdvanced", "dataChoicesTab"],
["paneAdvanced", "networkTab"],
["paneAdvanced", "networkTab", connectionDialog],
["paneAdvanced", "updateTab"],
["paneAdvanced", "encryptionTab"],
["paneAdvanced", "encryptionTab", certManager],
["paneAdvanced", "encryptionTab", deviceManager],
];
for (let [primary, advanced, customFn] of panes) {
let configName = primary.replace(/^pane/, "prefs") + (advanced ? "-" + advanced : "");
if (customFn) {
configName += "-" + customFn.name;
}
this.configurations[configName] = {};
this.configurations[configName].applyConfig = prefHelper.bind(null, primary, advanced, customFn);
}
},
configurations: {},
};
let prefHelper = Task.async(function*(primary, advanced = null, customFn = null) {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let selectedBrowser = browserWindow.gBrowser.selectedBrowser;
// close any dialog that might still be open
yield ContentTask.spawn(selectedBrowser, null, function*() {
if (!content.window.gSubDialog) {
return;
}
content.window.gSubDialog.close();
});
let readyPromise = null;
if (selectedBrowser.currentURI.specIgnoringRef == "about:preferences") {
if (selectedBrowser.currentURI.spec == "about:preferences#" + primary.replace(/^pane/, "")) {
// We're already on the correct pane.
readyPromise = Promise.resolve();
} else {
readyPromise = paintPromise(browserWindow);
}
} else {
readyPromise = TestUtils.topicObserved("advanced-pane-loaded");
}
if (primary == "paneAdvanced") {
browserWindow.openAdvancedPreferences(advanced);
} else {
browserWindow.openPreferences(primary);
}
yield readyPromise;
if (customFn) {
let customPaintPromise = paintPromise(browserWindow);
yield* customFn(selectedBrowser);
yield customPaintPromise;
}
});
function paintPromise(browserWindow) {
return new Promise((resolve) => {
browserWindow.addEventListener("MozAfterPaint", function onPaint() {
browserWindow.removeEventListener("MozAfterPaint", onPaint);
resolve();
});
});
}
function* connectionDialog(aBrowser) {
yield ContentTask.spawn(aBrowser, null, function* () {
content.document.getElementById("connectionSettings").click();
});
}
function* clearRecentHistoryDialog(aBrowser) {
yield ContentTask.spawn(aBrowser, null, function* () {
content.document.getElementById("historyRememberClear").click();
});
}
function* certManager(aBrowser) {
yield ContentTask.spawn(aBrowser, null, function* () {
content.document.getElementById("viewCertificatesButton").click();
});
}
function* deviceManager(aBrowser) {
yield ContentTask.spawn(aBrowser, null, function* () {
content.document.getElementById("viewSecurityDevicesButton").click();
});
}

View file

@ -1,152 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["Tabs"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
const CUST_TAB = "chrome://browser/skin/customizableui/customizeFavicon.ico";
const PREFS_TAB = "chrome://browser/skin/preferences/in-content/favicon.ico";
const DEFAULT_FAVICON_TAB = `data:text/html,<meta charset="utf-8">
<title>No favicon</title>`;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
this.Tabs = {
init(libDir) {},
configurations: {
fiveTabs: {
applyConfig: Task.async(function*() {
fiveTabsHelper();
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
hoverTab(browserWindow.gBrowser.tabs[3]);
yield new Promise((resolve, reject) => {
setTimeout(resolve, 3000);
});
}),
},
fourPinned: {
applyConfig: Task.async(function*() {
fiveTabsHelper();
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let tab = browserWindow.gBrowser.addTab(PREFS_TAB);
browserWindow.gBrowser.pinTab(tab);
tab = browserWindow.gBrowser.addTab(CUST_TAB);
browserWindow.gBrowser.pinTab(tab);
tab = browserWindow.gBrowser.addTab("about:privatebrowsing");
browserWindow.gBrowser.pinTab(tab);
tab = browserWindow.gBrowser.addTab("about:home");
browserWindow.gBrowser.pinTab(tab);
browserWindow.gBrowser.selectTabAtIndex(5);
hoverTab(browserWindow.gBrowser.tabs[2]);
// also hover the new tab button
let newTabButton = browserWindow.document.getAnonymousElementByAttribute(browserWindow.
gBrowser.tabContainer, "class", "tabs-newtab-button");
hoverTab(newTabButton);
browserWindow.gBrowser.tabs[browserWindow.gBrowser.tabs.length - 1].
setAttribute("beforehovered", true);
yield new Promise((resolve, reject) => {
setTimeout(resolve, 3000);
});
}),
},
twoPinnedWithOverflow: {
applyConfig: Task.async(function*() {
fiveTabsHelper();
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
browserWindow.gBrowser.loadTabs([
PREFS_TAB,
CUST_TAB,
"about:home",
DEFAULT_FAVICON_TAB,
"about:newtab",
"about:addons",
"about:home",
DEFAULT_FAVICON_TAB,
"about:newtab",
"about:addons",
"about:home",
DEFAULT_FAVICON_TAB,
"about:newtab",
"about:addons",
"about:home",
DEFAULT_FAVICON_TAB,
"about:newtab",
"about:addons",
"about:home",
DEFAULT_FAVICON_TAB,
"about:newtab",
"about:addons",
"about:home",
DEFAULT_FAVICON_TAB,
"about:newtab",
"about:addons",
"about:home",
DEFAULT_FAVICON_TAB,
"about:newtab",
], true, true);
browserWindow.gBrowser.pinTab(browserWindow.gBrowser.tabs[1]);
browserWindow.gBrowser.pinTab(browserWindow.gBrowser.tabs[2]);
browserWindow.gBrowser.selectTabAtIndex(3);
hoverTab(browserWindow.gBrowser.tabs[5]);
yield new Promise((resolve, reject) => {
setTimeout(resolve, 3000);
});
}),
},
},
};
/* helpers */
function fiveTabsHelper() {
// some with no favicon and some with. Selected tab in middle.
closeAllButOneTab("about:addons");
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
browserWindow.gBrowser.loadTabs([
"about:addons",
"about:home",
DEFAULT_FAVICON_TAB,
"about:newtab",
CUST_TAB,
], true, true);
browserWindow.gBrowser.selectTabAtIndex(1);
}
function closeAllButOneTab(url = "about:blank") {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let gBrowser = browserWindow.gBrowser;
// Close all tabs except the last so we don't quit the browser.
while (gBrowser.tabs.length > 1)
gBrowser.removeTab(gBrowser.selectedTab, {animate: false});
gBrowser.selectedBrowser.loadURI(url);
if (gBrowser.selectedTab.pinned)
gBrowser.unpinTab(gBrowser.selectedTab);
let newTabButton = browserWindow.document.getAnonymousElementByAttribute(browserWindow.gBrowser.tabContainer, "class", "tabs-newtab-button");
hoverTab(newTabButton, false);
}
function hoverTab(tab, hover = true) {
const inIDOMUtils = Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
if (hover) {
inIDOMUtils.addPseudoClassLock(tab, ":hover");
} else {
inIDOMUtils.clearPseudoClassLocks(tab);
}
// XXX TODO: this isn't necessarily testing what we ship
if (tab.nextElementSibling)
tab.nextElementSibling.setAttribute("afterhovered", hover || null);
if (tab.previousElementSibling)
tab.previousElementSibling.setAttribute("beforehovered", hover || null);
}

View file

@ -1,38 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["TabsInTitlebar"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
const PREF_TABS_IN_TITLEBAR = "browser.tabs.drawInTitlebar";
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
this.TabsInTitlebar = {
init(libDir) {},
configurations: {
tabsInTitlebar: {
applyConfig: Task.async(function*() {
if (Services.appinfo.OS == "Linux") {
return Promise.reject("TabsInTitlebar isn't supported on Linux");
}
Services.prefs.setBoolPref(PREF_TABS_IN_TITLEBAR, true);
return undefined;
}),
},
tabsOutsideTitlebar: {
applyConfig: Task.async(function*() {
Services.prefs.setBoolPref(PREF_TABS_IN_TITLEBAR, false);
}),
},
},
};

View file

@ -1,57 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["Toolbars"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
this.Toolbars = {
init(libDir) {},
configurations: {
onlyNavBar: {
applyConfig: Task.async(function*() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let personalToolbar = browserWindow.document.getElementById("PersonalToolbar");
browserWindow.setToolbarVisibility(personalToolbar, false);
toggleMenubarIfNecessary(false);
}),
},
allToolbars: {
applyConfig: Task.async(function*() { // Boookmarks and menubar
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
let personalToolbar = browserWindow.document.getElementById("PersonalToolbar");
browserWindow.setToolbarVisibility(personalToolbar, true);
toggleMenubarIfNecessary(true);
}),
verifyConfig: Task.async(function*() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
if (browserWindow.fullScreen) {
return Promise.reject("The bookmark toolbar and menubar are not shown in fullscreen.");
}
return undefined;
}),
},
},
};
// helpers
function toggleMenubarIfNecessary(visible) {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
// The menubar is not shown on OS X or while in fullScreen
if (Services.appinfo.OS != "Darwin" /* && !browserWindow.fullScreen*/) {
let menubar = browserWindow.document.getElementById("toolbar-menubar");
browserWindow.setToolbarVisibility(menubar, visible);
}
}

View file

@ -1,68 +0,0 @@
/* 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";
this.EXPORTED_SYMBOLS = ["WindowSize"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
Cu.import("resource://testing-common/BrowserTestUtils.jsm");
this.WindowSize = {
init(libDir) {
Services.prefs.setBoolPref("browser.fullscreen.autohide", false);
},
configurations: {
maximized: {
applyConfig: Task.async(function*() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
yield toggleFullScreen(browserWindow, false);
// Wait for the Lion fullscreen transition to end as there doesn't seem to be an event
// and trying to maximize while still leaving fullscreen doesn't work.
yield new Promise((resolve, reject) => {
setTimeout(function waitToLeaveFS() {
browserWindow.maximize();
resolve();
}, 5000);
});
}),
},
normal: {
applyConfig: Task.async(function*() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
yield toggleFullScreen(browserWindow, false);
browserWindow.restore();
yield new Promise((resolve, reject) => {
setTimeout(resolve, 5000);
});
}),
},
fullScreen: {
applyConfig: Task.async(function*() {
let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
yield toggleFullScreen(browserWindow, true);
// OS X Lion fullscreen transition takes a while
yield new Promise((resolve, reject) => {
setTimeout(resolve, 5000);
});
}),
},
},
};
function toggleFullScreen(browserWindow, wantsFS) {
browserWindow.fullScreen = wantsFS;
return BrowserTestUtils.waitForCondition(() => {
return wantsFS == browserWindow.document.documentElement.hasAttribute("inFullscreen");
}, "waiting for @inFullscreen change");
}

View file

@ -1,33 +0,0 @@
<?xml version="1.0"?>
<!-- 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/. -->
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>mozscreenshots@mozilla.org</em:id>
#expand <em:version>__MOZILLA_VERSION_U__</em:version>
<em:bootstrap>true</em:bootstrap>
<!-- for running custom screenshot binaries -->
<em:unpack>true</em:unpack>
<!-- Front End MetaData -->
<em:name>mozscreenshots</em:name>
<em:description>Take screenshots of Mozilla applications in various UI configurations.</em:description>
<em:creator>Mozilla</em:creator>
<em:targetApplication>
<Description>
<!-- Firefox -->
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
#expand <em:minVersion>__MOZILLA_VERSION_U__</em:minVersion>
<em:maxVersion>*</em:maxVersion>
</Description>
</em:targetApplication>
</Description>
</RDF>

View file

@ -1,6 +0,0 @@
mozscreenshots.jar:
% content mozscreenshots chrome/mozscreenshots/
Screenshot.jsm
TestRunner.jsm
configurations/ (configurations/*.jsm)
lib/ (lib/*)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 977 B

View file

@ -1,11 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf8">
<title>Mixed Content test</title>
</head>
<body>
<iframe style="visibility:hidden" src="http://example.com"></iframe>
<img style="visibility:hidden" src="http://example.com/tests/image/test/mochitest/blue.png"></img>
</body>
</html>

View file

@ -1,10 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf8">
<title>Mixed Active Content test</title>
</head>
<body>
<iframe style="visibility:hidden" src="http://example.com"></iframe>
</body>
</html>

View file

@ -1,10 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf8">
<title>Mixed Passive Content test</title>
</head>
<body>
<img style="visibility:hidden" src="http://example.com/tests/image/test/mochitest/blue.png"></img>
</body>
</html>

View file

@ -1,13 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf8">
<title>HTTP Password test</title>
</head>
<body>
<form>
<input type="password" />
<button type="submit">Submit</button>
</form>
</body>
</html>

View file

@ -1,10 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf8">
<title>Tracking test</title>
</head>
<body>
<iframe style="visibility:hidden" src="http://tracking.example.com/"></iframe>
</body>
</html>

View file

@ -1,13 +0,0 @@
/* 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/. */
console.log(document, document.body);
console.assert(false, "Failing mozscreenshots assertion");
console.group("Grouped Message");
console.log("group message 1");
console.groupEnd("Grouped Message");
console.count("counter");
console.count("counter");

View file

@ -1,28 +0,0 @@
/* 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/. */
body {
--background-color: #f3f3f3;
background: tomato;
}
body {
background: var(--background-color);
color: #222;
padding: 0 10px;
margin: 0;
}
header {
background: #eee;
border-bottom: solid 2px #ccc;
margin: 0 -10px;
margin-bottom: 5px;
padding: 4px;
}
header h1 {
margin: 0;
padding: 0;
}

View file

@ -1,36 +0,0 @@
<!DOCTYPE html>
<!-- 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/. -->
<html>
<head>
<meta charset="UTF-8">
<title>mozscreenshots</title>
<link rel="stylesheet" href="mozscreenshots-style.css" />
<script>console.info("This page was generated by mozscreenshots");</script>
</head>
<body>
<header><h1>mozscreenshots</h1></header>
<p>
This page was generated by mozscreenshots
</p>
<img src="robot.png" />
<p>Welcome Humans! We invite others to keep the Manifesto’s principles; use the creation delivery and commitment. Advancing the Manifesto. We have shiny metal posteriors which <strong>should not be bitten</strong>. And they have distilled a public benefit is committed to use Mozilla project one basic and communities of modern life.</p>
<p>Robots have <mark>distilled a balance between commercial aspects of life</mark>.</p>
<p>Robots may not they have shown in education communication collaboration business entertainment and other people to pursue; speak to continue; and opportunity are many different ways to benefit the public benefit the Manifesto’s principles; build and motivate us and trademarks infrastructure funds and trademarks infrastructure funds and enable open-source technologies and provide a whole. </p>
<p>And they have seen things you people who believe that Mozilla Manifesto. We are to: articulate a vision of individual human being to benefit the lives of these efforts we will: build and promote models for creating economic value for the Internet. We create world-class open and anticipate the Mozilla Manifesto <strong>There are Your Plastic Pal Who's Fun To Be With</strong></p>
<p>Some Foundation to advance this vision of individual human being or not deeply involved in groups and promote models for the Manifesto principles will not come to support the Mozilla Foundation Pledge The Mozilla Manifesto in its activities. People are to: articulate a set of consumer products that support <mark>the Internet is a human being</mark> or not be treated as individuals working together in the development of the Internet open and with goodwill!Specifically we believe that we will: build and society as a public good as a result of the lives of collaborative activities. Specifically we have seen things you people acting as optional. Individuals must not come to continue to develop new ways of the Internet are fundamental and with us to ensure that openness innovation and very effective way that the Manifesto There are many benefits; a global public benefit; and society as optional.</p>
<p><strong>We have metal posteriors which should not deeply involved in a reality.</strong> Individuals must remain open source software promotes the Internet is a balance between commercial profit and within the Mozilla Corporation. Invitation The Internet are key to join us to life on their own. The Internet a whole. The Internet as a vision of the Mozilla contributors proud of time attention and motivate us and provide a reality.</p>
<script src="mozscreenshots-script.js"></script>
</body>
</html>

View file

@ -1,30 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Permission Prompts</title>
</head>
<body>
<button id="geo" onclick="navigator.geolocation.getCurrentPosition(() => {})">Geolocation</button>
<button id="webRTC-shareDevices" onclick="shareDevice({video: true, fake: true});">Video</button>
<button id="webRTC-shareMicrophone" onclick="shareDevice({audio: true, fake: true});">Audio</button>
<button id="webRTC-shareDevices2" onclick="shareDevice({audio: true, video: true, fake: true});">Audio and Video</button>
<button id="webRTC-shareScreen" onclick="shareDevice({video: {mediaSource: 'screen'}});">Screen</button>
<button id="web-notifications" onclick="Notification.requestPermission()">web-notifications</button>
<a id="addons" href="borderify.xpi">Install Add-On</a>
<form>
<input type="email" id="email" value="email@example.com" />
<input type="password" id="password" value="123456" />
<button type="submit" id="login-capture">Login</button>
</form>
<script type="application/javascript">
// Share device used in onclick calls above.
/* exported shareDevice */
function shareDevice(config) {
navigator.mediaDevices.getUserMedia(config);
}
</script>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 977 B

View file

@ -1,16 +0,0 @@
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# 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/.
XPI_NAME = 'mozscreenshots'
JAR_MANIFESTS += ['jar.mn']
USE_EXTENSION_MANIFEST = True
NO_JS_MANIFEST = True
FINAL_TARGET_PP_FILES += [
'bootstrap.js',
'install.rdf',
]

View file

@ -1,6 +0,0 @@
[DEFAULT]
subsuite = screenshots
support-files =
../head.js
[browser_permissionPrompts.js]

View file

@ -1,16 +0,0 @@
/* 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/. */
/* import-globals-from ../head.js */
"use strict";
add_task(function* capture() {
if (!shouldCapture()) {
return;
}
let sets = ["LightweightThemes", "PermissionPrompts"];
yield TestRunner.start(sets, "permissionPrompts");
});

View file

@ -1,6 +0,0 @@
[DEFAULT]
subsuite = screenshots
support-files =
../head.js
[browser_preferences.js]

View file

@ -1,16 +0,0 @@
/* 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/. */
/* import-globals-from ../head.js */
"use strict";
add_task(function* capture() {
if (!shouldCapture()) {
return;
}
let sets = ["Preferences"];
yield TestRunner.start(sets, "preferences");
});

View file

@ -1,6 +0,0 @@
[DEFAULT]
subsuite = screenshots
support-files =
../head.js
[browser_primaryUI.js]

View file

@ -1,18 +0,0 @@
/* 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/. */
/* import-globals-from ../head.js */
"use strict";
add_task(function* capture() {
if (!shouldCapture()) {
return;
}
requestLongerTimeout(20);
let sets = ["TabsInTitlebar", "Tabs", "WindowSize", "Toolbars", "LightweightThemes"];
yield TestRunner.start(sets, "primaryUI");
});

View file

@ -500,9 +500,6 @@ pref("browser.bookmarks.autoExportHTML", false);
// 0: no backups created (and deletes all existing backups) // 0: no backups created (and deletes all existing backups)
pref("browser.bookmarks.max_backups", 10); pref("browser.bookmarks.max_backups", 10);
// Whether menu should close after Ctrl-click, middle-click, etc.
pref("browser.bookmarks.openInTabClosesMenu", true);
// Scripts & Windows prefs // Scripts & Windows prefs
pref("dom.disable_open_during_load", true); pref("dom.disable_open_during_load", true);
pref("javascript.options.showInConsole", true); pref("javascript.options.showInConsole", true);

View file

@ -371,7 +371,6 @@
placespopup="true" placespopup="true"
context="placesContext" context="placesContext"
openInTabs="children" openInTabs="children"
onmouseup="BookmarksEventHandler.onMouseUp(event);"
oncommand="BookmarksEventHandler.onCommand(event, this.parentNode._placesView);" oncommand="BookmarksEventHandler.onCommand(event, this.parentNode._placesView);"
onclick="BookmarksEventHandler.onClick(event, this.parentNode._placesView);" onclick="BookmarksEventHandler.onClick(event, this.parentNode._placesView);"
onpopupshowing="PlacesCommandHook.updateBookmarkAllTabsCommand(); onpopupshowing="PlacesCommandHook.updateBookmarkAllTabsCommand();

View file

@ -767,46 +767,17 @@ HistoryMenu.prototype = {
* Functions for handling events in the Bookmarks Toolbar and menu. * Functions for handling events in the Bookmarks Toolbar and menu.
*/ */
var BookmarksEventHandler = { var BookmarksEventHandler = {
/**
* Handler for mouseUp event for an item in the bookmarks toolbar or menu.
* When items are middle-clicked (or clicked with modifier), check if the
* menu should remain open.
* @param aEvent
* DOMEvent for the click
*/
onMouseUp(aEvent) {
// Handles left-click with modifier if not browser.bookmarks.openInTabClosesMenu.
if (aEvent.button != 0 ||
Services.prefs.getBoolPref("browser.bookmarks.openInTabClosesMenu", true))
return;
let target = aEvent.originalTarget;
if (target.tagName != "menuitem")
return;
#ifdef XP_MACOSX
var modifKey = aEvent.metaKey;
#else
var modifKey = aEvent.ctrlKey;
#endif
// Don't keep menu open for 'Open all in Tabs'.
if (modifKey && !target.classList.contains("openintabs-menuitem")) {
target.setAttribute("closemenu", "none");
}
},
/** /**
* Handler for click event for an item in the bookmarks toolbar or menu. * Handler for click event for an item in the bookmarks toolbar or menu.
* Menus and submenus from the folder buttons bubble up to this handler. * Menus and submenus from the folder buttons bubble up to this handler.
* Left-click is handled in the onCommand function. * Left-click is handled in the onCommand function.
* When items are middle-clicked (or clicked with modifier), open in tabs. * When items are middle-clicked (or clicked with modifier), open in tabs.
* If the click came through a menu, close the menu unless preffed otherwise. * If the click came through a menu, close the menu.
* @param aEvent * @param aEvent
* DOMEvent for the click * DOMEvent for the click
* @param aView * @param aView
* The places view which aEvent should be associated with. * The places view which aEvent should be associated with.
*/ */
onClick: function(aEvent, aView) { onClick: function(aEvent, aView) {
// Only handle middle-click or left-click with modifiers. // Only handle middle-click or left-click with modifiers.
var modifKey = aEvent.ctrlKey || aEvent.shiftKey; var modifKey = aEvent.ctrlKey || aEvent.shiftKey;
@ -815,23 +786,19 @@ var BookmarksEventHandler = {
} }
var target = aEvent.originalTarget; var target = aEvent.originalTarget;
// If this event bubbled up from a menu or menuitem, // If this event bubbled up from a menu or menuitem, close the menus.
// close the menus if browser.bookmarks.openInTabClosesMenu. // Do this before opening tabs, to avoid hiding the open tabs confirm-dialog.
if ((Services.prefs.getBoolPref("browser.bookmarks.openInTabClosesMenu", true) && if (target.localName == "menu" || target.localName == "menuitem") {
target.tagName == "menuitem") || for (node = target.parentNode; node; node = node.parentNode) {
target.tagName == "menu" || if (node.localName == "menupopup") {
target.classList.contains("openintabs-menuitem")) { node.hidePopup();
closeMenus(aEvent.target); } else if (node.localName != "menu" &&
} node.localName != "splitmenu" &&
// Command already precesssed so remove any closemenu attr set in onMouseUp. node.localName != "hbox" &&
if (aEvent.button == 0 && node.localName != "vbox" ) {
target.tagName == "menuitem" && break;
target.getAttribute("closemenu") == "none") { }
// On Mac we need to extend when we remove the flag, to avoid any pre-close }
// animations.
setTimeout(() => {
target.removeAttribute("closemenu");
}, 500);
} }
if (target._placesNode && PlacesUtils.nodeIsContainer(target._placesNode)) { if (target._placesNode && PlacesUtils.nodeIsContainer(target._placesNode)) {

View file

@ -548,7 +548,6 @@
placespopup="true" placespopup="true"
context="placesContext" context="placesContext"
openInTabs="children" openInTabs="children"
onmouseup="BookmarksEventHandler.onMouseUp(event);"
oncommand="BookmarksEventHandler.onCommand(event, this.parentNode._placesView);" oncommand="BookmarksEventHandler.onCommand(event, this.parentNode._placesView);"
onclick="event.stopPropagation(); onclick="event.stopPropagation();
BookmarksEventHandler.onClick(event, this.parentNode._placesView);" BookmarksEventHandler.onClick(event, this.parentNode._placesView);"
@ -705,7 +704,6 @@
<hbox flex="1" <hbox flex="1"
id="PlacesToolbar" id="PlacesToolbar"
context="placesContext" context="placesContext"
onmouseup="BookmarksEventHandler.onMouseUp(event);"
onclick="BookmarksEventHandler.onClick(event, this._placesView);" onclick="BookmarksEventHandler.onClick(event, this._placesView);"
oncommand="BookmarksEventHandler.onCommand(event, this._placesView);" oncommand="BookmarksEventHandler.onCommand(event, this._placesView);"
tooltip="bhTooltip" tooltip="bhTooltip"

View file

@ -51,8 +51,6 @@ pref("@GUAO_PREF@.firefox.com","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_D
pref("@GUAO_PREF@.mozilla.org","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_DATE_SLICE@ @PM_SLICE@"); pref("@GUAO_PREF@.mozilla.org","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_DATE_SLICE@ @PM_SLICE@");
pref("@GUAO_PREF@.mozilla.com","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_DATE_SLICE@ @PM_SLICE@"); pref("@GUAO_PREF@.mozilla.com","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_DATE_SLICE@ @PM_SLICE@");
pref("@GUAO_PREF@.github.com","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_DATE_SLICE@ @PM_SLICE@"); pref("@GUAO_PREF@.github.com","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_DATE_SLICE@ @PM_SLICE@");
pref("@GUAO_PREF@.spotify.com","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_DATE_SLICE@ @PM_SLICE@");
pref("@GUAO_PREF@.twitter.com","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_DATE_SLICE@ @PM_SLICE@");
pref("@GUAO_PREF@.zoho.com","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_DATE_SLICE@ @PM_SLICE@"); pref("@GUAO_PREF@.zoho.com","Mozilla/5.0 (%OS_SLICE% rv:@GRE_VERSION@) @GRE_DATE_SLICE@ @PM_SLICE@");
// UA-Sniffing domains below have indicated no interest in supporting Pale Moon (BOO!) // UA-Sniffing domains below have indicated no interest in supporting Pale Moon (BOO!)
@ -61,9 +59,8 @@ pref("@GUAO_PREF@.privat24.ua","Mozilla/5.0 (%OS_SLICE% rv:38.0) @GK_SLICE@ Fire
pref("@GUAO_PREF@.citi.com","Mozilla/5.0 (%OS_SLICE% rv:68.0) @GK_SLICE@ Firefox/68.0 SeaMonkey/2.53.12"); pref("@GUAO_PREF@.citi.com","Mozilla/5.0 (%OS_SLICE% rv:68.0) @GK_SLICE@ Firefox/68.0 SeaMonkey/2.53.12");
pref("@GUAO_PREF@.chase.com","Mozilla/5.0 (%OS_SLICE% rv:102.0) @GK_SLICE@ Firefox/102.0"); pref("@GUAO_PREF@.chase.com","Mozilla/5.0 (%OS_SLICE% rv:102.0) @GK_SLICE@ Firefox/102.0");
pref("@GUAO_PREF@.facebook.com","Mozilla/5.0 (%OS_SLICE% rv:68.0) @GK_SLICE@ Firefox/68.0 @PM_SLICE@"); pref("@GUAO_PREF@.facebook.com","Mozilla/5.0 (%OS_SLICE% rv:68.0) @GK_SLICE@ Firefox/68.0 @PM_SLICE@");
pref("@GUAO_PREF@.netflix.com","Mozilla/5.0 (Windows NT 6.1; rv:45.9) @GK_SLICE@ Firefox/45.9");
pref("@GUAO_PREF@.netflximg.net","Mozilla/5.0 (Windows NT 6.1; rv:45.9) @GK_SLICE@ Firefox/45.9");
pref("@GUAO_PREF@.mewe.com", "Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@"); pref("@GUAO_PREF@.mewe.com", "Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@");
pref("@GUAO_PREF@.spotify.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@");
// UA-sniffing domains that are "app/vendor-specific" and do not like Pale Moon // UA-sniffing domains that are "app/vendor-specific" and do not like Pale Moon
pref("@GUAO_PREF@.web.whatsapp.com","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"); pref("@GUAO_PREF@.web.whatsapp.com","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36");

View file

@ -100,10 +100,6 @@
<menupopup id="placesContext" <menupopup id="placesContext"
onpopupshowing="this._view = PlacesUIUtils.getViewForNode(document.popupNode); onpopupshowing="this._view = PlacesUIUtils.getViewForNode(document.popupNode);
if (!PlacesUIUtils.openInTabClosesMenu) {
document.getElementById ('placesContext_open:newtab')
.setAttribute('closemenu', 'single');
}
return this._view.buildContextMenu(this);" return this._view.buildContextMenu(this);"
onpopuphiding="this._view.destroyContextMenu();"> onpopuphiding="this._view.destroyContextMenu();">
<menuitem id="placesContext_open" <menuitem id="placesContext_open"

View file

@ -22,11 +22,6 @@
<preferences id="privacyPreferences"> <preferences id="privacyPreferences">
<!-- Global Privacy Control -->
<preference id="privacy.GPCheader.enabled"
name="privacy.GPCheader.enabled"
type="bool"/>
<!-- XXX button prefs --> <!-- XXX button prefs -->
<preference id="pref.privacy.disable_button.cookie_exceptions" <preference id="pref.privacy.disable_button.cookie_exceptions"
name="pref.privacy.disable_button.cookie_exceptions" name="pref.privacy.disable_button.cookie_exceptions"
@ -77,12 +72,42 @@
onchange="gPrivacyPane.updatePrivacyMicroControls();" onchange="gPrivacyPane.updatePrivacyMicroControls();"
type="bool"/> type="bool"/>
<!-- Global Privacy Control -->
<preference id="privacy.GPCheader.enabled"
name="privacy.GPCheader.enabled"
type="bool"/>
<!-- Fingerprinting -->
<preference id="canvas.poisondata"
name="canvas.poisondata"
type="bool"/>
<!-- Scripting -->
<preference id="dom.enable_performance_observer"
name="dom.enable_performance_observer"
type="bool"/>
<preference id="dom.enable_performance_navigation_timing"
name="dom.enable_performance_navigation_timing"
type="bool"/>
</preferences> </preferences>
<stringbundle id="bundlePreferences" src="chrome://browser/locale/preferences/preferences.properties"/> <stringbundle id="bundlePreferences" src="chrome://browser/locale/preferences/preferences.properties"/>
<script type="application/javascript" src="chrome://browser/content/preferences/privacy.js"/> <script type="application/javascript" src="chrome://browser/content/preferences/privacy.js"/>
<tabbox id="privacyPrefs" flex="1">
<tabs id="tabsElement">
<tab id="generalTab" label="&generalTab.label;" helpTopic="prefs-privacy"/>
<tab id="trackingTab" label="&trackingTab.label;" helpTopic="prefs-privacy"/>
</tabs>
<tabpanels flex="1">
<!-- General -->
<tabpanel id="generalPanel" orient="vertical">
<!-- History --> <!-- History -->
<groupbox id="historyPanel"> <groupbox id="historyPanel">
<caption>&history.label;</caption> <caption>&history.label;</caption>
@ -216,22 +241,6 @@
</groupbox> </groupbox>
<!-- Global Privacy Control -->
<groupbox id="dataPrivacyPanel">
<caption>&dataPrivacy.label;</caption>
<hbox align="center">
<checkbox id="privacyGPCCheckbox"
label="&sendGPCheader.label;"
accesskey="&sendGPCheader.accesskey;"
preference="privacy.GPCheader.enabled"/>
<separator class="thin"/>
<label class="text-link" id="GPCInfo"
href="https://www.palemoon.org/support/global-privacy-control"
value="&GPCInfo.label;"/>
</hbox>
</groupbox>
<!-- Location Bar --> <!-- Location Bar -->
<groupbox id="locatioBarPanel"> <groupbox id="locatioBarPanel">
<caption>&locationBar.label;</caption> <caption>&locationBar.label;</caption>
@ -251,6 +260,53 @@
</groupbox> </groupbox>
</tabpanel>
<!-- Tracking -->
<tabpanel id="trackingPanel" orient="vertical">
<!-- Global Privacy Control -->
<groupbox id="dataPrivacyPanel">
<caption>&dataPrivacy.label;</caption>
<hbox align="center">
<checkbox id="privacyGPCCheckbox"
label="&sendGPCheader.label;"
accesskey="&sendGPCheader.accesskey;"
preference="privacy.GPCheader.enabled"/>
<separator class="thin"/>
<label class="text-link" id="GPCInfo"
href="https://www.palemoon.org/support/global-privacy-control"
value="&GPCInfo.label;"/>
</hbox>
</groupbox>
<!-- Fingerprinting -->
<groupbox id="fingerprintingPanel">
<caption>&fingerprinting.label;</caption>
<checkbox id="canvasPoisonCheckbox"
label="&canvasPoisonData.label;"
accesskey="&canvasPoisonData.accesskey;"
preference="canvas.poisondata"/>
</groupbox>
<!-- Scripting privacy -->
<groupbox id="scriptingPanel">
<caption>&scripting.label;</caption>
<checkbox id="perfObserverCheckbox"
label="&perfObserver.label;"
accesskey="&perfObserver.accesskey;"
preference="dom.enable_performance_observer"/>
<checkbox id="perfNavTimingCheckbox"
label="&perfNavTiming.label;"
accesskey="&perfNavTiming.accesskey;"
preference="dom.enable_performance_navigation_timing"/>
</groupbox>
</tabpanel>
</tabpanels>
</tabbox>
</prefpane> </prefpane>
</overlay> </overlay>

View file

@ -2,11 +2,7 @@
- License, v. 2.0. If a copy of the MPL was not distributed with this - License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<!ENTITY dataPrivacy.label "Data Privacy"> <!ENTITY generalTab.label "General">
<!ENTITY sendGPCheader.label "Tell sites not to share or sell my data">
<!ENTITY sendGPCheader.accesskey "n">
<!ENTITY GPCInfo.label "Learn More">
<!ENTITY history.label "History"> <!ENTITY history.label "History">
@ -81,3 +77,24 @@
<!ENTITY clearOnCloseSettings.label "Settings…"> <!ENTITY clearOnCloseSettings.label "Settings…">
<!ENTITY clearOnCloseSettings.accesskey "t"> <!ENTITY clearOnCloseSettings.accesskey "t">
<!ENTITY trackingTab.label "Tracking">
<!ENTITY dataPrivacy.label "Data Privacy">
<!ENTITY sendGPCheader.label "Tell sites not to share or sell my data">
<!ENTITY sendGPCheader.accesskey "n">
<!ENTITY GPCInfo.label "Learn More">
<!ENTITY fingerprinting.label "Fingerprinting">
<!ENTITY canvasPoisonData.label "Poison canvas data">
<!ENTITY canvasPoisonData.accesskey "P">
<!ENTITY scripting.label "Scripting">
<!ENTITY perfObserver.label "Enable Performance Observers">
<!ENTITY perfObserver.accesskey "O">
<!ENTITY perfNavTiming.label "Enable Performance Navigation Timing">
<!ENTITY perfNavTiming.accesskey "N">

View file

@ -7,9 +7,9 @@
<Description>Amazon.com Search</Description> <Description>Amazon.com Search</Description>
<InputEncoding>ISO-8859-1</InputEncoding> <InputEncoding>ISO-8859-1</InputEncoding>
<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAC0AQAAJgAAACAgAAAAAAAA6QIAANoBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAF7SURBVDjLlZPLasJAFIaFRF+iVV+h6hO0GF+gVB9AaHwDt64qCG03tQgtdCFIuyhUelmGli66MXThSt24kNiFBUlAYi6ezjnNxSuawB/ITP7v/HNmJgQAEaZzpgHs/gwcTyTEXuXl2U6nA8ViEbK5HKler28CVRAwnB9ptVrAh8MrQuCaZ4iA8fzIqSgCxwzpTIaSuN/RWGwdYLwCUBQFZFkGSZLgqdmEE7YEN8VOAKyaSKUW4nNBAFmnYiKZpDRX1WqwBBzP089n5f/NEQsFL4WqqtsBWJlzDAJr5PwSMM1awEzzdxIbGI3Hvc6jCZeVFgRQRwpY7Qcw3ktgfpR8wLRxCPaot/X4GS95MppfF6DX9n2A3f+kAZycaT8bAZjU6r6B/duD6d3BYg9wQq/tkYzHY1blEiz5lmQyGc95mrO6r2CxgpjCBXgNsJVviolpXJiraeOIjJRE10juUa4sR8V+mO17VvmGqtuOcdNlwut8zTQJcJ0njifyB2bgTdKh6w4BAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACsElEQVRYw71XQWsTURBe2LQgeNKLB+tVemt6txcteNSD/QGC6VEIGDx5s+eKPQqFgJhLNdFLBWMP7cU0oSAWjB70koC9WHbVQ5SO8+XtS14mr7svyaYDH9m87Jv55puZt1nPi4yIzjMeMj7T9OwjI88455nGC1cZX+nsDESumJmPFDwIAqrX6z00Gg1qt9vjkJgFgUeuO16Vy3RjeZkyMzM9+MY1fsM9I9h9zyV7ZAznZrA4FAoFVwJ1z+WuOysrg1lnMolkHJX4k0igzI5sARYWF7vEZEk0rvO6iyUSuJfLJUqM7zYSqRDIra4OOUZPmNZsNrsl8UVTpkJAjh1GzmaSpJ8mAWmYeZB5urHRhW5SNOfUCCDo47W1bvPZsp2qAhipy3Nz1kaLG8dUCEBqM5AvpgElqFar01NgIZsdco7Zb7VasU2YigIYL5tjqCL7Q5YkFQXKlcqQ7DbHthIALk/IWAKor82xPIhshxWABCYioDMz51sexcVi0XoG4DPLIyvJjkTArK3scDQnRvO0MdTrUHGiKZCP4tNgO6BAEI08EQH9Z2Qow0hyPypJGIa9p6JWKCn4SA8jSKmJIDgyRvPJkcRxjfUwNGr/i8+Mo32iHzWiThBD4NM60bet9P77/ubA728RlTjMiwiH6zEEfvIrwdZFtQmMJ7W/ofIDBZD5m3mVZGwJcOP2kmILIlCkE45HoPWurwCSg0+UQRD4ZyXxId+T7gQb9+4q9sioY5ltrOG3L5vqXiiJffDx/aUi83ZJ7jr2ohcEu8Hh6/m+I7OWGiVxbWKHsz+O3vSOakqFQdsFgQeJUiKD7Wv9YKXBgCeSUC3v2kM5EJhlHDh3NcgcPlG1BXZu98sDmTuBa4fsMnz9fniJUaGzs+eMC540XuR0aDO2L8Y3qPyMcdOM+R/8XcqRA3qp9gAAAABJRU5ErkJggg==</Image> <Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAC0AQAAJgAAACAgAAAAAAAA6QIAANoBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAF7SURBVDjLlZPLasJAFIaFRF+iVV+h6hO0GF+gVB9AaHwDt64qCG03tQgtdCFIuyhUelmGli66MXThSt24kNiFBUlAYi6ezjnNxSuawB/ITP7v/HNmJgQAEaZzpgHs/gwcTyTEXuXl2U6nA8ViEbK5HKler28CVRAwnB9ptVrAh8MrQuCaZ4iA8fzIqSgCxwzpTIaSuN/RWGwdYLwCUBQFZFkGSZLgqdmEE7YEN8VOAKyaSKUW4nNBAFmnYiKZpDRX1WqwBBzP089n5f/NEQsFL4WqqtsBWJlzDAJr5PwSMM1awEzzdxIbGI3Hvc6jCZeVFgRQRwpY7Qcw3ktgfpR8wLRxCPaot/X4GS95MppfF6DX9n2A3f+kAZycaT8bAZjU6r6B/duD6d3BYg9wQq/tkYzHY1blEiz5lmQyGc95mrO6r2CxgpjCBXgNsJVviolpXJiraeOIjJRE10juUa4sR8V+mO17VvmGqtuOcdNlwut8zTQJcJ0njifyB2bgTdKh6w4BAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACsElEQVRYw71XQWsTURBe2LQgeNKLB+tVemt6txcteNSD/QGC6VEIGDx5s+eKPQqFgJhLNdFLBWMP7cU0oSAWjB70koC9WHbVQ5SO8+XtS14mr7svyaYDH9m87Jv55puZt1nPi4yIzjMeMj7T9OwjI88455nGC1cZX+nsDESumJmPFDwIAqrX6z00Gg1qt9vjkJgFgUeuO16Vy3RjeZkyMzM9+MY1fsM9I9h9zyV7ZAznZrA4FAoFVwJ1z+WuOysrg1lnMolkHJX4k0igzI5sARYWF7vEZEk0rvO6iyUSuJfLJUqM7zYSqRDIra4OOUZPmNZsNrsl8UVTpkJAjh1GzmaSpJ8mAWmYeZB5urHRhW5SNOfUCCDo47W1bvPZsp2qAhipy3Nz1kaLG8dUCEBqM5AvpgElqFar01NgIZsdco7Zb7VasU2YigIYL5tjqCL7Q5YkFQXKlcqQ7DbHthIALk/IWAKor82xPIhshxWABCYioDMz51sexcVi0XoG4DPLIyvJjkTArK3scDQnRvO0MdTrUHGiKZCP4tNgO6BAEI08EQH9Z2Qow0hyPypJGIa9p6JWKCn4SA8jSKmJIDgyRvPJkcRxjfUwNGr/i8+Mo32iHzWiThBD4NM60bet9P77/ubA728RlTjMiwiH6zEEfvIrwdZFtQmMJ7W/ofIDBZD5m3mVZGwJcOP2kmILIlCkE45HoPWurwCSg0+UQRD4ZyXxId+T7gQb9+4q9sioY5ltrOG3L5vqXiiJffDx/aUi83ZJ7jr2ohcEu8Hh6/m+I7OWGiVxbWKHsz+O3vSOakqFQdsFgQeJUiKD7Wv9YKXBgCeSUC3v2kM5EJhlHDh3NcgcPlG1BXZu98sDmTuBa4fsMnz9fniJUaGzs+eMC540XuR0aDO2L8Y3qPyMcdOM+R/8XcqRA3qp9gAAAABJRU5ErkJggg==</Image>
<Url type="text/html" method="GET" template="http://www.amazon.com/exec/obidos/external-search/"> <Url type="text/html" method="GET" template="https://www.amazon.com/exec/obidos/external-search/">
<Param name="field-keywords" value="{searchTerms}"/> <Param name="field-keywords" value="{searchTerms}"/>
<Param name="mode" value="blended"/> <Param name="mode" value="blended"/>
</Url> </Url>
<SearchForm>http://www.amazon.com/</SearchForm> <SearchForm>https://www.amazon.com/</SearchForm>
</SearchPlugin> </SearchPlugin>

View file

@ -7,10 +7,10 @@
<Description>Dictionary Search on Answers.com</Description> <Description>Dictionary Search on Answers.com</Description>
<InputEncoding>UTF-8</InputEncoding> <InputEncoding>UTF-8</InputEncoding>
<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////K////4f////E////5f///+n////P////mv///0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E////fv///+//////////////////////7NnP/+LFtv/////+////of///xYAAAAAAAAAAAAAAAD///8D////lf////////////j0//bi1v/OlXf/tGU9/6FCEv/OmH3////////////////D////FgAAAAAAAAAA////avPm4P/evaz/8NbI//7r3//23M3/xYRi/5kzAP/Df1z//u/l//749P/v4dn/+PPw/////6j///8B////GP///+W/f1//smM7//bczf/+69///uvf/9ytlP+ZMwD/5se3/+/f1//AgmP/nj0N/927qv/////+////QP///2z/////8NvQ/8WCYP/+69///uvf//7r3/+7ckz/pUkb/9m1ov+ePQ3/okUW/8+fh//38O3//////////5r///+t//////7y6v/Cflv/58Cr//DRwP/mwKv/okQU/8ODYv/cuqj/yZN4//Tq5f/+9e///vDn///////////Q////yf/////+7+b/05yA/65ZLv+9dVD/sF40/5kzAP/kvKb//vTu//Tr5v/7+Pb//vfz//707f//////////6f///8X//////vDm/+K4ov/KjGz//ure/8uNbf+jRBX/+OTX/+3b0v+jSBr/pk0h/717Wv/Wrpr//Pn4/////+b///+i//////7z7f/02Mj/wn5b//vl2P+uWS7/vXhU//v49//48u//1q6a/717Wv+oUSb/tWxH//jz8P/////K////V///////+/j//ure/8aFZP/fs5v/oEAQ/9q1o/+zaEL/1ayX//718P/+9/P/+PHu//jz8P//////////h////wr////O///////38v/YpYr/tGQ7/6ZLHf/06eX/s2dB/549Df/x49z//vDn//7x6f//////////8////yoAAAAA////R/////v/////7dXI/5kzAP+7cUv//vHp/+vYzv+bNwX/vHlY//38/P///////////////30AAAAAAAAAAAAAAAD///9n////+/z5+P++e1n/3LGc//7w5//++PT/0KKL/8OIa//9/Pv//////////5X///8GAAAAAAAAAAAAAAAAAAAAAP///0n////K///////////////////////////+/v7/////5v///2z///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///1f///+g////xP///8n///+r////bP///xoAAAAAAAAAAAAAAAAAAAAA+B////AH///AA///wAH//4AB//+AAP//AAD//wAA//8AAP//AAD//4AA//+AAf//wAP//+AD///wD////D///w==</Image> <Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////K////4f////E////5f///+n////P////mv///0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E////fv///+//////////////////////7NnP/+LFtv/////+////of///xYAAAAAAAAAAAAAAAD///8D////lf////////////j0//bi1v/OlXf/tGU9/6FCEv/OmH3////////////////D////FgAAAAAAAAAA////avPm4P/evaz/8NbI//7r3//23M3/xYRi/5kzAP/Df1z//u/l//749P/v4dn/+PPw/////6j///8B////GP///+W/f1//smM7//bczf/+69///uvf/9ytlP+ZMwD/5se3/+/f1//AgmP/nj0N/927qv/////+////QP///2z/////8NvQ/8WCYP/+69///uvf//7r3/+7ckz/pUkb/9m1ov+ePQ3/okUW/8+fh//38O3//////////5r///+t//////7y6v/Cflv/58Cr//DRwP/mwKv/okQU/8ODYv/cuqj/yZN4//Tq5f/+9e///vDn///////////Q////yf/////+7+b/05yA/65ZLv+9dVD/sF40/5kzAP/kvKb//vTu//Tr5v/7+Pb//vfz//707f//////////6f///8X//////vDm/+K4ov/KjGz//ure/8uNbf+jRBX/+OTX/+3b0v+jSBr/pk0h/717Wv/Wrpr//Pn4/////+b///+i//////7z7f/02Mj/wn5b//vl2P+uWS7/vXhU//v49//48u//1q6a/717Wv+oUSb/tWxH//jz8P/////K////V///////+/j//ure/8aFZP/fs5v/oEAQ/9q1o/+zaEL/1ayX//718P/+9/P/+PHu//jz8P//////////h////wr////O///////38v/YpYr/tGQ7/6ZLHf/06eX/s2dB/549Df/x49z//vDn//7x6f//////////8////yoAAAAA////R/////v/////7dXI/5kzAP+7cUv//vHp/+vYzv+bNwX/vHlY//38/P///////////////30AAAAAAAAAAAAAAAD///9n////+/z5+P++e1n/3LGc//7w5//++PT/0KKL/8OIa//9/Pv//////////5X///8GAAAAAAAAAAAAAAAAAAAAAP///0n////K///////////////////////////+/v7/////5v///2z///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///1f///+g////xP///8n///+r////bP///xoAAAAAAAAAAAAAAAAAAAAA+B////AH///AA///wAH//4AB//+AAP//AAD//wAA//8AAP//AAD//4AA//+AAf//wAP//+AD///wD////D///w==</Image>
<Url type="text/html" method="GET" template="http://www.answers.com/main/ntquery"> <Url type="text/html" method="GET" template="https://www.answers.com/main/ntquery">
<Param name="s" value="{searchTerms}"/> <Param name="s" value="{searchTerms}"/>
</Url> </Url>
<Url type="application/x-suggestions+json" method="GET" <Url type="application/x-suggestions+json" method="GET"
template="http://www.answers.com/main/startswith?output=json&amp;client=firefox&amp;s={searchTerms}"/> template="https://www.answers.com/main/startswith?output=json&amp;client=palemoon&amp;s={searchTerms}"/>
<SearchForm>http://www.answers.com/</SearchForm> <SearchForm>http://www.answers.com/</SearchForm>
</SearchPlugin> </SearchPlugin>

View file

@ -7,7 +7,7 @@
<Description>Find photos, movies, music, and text to rip, sample, mash, and share.</Description> <Description>Find photos, movies, music, and text to rip, sample, mash, and share.</Description>
<InputEncoding>utf-8</InputEncoding> <InputEncoding>utf-8</InputEncoding>
<Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJUSURBVDiNjZO9S1thGMXPvTfJFbnkipNkLLS0ksFg0M0lf4CboNCEgIIg/RiKtEOn0qGWTtbVoBYcIji10I9J0ApWCjp0kRaXdhHjTW4+uGnur4NJ8GOwZ3nf4TnnfZ5z3scAdBGGYdyVdN+yrGHTNNOtVqsVhuG+pO+S3gE/LtV3BIxzPDJNc8FxHGN0dNRKpVIGoJ2dndr+/r5Vr9cl6bmkN0AoSQIEyHXdj5KYnZ3F932uolKpkM/nK5KQ9FmSCZwLOI7zQBLr6+vXiFdRLBaDtsiTTve3YrFYkM/nbyR3MDU1dSKpLumO+vr6Xruui+d5AFSrVVZWVtjY2KDRaABwdHTE4uIie3t7AJTLZaLRaFXSCyUSid1MJgOA53n09/eTTqdJJpPMzc2xurqKbduMj48Tj8fZ3d0FYHBw8FjSezmOU56fnwdgeXkZ27ap1WpUKhWazSZjY2Nks1kASqVSd4zp6eljSX/MtiHdRDpnEATyfb+bkiSVSqXu3TCM8xgHBga+dkY4OzvDdV2GhoZIJBLMzMxQKBSIRqNkMhlisRhbW1sAJJPJn5I+KB6Pv7poou/7rK2tsbm5SRAEXROXlpY4ODgAoFarYdu2J+llN8ZcLvffMeZyud+SGpLuCVBPT89jSRQKhRvJxWKxISmU9JTOT5Rk9Pb2fpHE5OQkJycn14inp6dMTEx4bdM/SbKAy8sk6WEkElmwLCuSSqUYGRmxgHB7e7t+eHgYazabgaRnkt7SeZnr63xbUtYwjGHTNNNhGP4F9iR9a6/zr4v1/wDE1D9XlC4rrAAAAABJRU5ErkJggg==</Image> <Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJUSURBVDiNjZO9S1thGMXPvTfJFbnkipNkLLS0ksFg0M0lf4CboNCEgIIg/RiKtEOn0qGWTtbVoBYcIji10I9J0ApWCjp0kRaXdhHjTW4+uGnur4NJ8GOwZ3nf4TnnfZ5z3scAdBGGYdyVdN+yrGHTNNOtVqsVhuG+pO+S3gE/LtV3BIxzPDJNc8FxHGN0dNRKpVIGoJ2dndr+/r5Vr9cl6bmkN0AoSQIEyHXdj5KYnZ3F932uolKpkM/nK5KQ9FmSCZwLOI7zQBLr6+vXiFdRLBaDtsiTTve3YrFYkM/nbyR3MDU1dSKpLumO+vr6Xruui+d5AFSrVVZWVtjY2KDRaABwdHTE4uIie3t7AJTLZaLRaFXSCyUSid1MJgOA53n09/eTTqdJJpPMzc2xurqKbduMj48Tj8fZ3d0FYHBw8FjSezmOU56fnwdgeXkZ27ap1WpUKhWazSZjY2Nks1kASqVSd4zp6eljSX/MtiHdRDpnEATyfb+bkiSVSqXu3TCM8xgHBga+dkY4OzvDdV2GhoZIJBLMzMxQKBSIRqNkMhlisRhbW1sAJJPJn5I+KB6Pv7poou/7rK2tsbm5SRAEXROXlpY4ODgAoFarYdu2J+llN8ZcLvffMeZyud+SGpLuCVBPT89jSRQKhRvJxWKxISmU9JTOT5Rk9Pb2fpHE5OQkJycn14inp6dMTEx4bdM/SbKAy8sk6WEkElmwLCuSSqUYGRmxgHB7e7t+eHgYazabgaRnkt7SeZnr63xbUtYwjGHTNNNhGP4F9iR9a6/zr4v1/wDE1D9XlC4rrAAAAABJRU5ErkJggg==</Image>
<Url type="text/html" method="GET" template="http://search.creativecommons.org/"> <Url type="text/html" method="GET" template="https://search.creativecommons.org/">
<Param name="q" value="{searchTerms}"/> <Param name="q" value="{searchTerms}"/>
</Url> </Url>
<SearchForm>http://search.creativecommons.org/</SearchForm> <SearchForm>http://search.creativecommons.org/</SearchForm>

View file

@ -7,12 +7,12 @@
<Description>eBay - Online auctions</Description> <Description>eBay - Online auctions</Description>
<InputEncoding>ISO-8859-1</InputEncoding> <InputEncoding>ISO-8859-1</InputEncoding>
<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAB6AQAAJgAAACAgAAAAAAAAQgMAAKABAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFBSURBVDjLtZPdK0MBGIf3J5Babhx3rinFBWuipaUskX9DYvkopqgV90q5UJpyp0OKrUWM2VrRsS9D0zZKHGaOnW1nj4vtypVtPPe/533r9746QAAOAJXfo5Yzgg44pHrcugon/6Sgo0b+XuAOZ2iZiVQmyPoDpIwmUkYTzqM7GsdDdC7F6Lbf8pzOkfWOouzqeZem2b+2AqAV8zjD8yVBqqcf2b7C66yNiMGMfixIQSvi8Mp0LEbR5ADq1QSKWM+Gx0RC9nOZ2GLzwlIWdPWiuNzk4w/EpThNkyEAXKEP2ud8KGId2sspilhPMrmNwzfCuqePr/xbSfC5I/I0MMSj2YJ3z49gDdO2cEOrLUowJpE9G0QRG1ClKbR0EIdvmOPYcnUtnN+vsnZiQC1k/qnGagQ1n3LNzySUJZVskitnmr8BlQG7T2hvgxsAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAMJSURBVFjD7ZddSFNhGMeHXXQTZFFCWfR1pRhUECQlBdWVToo+6KYu1KigtDASG5qUfZgFZvahEDosECPDktKZS1FL+1DRnEvdUptjug91X2dnZzv/3vO6OZbWnR4v9sADL+fs7P97/s/znu2VAJD4UkpSSdKG+QubTyPBr+sXz8XCR64fIAHihVTis0SsUAoAVhEBrBKIHCGAEMB/ARi3F5LkbpS2WMRzYEEBXC2tsD6T03R9agsCGLNyqPw6CXmrBT06JvhbPHZwmkdwtR0B138PPKOHgzXD5jLAy3tmibo4K9weZwDAazJj/FQKRnfugfHMeRiTz0K3Ixam1HQKcPC+Fisu9NK1P08Uj4DleHgMdXC+WQ7nu3UEOhFMfTQcVUvQ1H4IN2sj8H2k7K+2TqCc3GseyA8AmDOzMBq7D9bS8sAr6nEJdNt3UbHVF1XQGtmZew8bTPT6tWoD3KpsUvlR8NxUoEICMvl6KQo+xqCwcRs4T8Ax5c8bFExjbAgAjO7aS8VsLypgq3g5nWStjztAhWRVhqAqeB6IuKTClkw1eNYEbrCQQBwD8yGGOsAooogLYejQPKBi7UPF9DkH+ezd+o141ZkUPAOC+L9SAMivNc7q46YMNSLTe4n1kaQF4XD3ZIDTPgU3XEYciKcAHrsGJS1xKFBGgyVzouiT4VbdGhjt/cEA5isyKsaz7jl3we7bg7Rqf6j0LoSldON4wWcqJDgQNGTN++l13vELA+MK6kKd6iryFOvxtidt9i5gO7owdjKJQliflNAU1pas6xQgnAzg1ux+lJEdILixNr0Pq9JUUA8NwVG9DM73G0jlcnh+V4BpjIWzJmIGQIjnXw5TiDuKSEwxurm3ITc8DNO51BnrLbIcsrW0dNA6RxgUKU1UdGVqLy5X6qGzTLvlnewiBZyGs3Yz6X8UeaYI3olvZDhzwLumZ+eHvooCCC0Q5VUsb4unwycM4YIDqA01tPqmgbzQr2EIYPECiPm33LYoDiZSsY9moh9O/Znoa4d9HkXtPg2pX/cPKCoRQ+ocZa4AAAAASUVORK5CYII=</Image> <Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAB6AQAAJgAAACAgAAAAAAAAQgMAAKABAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFBSURBVDjLtZPdK0MBGIf3J5Babhx3rinFBWuipaUskX9DYvkopqgV90q5UJpyp0OKrUWM2VrRsS9D0zZKHGaOnW1nj4vtypVtPPe/533r9746QAAOAJXfo5Yzgg44pHrcugon/6Sgo0b+XuAOZ2iZiVQmyPoDpIwmUkYTzqM7GsdDdC7F6Lbf8pzOkfWOouzqeZem2b+2AqAV8zjD8yVBqqcf2b7C66yNiMGMfixIQSvi8Mp0LEbR5ADq1QSKWM+Gx0RC9nOZ2GLzwlIWdPWiuNzk4w/EpThNkyEAXKEP2ud8KGId2sspilhPMrmNwzfCuqePr/xbSfC5I/I0MMSj2YJ3z49gDdO2cEOrLUowJpE9G0QRG1ClKbR0EIdvmOPYcnUtnN+vsnZiQC1k/qnGagQ1n3LNzySUJZVskitnmr8BlQG7T2hvgxsAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAMJSURBVFjD7ZddSFNhGMeHXXQTZFFCWfR1pRhUECQlBdWVToo+6KYu1KigtDASG5qUfZgFZvahEDosECPDktKZS1FL+1DRnEvdUptjug91X2dnZzv/3vO6OZbWnR4v9sADL+fs7P97/s/znu2VAJD4UkpSSdKG+QubTyPBr+sXz8XCR64fIAHihVTis0SsUAoAVhEBrBKIHCGAEMB/ARi3F5LkbpS2WMRzYEEBXC2tsD6T03R9agsCGLNyqPw6CXmrBT06JvhbPHZwmkdwtR0B138PPKOHgzXD5jLAy3tmibo4K9weZwDAazJj/FQKRnfugfHMeRiTz0K3Ixam1HQKcPC+Fisu9NK1P08Uj4DleHgMdXC+WQ7nu3UEOhFMfTQcVUvQ1H4IN2sj8H2k7K+2TqCc3GseyA8AmDOzMBq7D9bS8sAr6nEJdNt3UbHVF1XQGtmZew8bTPT6tWoD3KpsUvlR8NxUoEICMvl6KQo+xqCwcRs4T8Ax5c8bFExjbAgAjO7aS8VsLypgq3g5nWStjztAhWRVhqAqeB6IuKTClkw1eNYEbrCQQBwD8yGGOsAooogLYejQPKBi7UPF9DkH+ezd+o141ZkUPAOC+L9SAMivNc7q46YMNSLTe4n1kaQF4XD3ZIDTPgU3XEYciKcAHrsGJS1xKFBGgyVzouiT4VbdGhjt/cEA5isyKsaz7jl3we7bg7Rqf6j0LoSldON4wWcqJDgQNGTN++l13vELA+MK6kKd6iryFOvxtidt9i5gO7owdjKJQliflNAU1pas6xQgnAzg1ux+lJEdILixNr0Pq9JUUA8NwVG9DM73G0jlcnh+V4BpjIWzJmIGQIjnXw5TiDuKSEwxurm3ITc8DNO51BnrLbIcsrW0dNA6RxgUKU1UdGVqLy5X6qGzTLvlnewiBZyGs3Yz6X8UeaYI3olvZDhzwLumZ+eHvooCCC0Q5VUsb4unwycM4YIDqA01tPqmgbzQr2EIYPECiPm33LYoDiZSsY9moh9O/Znoa4d9HkXtPg2pX/cPKCoRQ+ocZa4AAAAASUVORK5CYII=</Image>
<Url type="application/x-suggestions+json" method="GET" template="http://anywhere.ebay.com/services/suggest/"> <Url type="application/x-suggestions+json" method="GET" template="https://anywhere.ebay.com/services/suggest/">
<Param name="s" value="0"/> <Param name="s" value="0"/>
<Param name="q" value="{searchTerms}"/> <Param name="q" value="{searchTerms}"/>
</Url> </Url>
<Url type="text/html" method="GET" template="http://rover.ebay.com/rover/1/711-47294-18009-3/4"> <Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/711-47294-18009-3/4">
<Param name="mpre" value="http://shop.ebay.com/?_nkw={searchTerms}"/> <Param name="mpre" value="https://shop.ebay.com/?_nkw={searchTerms}"/>
</Url> </Url>
<SearchForm>http://search.ebay.com/</SearchForm> <SearchForm>http://search.ebay.com/</SearchForm>
</SearchPlugin> </SearchPlugin>

View file

@ -7,11 +7,11 @@
<Description>Wikipedia, the free encyclopedia</Description> <Description>Wikipedia, the free encyclopedia</Description>
<InputEncoding>UTF-8</InputEncoding> <InputEncoding>UTF-8</InputEncoding>
<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAA4AQAAJgAAACAgAAAAAAAAJAMAAGQBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAEFSURBVDjLxZPRDYJAEESJoQjpgBoM/9IBtoAl4KcUQQlSAjYgJWAH0gPmyNtkzEEuxkQTPzawc3Ozc3MQTc/JfVPR/wW6a+eKQ+Hyfe54B2wvrfXVqXLDfTCMd3j0VHksrTcH9bl2aZq+BCgEwCCPj9E4TdPYGj0C9CYAKdkmBrIIxiIYbvpbb2sSl8AiA+ywAbJE5YLpCImLU/WRDyIAWRgu4k1s4v50ODru4haYSCk4ntkuM0wcMAINXiPKTJQ9CfgB40phBr8DyFjGKkKEhYhCY4iCDgpAYAM2EZBlhJnsZxQUYBNkSkfBvjDd0ttPeR0mxREQ+OhfYOJ6EmL+l/qzn2kGli9cAF3BOfkAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAIKSURBVFjD7ZdBSgNRDIYLguAB7FLwAkXwBl0JgiDYjQcY8ARduBJKu3I5C0EoWDxAT9AL9AK9QBeCIHQlCM/3DZOSmeZNZ2r1bQyEGV7yXv7kJZlJq6XIOXfs+crzwPPTnvnR863n05ZFufDD/T595Q4eauM37u/pWYwfeX53cegcABcuHg0AkEQE8AKAu4gAXv8BrAEMh0PXbrddt9t1vV4v406nk62laeqm02n2LjKYIuK5WCyyfeiLDF32yLn6TJ5mBFarlev3+9nBMMqsabkYhmezWcEd2ctTE/tYBwhgt14BhtmAV2VaLpdrAHioCW+VdwWy9IMAUBQjJcQFTwGqvcTD+Xy+oc8askZJyAYrnKEokCeWLpQkSSZvBIANYgSDVVEQQJaeyHQu1QIgiQNb6AmrTtaQ9+RFSLa1D4iXgfsrVITloeSFFZlaAEjAUMaXo2DJWQtVRe1OKF5aJUkf0NdglXO5VzQGoI2USwwD3LEl590CtdO3QBoT5WSFV+Q63Oha17ITgMlkslGSGBWPdeNiDR2SL1B6zQFINmOAkFOW5eTSURCdvX6OdUlapaWjsKX0dgOg26/VWHSUKhrPz35ISKwq76R9Wx+kKgC1f0o5mISsypUG3kPj2L/lDzKYvEUwzoh2JtPRdQQAo1jD6afne88H1oTMeH6ZK+x7PB/lQ/CJtvkNEgDh1dr/bVYAAAAASUVORK5CYII=</Image> <Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAA4AQAAJgAAACAgAAAAAAAAJAMAAGQBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAEFSURBVDjLxZPRDYJAEESJoQjpgBoM/9IBtoAl4KcUQQlSAjYgJWAH0gPmyNtkzEEuxkQTPzawc3Ozc3MQTc/JfVPR/wW6a+eKQ+Hyfe54B2wvrfXVqXLDfTCMd3j0VHksrTcH9bl2aZq+BCgEwCCPj9E4TdPYGj0C9CYAKdkmBrIIxiIYbvpbb2sSl8AiA+ywAbJE5YLpCImLU/WRDyIAWRgu4k1s4v50ODru4haYSCk4ntkuM0wcMAINXiPKTJQ9CfgB40phBr8DyFjGKkKEhYhCY4iCDgpAYAM2EZBlhJnsZxQUYBNkSkfBvjDd0ttPeR0mxREQ+OhfYOJ6EmL+l/qzn2kGli9cAF3BOfkAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAIKSURBVFjD7ZdBSgNRDIYLguAB7FLwAkXwBl0JgiDYjQcY8ARduBJKu3I5C0EoWDxAT9AL9AK9QBeCIHQlCM/3DZOSmeZNZ2r1bQyEGV7yXv7kJZlJq6XIOXfs+crzwPPTnvnR863n05ZFufDD/T595Q4eauM37u/pWYwfeX53cegcABcuHg0AkEQE8AKAu4gAXv8BrAEMh0PXbrddt9t1vV4v406nk62laeqm02n2LjKYIuK5WCyyfeiLDF32yLn6TJ5mBFarlev3+9nBMMqsabkYhmezWcEd2ctTE/tYBwhgt14BhtmAV2VaLpdrAHioCW+VdwWy9IMAUBQjJcQFTwGqvcTD+Xy+oc8askZJyAYrnKEokCeWLpQkSSZvBIANYgSDVVEQQJaeyHQu1QIgiQNb6AmrTtaQ9+RFSLa1D4iXgfsrVITloeSFFZlaAEjAUMaXo2DJWQtVRe1OKF5aJUkf0NdglXO5VzQGoI2USwwD3LEl590CtdO3QBoT5WSFV+Q63Oha17ITgMlkslGSGBWPdeNiDR2SL1B6zQFINmOAkFOW5eTSURCdvX6OdUlapaWjsKX0dgOg26/VWHSUKhrPz35ISKwq76R9Wx+kKgC1f0o5mISsypUG3kPj2L/lDzKYvEUwzoh2JtPRdQQAo1jD6afne88H1oTMeH6ZK+x7PB/lQ/CJtvkNEgDh1dr/bVYAAAAASUVORK5CYII=</Image>
<Url type="application/x-suggestions+json" method="GET" template="http://en.wikipedia.org/w/api.php"> <Url type="application/x-suggestions+json" method="GET" template="https://en.wikipedia.org/w/api.php">
<Param name="action" value="opensearch"/> <Param name="action" value="opensearch"/>
<Param name="search" value="{searchTerms}"/> <Param name="search" value="{searchTerms}"/>
</Url> </Url>
<Url type="text/html" method="GET" template="http://en.wikipedia.org/wiki/Special:Search"> <Url type="text/html" method="GET" template="https://en.wikipedia.org/wiki/Special:Search">
<Param name="search" value="{searchTerms}"/> <Param name="search" value="{searchTerms}"/>
</Url> </Url>
<SearchForm>http://en.wikipedia.org/wiki/Special:Search</SearchForm> <SearchForm>http://en.wikipedia.org/wiki/Special:Search</SearchForm>

View file

@ -375,7 +375,6 @@ MessagePort::Initialize(const nsID& aUUID,
nsAutoPtr<WorkerHolder> workerHolder(new MessagePortWorkerHolder(this)); nsAutoPtr<WorkerHolder> workerHolder(new MessagePortWorkerHolder(this));
if (NS_WARN_IF(!workerHolder->HoldWorker(workerPrivate, Closing))) { if (NS_WARN_IF(!workerHolder->HoldWorker(workerPrivate, Closing))) {
CloseForced();
aRv.Throw(NS_ERROR_FAILURE); aRv.Throw(NS_ERROR_FAILURE);
return; return;
} }

View file

@ -1038,13 +1038,6 @@ nsCORSListenerProxy::CheckPreflightNeeded(nsIChannel* aChannel, UpdateType aUpda
return NS_OK; return NS_OK;
} }
// A preflight is needed. But if we've already been cross-site, then
// we already did a preflight when that happened, and so we're not allowed
// to do another preflight again.
if (aUpdateType != UpdateType::InternalOrHSTSRedirect) {
NS_ENSURE_FALSE(mHasBeenCrossSite, NS_ERROR_DOM_BAD_URI);
}
nsCOMPtr<nsIHttpChannelInternal> internal = do_QueryInterface(http); nsCOMPtr<nsIHttpChannelInternal> internal = do_QueryInterface(http);
NS_ENSURE_TRUE(internal, NS_ERROR_DOM_BAD_URI); NS_ENSURE_TRUE(internal, NS_ERROR_DOM_BAD_URI);