Merge mozilla-central to mozilla-inbound

This commit is contained in:
Carsten "Tomcat" Book 2017-01-11 16:37:37 +01:00
commit ccfe5b9092
169 changed files with 16753 additions and 16804 deletions

View File

@ -32,7 +32,6 @@ function dumpAccessibleNode(aNode, level) {
function dumpAccessibleTree(aNode, level) {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
level = level || 0;
dumpAccessibleNode(aNode, level);
@ -48,14 +47,12 @@ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
}
function A(o) {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var acc = Components.classes['@mozilla.org/accessibilityService;1']
.getService(Components.interfaces.nsIAccessibilityService);
var acc = SpecialPowers.Cc['@mozilla.org/accessibilityService;1']
.getService(SpecialPowers.Ci.nsIAccessibilityService);
return acc.getAccessibleFor(o);
}
function beginAccessible() {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
dumpAccessibleTree(A(document),0);
}
setTimeout(beginAccessible, 100);

View File

@ -2,8 +2,8 @@
http://creativecommons.org/publicdomain/zero/1.0/ */
var { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components;
const { Services } = Cu.import('resource://gre/modules/Services.jsm');
const { SystemAppProxy } = Cu.import('resource://gre/modules/SystemAppProxy.jsm');
const { Services } = Cu.import('resource://gre/modules/Services.jsm', {});
const { SystemAppProxy } = Cu.import('resource://gre/modules/SystemAppProxy.jsm', {});
var processId;

View File

@ -12,8 +12,8 @@ var Cc = Components.classes;
var Ci = Components.interfaces;
var Cu = Components.utils;
const { Services } = Cu.import("resource://gre/modules/Services.jsm");
const { SystemAppProxy } = Cu.import("resource://gre/modules/SystemAppProxy.jsm");
const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
const { SystemAppProxy } = Cu.import("resource://gre/modules/SystemAppProxy.jsm", {});
var eventHandler = function(evt) {
if (!evt.detail || evt.detail.type !== "permission-prompt") {
@ -33,4 +33,3 @@ addMessageListener("teardown", function() {
addMessageListener("permission-response", function(detail) {
SystemAppProxy._sendCustomEvent('mozContentEvent', detail);
});

View File

@ -9,8 +9,8 @@
}
var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
const { XPCOMUtils } = Cu.import('resource://gre/modules/XPCOMUtils.jsm');
const { SystemAppProxy } = Cu.import('resource://gre/modules/SystemAppProxy.jsm');
const { XPCOMUtils } = Cu.import('resource://gre/modules/XPCOMUtils.jsm', {});
const { SystemAppProxy } = Cu.import('resource://gre/modules/SystemAppProxy.jsm', {});
const manager = Cc["@mozilla.org/presentation-device/manager;1"]
.getService(Ci.nsIPresentationDeviceManager);
@ -91,4 +91,3 @@ addMessageListener('trigger-device-prompt', function(request_options) {
addMessageListener('presentation-select-response', function(detail) {
SystemAppProxy._sendCustomEvent('mozContentEvent', detail);
});

View File

@ -5,8 +5,8 @@
'use strict';
var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
const { XPCOMUtils } = Cu.import('resource://gre/modules/XPCOMUtils.jsm');
const { SystemAppProxy } = Cu.import('resource://gre/modules/SystemAppProxy.jsm');
const { XPCOMUtils } = Cu.import('resource://gre/modules/XPCOMUtils.jsm', {});
const { SystemAppProxy } = Cu.import('resource://gre/modules/SystemAppProxy.jsm', {});
const glue = Cc["@mozilla.org/presentation/requestuiglue;1"]
.createInstance(Ci.nsIPresentationRequestUIGlue);

View File

@ -3,7 +3,7 @@ var Ci = Components.interfaces;
Cu.importGlobalProperties(['File']);
const { Services } = Cu.import("resource://gre/modules/Services.jsm");
const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
// Load a duplicated copy of the jsm to prevent messing with the currently running one
var scope = {};

View File

@ -1,6 +1,6 @@
var Cu = Components.utils;
const { Services } = Cu.import("resource://gre/modules/Services.jsm");
const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
// Load a duplicated copy of the jsm to prevent messing with the currently running one
var scope = {};

View File

@ -19,7 +19,7 @@ XPCOMUtils.defineLazyModuleGetter(this, "FxAccountsManager",
// At end of test, restore original state
const ORIGINAL_AUTH_URI = Services.prefs.getCharPref("identity.fxaccounts.auth.uri");
var { SystemAppProxy } = Cu.import("resource://gre/modules/FxAccountsMgmtService.jsm");
var { SystemAppProxy } = Cu.import("resource://gre/modules/FxAccountsMgmtService.jsm", {});
const ORIGINAL_SENDCUSTOM = SystemAppProxy._sendCustomEvent;
do_register_cleanup(function() {
Services.prefs.setCharPref("identity.fxaccounts.auth.uri", ORIGINAL_AUTH_URI);
@ -208,5 +208,3 @@ function httpd_setup (handlers, port=-1) {
return server;
}

View File

@ -10,7 +10,7 @@ const PREF_INSTALL_REQUIREBUILTINCERTS = "extensions.install.requireBuiltInCerts
const PROGRESS_NOTIFICATION = "addon-progress";
const { REQUIRE_SIGNING } = Cu.import("resource://gre/modules/addons/AddonConstants.jsm", {});
const { Task } = Cu.import("resource://gre/modules/Task.jsm");
const { Task } = Cu.import("resource://gre/modules/Task.jsm", {});
var rootDir = getRootDirectory(gTestPath);
var rootPath = rootDir.split('/');

View File

@ -10,15 +10,23 @@ const ID = "permissions@test.mozilla.org";
const DEFAULT_EXTENSION_ICON = "chrome://browser/content/extension.svg";
Services.perms.add(makeURI("https://example.com/"), "install",
Services.perms.ALLOW_ACTION);
function promisePopupNotificationShown(name) {
return new Promise(resolve => {
PopupNotifications.panel.addEventListener("popupshown", () => {
function popupshown() {
let notification = PopupNotifications.getNotification(name);
if (!notification) { return; }
ok(notification, `${name} notification shown`);
ok(PopupNotifications.isPanelOpen, "notification panel open");
PopupNotifications.panel.removeEventListener("popupshown", popupshown);
resolve(PopupNotifications.panel.firstChild);
}, {once: true});
}
PopupNotifications.panel.addEventListener("popupshown", popupshown);
});
}
@ -60,8 +68,14 @@ function checkNotification(panel, url) {
const INSTALL_FUNCTIONS = [
function installMozAM(url) {
return ContentTask.spawn(gBrowser.selectedBrowser, url, function*(cUrl) {
return content.wrappedJSObject.installMozAM(cUrl);
ContentTask.spawn(gBrowser.selectedBrowser, url, function*(cUrl) {
content.wrappedJSObject.installMozAM(cUrl);
});
},
function installTrigger(url) {
ContentTask.spawn(gBrowser.selectedBrowser, url, function*(cUrl) {
content.wrappedJSObject.installTrigger(cUrl);
});
},
];
@ -78,7 +92,37 @@ add_task(function* () {
function* runOnce(installFn, url, cancel) {
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE);
let installPromise = installFn(url);
let installPromise = new Promise(resolve => {
let listener = {
onDownloadCancelled() {
AddonManager.removeInstallListener(listener);
resolve(false);
},
onDownloadFailed() {
AddonManager.removeInstallListener(listener);
resolve(false);
},
onInstallCancelled() {
AddonManager.removeInstallListener(listener);
resolve(false);
},
onInstallEnded() {
AddonManager.removeInstallListener(listener);
resolve(true);
},
onInstallFailed() {
AddonManager.removeInstallListener(listener);
resolve(false);
},
};
AddonManager.addInstallListener(listener);
});
installFn(url);
let panel = yield promisePopupNotificationShown("addon-webext-permissions");
checkNotification(panel, url);
@ -92,10 +136,10 @@ add_task(function* () {
let result = yield installPromise;
let addon = yield promiseGetAddonByID(ID);
if (cancel) {
is(result, "onInstallCancelled", "Installation was cancelled");
ok(!result, "Installation was cancelled");
is(addon, null, "Extension is not installed");
} else {
is(result, "onInstallEnded", "Installation completed");
ok(result, "Installation completed");
isnot(addon, null, "Extension is installed");
addon.uninstall();
}

View File

@ -7,19 +7,13 @@
<body>
<script type="text/javascript">
function installMozAM(url) {
return navigator.mozAddonManager.createInstall({url}).then(install => new Promise(resolve => {
const EVENTS = [
"onDownloadCancelled",
"onDownloadFailed",
"onInstallCancelled",
"onInstallEnded",
"onInstallFailed",
];
for (let event of EVENTS) {
install.addEventListener(event, () => { resolve(event); });
}
return navigator.mozAddonManager.createInstall({url}).then(install => {
install.install();
}));
});
}
function installTrigger(url) {
InstallTrigger.install({extension: url});
}
</script>
</body>

View File

@ -324,6 +324,7 @@ function MenuItem(extension, createProperties, isRoot = false) {
this.setDefaults();
this.setProps(createProperties);
if (!this.hasOwnProperty("_id")) {
this.id = gNextMenuItemID++;
}
@ -351,6 +352,12 @@ MenuItem.prototype = {
if (createProperties.targetUrlPatterns != null) {
this.targetUrlMatchPattern = new MatchPattern(this.targetUrlPatterns);
}
// If a child MenuItem does not specify any contexts, then it should
// inherit the contexts specified from its parent.
if (createProperties.parentId && !createProperties.contexts) {
this.contexts = this.parent.contexts;
}
},
setDefaults() {

View File

@ -14,8 +14,8 @@ add_task(function* test_actionContextMenus() {
const contexts = ["page_action", "browser_action"];
const parentId = browser.contextMenus.create({contexts, title: "parent"});
await browser.contextMenus.create({contexts, parentId, title: "click A"});
await browser.contextMenus.create({contexts, parentId, title: "click B"});
await browser.contextMenus.create({parentId, title: "click A"});
await browser.contextMenus.create({parentId, title: "click B"});
for (let i = 1; i < 9; i++) {
await browser.contextMenus.create({contexts, title: `click ${i}`});
@ -69,8 +69,11 @@ add_task(function* test_tabContextMenu() {
permissions: ["contextMenus"],
},
async background() {
await browser.contextMenus.create({title: "alpha", contexts: ["tab"]});
await browser.contextMenus.create({title: "beta", contexts: ["tab"]});
await browser.contextMenus.create({
id: "alpha-beta-parent", title: "alpha-beta parent", contexts: ["tab"],
});
await browser.contextMenus.create({parentId: "alpha-beta-parent", title: "alpha"});
await browser.contextMenus.create({parentId: "alpha-beta-parent", title: "beta"});
browser.contextMenus.onClicked.addListener((info, tab) => {
browser.test.sendMessage("click", {info, tab});
@ -103,7 +106,7 @@ add_task(function* test_tabContextMenu() {
is(separator.tagName, "menuseparator", "Separator before first extension item");
is(submenu.tagName, "menu", "Correct submenu type");
is(submenu.label, "Generated extension", "Correct submenu title");
is(submenu.label, "alpha-beta parent", "Correct submenu title");
is(gamma.tagName, "menuitem", "Third menu item type is correct");
is(gamma.label, "gamma", "Third menu item label is correct");

View File

@ -17,8 +17,8 @@
* promiseContentDimensions alterContent
*/
const {AppConstants} = Cu.import("resource://gre/modules/AppConstants.jsm");
const {CustomizableUI} = Cu.import("resource:///modules/CustomizableUI.jsm");
const {AppConstants} = Cu.import("resource://gre/modules/AppConstants.jsm", {});
const {CustomizableUI} = Cu.import("resource:///modules/CustomizableUI.jsm", {});
// We run tests under two different configurations, from browser.ini and
// browser-remote.ini. When running from browser-remote.ini, the tests are

View File

@ -2,7 +2,7 @@
Cu.import("resource://gre/modules/ctypes.jsm");
Cu.import("resource://gre/modules/Services.jsm");
let eseBackStage = Cu.import("resource:///modules/ESEDBReader.jsm");
let eseBackStage = Cu.import("resource:///modules/ESEDBReader.jsm", {});
let ESE = eseBackStage.ESE;
let KERNEL = eseBackStage.KERNEL;
let gLibs = eseBackStage.gLibs;
@ -468,4 +468,3 @@ add_task(function*() {
}
}
});

View File

@ -1,6 +1,6 @@
"use strict";
let AutoMigrateBackstage = Cu.import("resource:///modules/AutoMigrate.jsm"); /* globals AutoMigrate */
Cu.import("resource:///modules/AutoMigrate.jsm", this);
let gShimmedMigratorKeyPicker = null;
let gShimmedMigrator = null;
@ -11,6 +11,8 @@ const kUsecPerMin = 60 * 1000000;
// we get in trouble because the object itself is frozen, and Proxies can't
// return a different value to an object when directly proxying a frozen
// object.
let AutoMigrateBackstage = Cu.import("resource:///modules/AutoMigrate.jsm", {});
AutoMigrateBackstage.MigrationUtils = new Proxy({}, {
get(target, name) {
if (name == "getMigratorKeyForDefaultBrowser" && gShimmedMigratorKeyPicker) {
@ -608,4 +610,3 @@ add_task(function* checkUndoVisitsState() {
"1 unrelated.org visits should have persisted as it's not involved in the import.");
yield PlacesTestUtils.clearHistory();
});

View File

@ -10,7 +10,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/PageThumbs.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
const {OS} = Cu.import("resource://gre/modules/osfile.jsm");
const {OS} = Cu.import("resource://gre/modules/osfile.jsm", {});
XPCOMUtils.defineLazyModuleGetter(this, "BackgroundPageThumbs",
"resource://gre/modules/BackgroundPageThumbs.jsm");

View File

@ -51,6 +51,20 @@ function promiseEvent(aTarget, aEventName, aPreventDefault) {
return BrowserTestUtils.waitForEvent(aTarget, aEventName, false, cancelEvent);
}
/**
* Adds a new search engine to the search service and confirms it completes.
*
* @param {String} basename The file to load that contains the search engine
* details.
* @param {Object} [options] Options for the test:
* - {String} [iconURL] The icon to use for the search engine.
* - {Boolean} [setAsCurrent] Whether to set the new engine to be the
* current engine or not.
* - {String} [testPath] Used to override the current test path if this
* file is used from a different directory.
* @returns {Promise} The promise is resolved once the engine is added, or
* rejected if the addition failed.
*/
function promiseNewEngine(basename, options = {}) {
return new Promise((resolve, reject) => {
// Default the setAsCurrent option to true.
@ -59,7 +73,7 @@ function promiseNewEngine(basename, options = {}) {
info("Waiting for engine to be added: " + basename);
Services.search.init({
onInitComplete() {
let url = getRootDirectory(gTestPath) + basename;
let url = getRootDirectory(options.testPath || gTestPath) + basename;
let current = Services.search.currentEngine;
Services.search.addEngine(url, null, options.iconURL || "", false, {
onSuccess(engine) {

View File

@ -373,7 +373,8 @@ const kTestPairs = [
];
Components.utils.import("resource://gre/modules/Timer.jsm");
let detectorModule = Components.utils.import("resource:///modules/translation/LanguageDetector.jsm");
let detectorModule = Components.utils.import("resource:///modules/translation/LanguageDetector.jsm", {});
const LanguageDetector = detectorModule.LanguageDetector;
function check_result(result, langCode, expected) {
equal(result.language, langCode, "Expected language code");

View File

@ -47,7 +47,7 @@ add_task(function* test_setup() {
Services.prefs.setCharPref(PREF_MANIFEST_URI, gManifestHandlerURI);
Services.prefs.setIntPref(PREF_FETCHINTERVAL, 0);
let ExperimentsScope = Cu.import("resource:///modules/experiments/Experiments.jsm");
let ExperimentsScope = Cu.import("resource:///modules/experiments/Experiments.jsm", {});
let Experiments = ExperimentsScope.Experiments;
gPolicy = new Experiments.Policy();

View File

@ -5,7 +5,7 @@
Cu.import("resource://testing-common/httpd.js");
Cu.import("resource://gre/modules/TelemetryLog.jsm");
var bsp = Cu.import("resource:///modules/experiments/Experiments.jsm");
var {TELEMETRY_LOG, Experiments} = Cu.import("resource:///modules/experiments/Experiments.jsm", {});
const MANIFEST_HANDLER = "manifests/handler";
@ -21,7 +21,7 @@ var gPolicy = null;
var gManifestObject = null;
var gManifestHandlerURI = null;
const TLOG = bsp.TELEMETRY_LOG;
const TLOG = TELEMETRY_LOG;
function checkEvent(event, id, data) {
do_print("Checking message " + id);

View File

@ -21,6 +21,15 @@ this.ExtensionsUI = {
observe(subject, topic, data) {
if (topic == "webextension-permission-prompt") {
let {target, info} = subject.wrappedJSObject;
// Dismiss the progress notification. Note that this is bad if
// there are multiple simultaneous installs happening, see
// bug 1329884 for a longer explanation.
let progressNotification = target.ownerGlobal.PopupNotifications.getNotification("addon-progress", target);
if (progressNotification) {
progressNotification.remove();
}
this.showPermissionsPrompt(target, info).then(answer => {
Services.obs.notifyObservers(subject, "webextension-permission-response",
JSON.stringify(answer));

View File

@ -14,6 +14,8 @@ support-files =
contentSearchBadImage.xml
contentSearchSuggestions.sjs
contentSearchSuggestions.xml
!/browser/components/search/test/head.js
!/browser/components/search/test/testEngine.xml
[browser_NetworkPrioritizer.js]
[browser_PermissionUI.js]
[browser_ProcessHangNotifications.js]

View File

@ -7,6 +7,24 @@ const CONTENT_SEARCH_MSG = "ContentSearch";
const TEST_CONTENT_SCRIPT_BASENAME = "contentSearch.js";
var gMsgMan;
/* eslint no-undef:"error" */
/* import-globals-from ../../components/search/test/head.js */
Services.scriptloader.loadSubScript(
"chrome://mochitests/content/browser/browser/components/search/test/head.js",
this);
let originalEngine = Services.search.currentEngine;
add_task(function* setup() {
yield promiseNewEngine("testEngine.xml", {
setAsCurrent: true,
testPath: "chrome://mochitests/content/browser/browser/components/search/test/",
});
registerCleanupFunction(() => {
Services.search.currentEngine = originalEngine;
});
});
add_task(function* GetState() {
yield addTab();

View File

@ -18,12 +18,6 @@ content.addEventListener(SERVICE_EVENT_TYPE, event => {
// Forward messages from the test to the in-content service.
addMessageListener(TEST_MSG, msg => {
content.dispatchEvent(
new content.CustomEvent(CLIENT_EVENT_TYPE, {
detail: msg.data,
})
);
// If the message is a search, stop the page from loading and then tell the
// test that it loaded.
if (msg.data.type == "Search") {
@ -34,6 +28,12 @@ addMessageListener(TEST_MSG, msg => {
});
});
}
content.dispatchEvent(
new content.CustomEvent(CLIENT_EVENT_TYPE, {
detail: msg.data,
})
);
});
function waitForLoadAndStopIt(expectedURL, callback) {

View File

@ -98,14 +98,17 @@ AC_SUBST(USE_ICU)
AC_SUBST(ICU_DATA_FILE)
AC_SUBST(MOZ_ICU_DATA_ARCHIVE)
if test -n "$USE_ICU" -a -z "$MOZ_SYSTEM_ICU"; then
if test -z "$YASM" -a -z "$GNU_AS" -a "$COMPILE_ENVIRONMENT"; then
AC_MSG_ERROR([Building ICU requires either yasm or a GNU assembler. If you do not have either of those available for this platform you must use --without-intl-api])
fi
dnl We build ICU as a static library.
AC_DEFINE(U_STATIC_IMPLEMENTATION)
if test -n "$USE_ICU"; then
dnl Source files that use ICU should have control over which parts of the ICU
dnl namespace they want to use.
AC_DEFINE(U_USING_ICU_NAMESPACE,0)
if test -z "$MOZ_SYSTEM_ICU"; then
if test -z "$YASM" -a -z "$GNU_AS" -a "$COMPILE_ENVIRONMENT"; then
AC_MSG_ERROR([Building ICU requires either yasm or a GNU assembler. If you do not have either of those available for this platform you must use --without-intl-api])
fi
dnl We build ICU as a static library.
AC_DEFINE(U_STATIC_IMPLEMENTATION)
fi
fi
])

View File

@ -1317,6 +1317,7 @@ xlocale.h
#ifdef MOZ_SYSTEM_ICU
unicode/locid.h
unicode/numsys.h
unicode/plurrule.h
unicode/timezone.h
unicode/ucal.h
unicode/uchar.h
@ -1327,6 +1328,7 @@ unicode/udatpg.h
unicode/uenum.h
unicode/unorm.h
unicode/unum.h
unicode/upluralrules.h
unicode/ustring.h
unicode/utypes.h
#endif

View File

@ -119,6 +119,10 @@ requestCookies=Request cookies
# in the network details params tab identifying the response cookies.
responseCookies=Response cookies
# LOCALIZATION NOTE (responsePayload): This is the label displayed
# in the network details response tab identifying the response payload.
responsePayload=Response payload
# LOCALIZATION NOTE (jsonFilterText): This is the text displayed
# in the response tab of the network details pane for the JSON filtering input.
jsonFilterText=Filter properties

View File

@ -8,6 +8,8 @@ const general = {
CONTENT_SIZE_DECIMALS: 2,
FILTER_SEARCH_DELAY: 200,
REQUEST_TIME_DECIMALS: 2,
// 100 KB in bytes
SOURCE_SYNTAX_HIGHLIGHT_MAX_FILE_SIZE: 102400,
};
const actionTypes = {

View File

@ -3,51 +3,32 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* eslint-disable mozilla/reject-some-requires */
/* globals window, dumpn, $, NetMonitorView, gNetwork */
/* globals window, dumpn, $, gNetwork */
"use strict";
const promise = require("promise");
const EventEmitter = require("devtools/shared/event-emitter");
const Editor = require("devtools/client/sourceeditor/editor");
const { Heritage } = require("devtools/client/shared/widgets/view-helpers");
const { Task } = require("devtools/shared/task");
const { ToolSidebar } = require("devtools/client/framework/sidebar");
const { VariablesView } = require("resource://devtools/client/shared/widgets/VariablesView.jsm");
const { VariablesViewController } = require("resource://devtools/client/shared/widgets/VariablesViewController.jsm");
const { EVENTS } = require("./events");
const { L10N } = require("./l10n");
const { Filters } = require("./filter-predicates");
const {
decodeUnicodeUrl,
formDataURI,
getUrlBaseName,
} = require("./request-utils");
const { createFactory } = require("devtools/client/shared/vendor/react");
const ReactDOM = require("devtools/client/shared/vendor/react-dom");
const Provider = createFactory(require("devtools/client/shared/vendor/react-redux").Provider);
const ParamsPanel = createFactory(require("./shared/components/params-panel"));
const PreviewPanel = createFactory(require("./shared/components/preview-panel"));
const ResponsePanel = createFactory(require("./shared/components/response-panel"));
const SecurityPanel = createFactory(require("./shared/components/security-panel"));
const TimingsPanel = createFactory(require("./shared/components/timings-panel"));
// 100 KB in bytes
const SOURCE_SYNTAX_HIGHLIGHT_MAX_FILE_SIZE = 102400;
const HEADERS_SIZE_DECIMALS = 3;
const CONTENT_MIME_TYPE_MAPPINGS = {
"/ecmascript": Editor.modes.js,
"/javascript": Editor.modes.js,
"/x-javascript": Editor.modes.js,
"/html": Editor.modes.html,
"/xhtml": Editor.modes.html,
"/xml": Editor.modes.html,
"/atom": Editor.modes.html,
"/soap": Editor.modes.html,
"/vnd.mpeg.dash.mpd": Editor.modes.html,
"/rdf": Editor.modes.css,
"/rss": Editor.modes.css,
"/css": Editor.modes.css
};
const GENERIC_VARIABLES_VIEW_SETTINGS = {
lazyEmpty: true,
// ms
@ -106,6 +87,13 @@ DetailsView.prototype = {
PreviewPanel()
), this._previewPanelNode);
this._responsePanelNode = $("#react-response-tabpanel-hook");
ReactDOM.render(Provider(
{ store },
ResponsePanel()
), this._responsePanelNode);
this._securityPanelNode = $("#react-security-tabpanel-hook");
ReactDOM.render(Provider(
@ -136,12 +124,6 @@ DetailsView.prototype = {
emptyText: L10N.getStr("cookiesEmptyText"),
searchPlaceholder: L10N.getStr("cookiesFilterText")
}));
this._json = new VariablesView($("#response-content-json"),
Heritage.extend(GENERIC_VARIABLES_VIEW_SETTINGS, {
onlyEnumVisible: true,
searchPlaceholder: L10N.getStr("jsonFilterText")
}));
VariablesViewController.attach(this._json);
this._requestHeaders = L10N.getStr("requestHeaders");
this._requestHeadersFromUpload = L10N.getStr("requestHeadersFromUpload");
@ -159,6 +141,7 @@ DetailsView.prototype = {
dumpn("Destroying the DetailsView");
ReactDOM.unmountComponentAtNode(this._paramsPanelNode);
ReactDOM.unmountComponentAtNode(this._previewPanelNode);
ReactDOM.unmountComponentAtNode(this._responsePanelNode);
ReactDOM.unmountComponentAtNode(this._securityPanelNode);
ReactDOM.unmountComponentAtNode(this._timingsPanelNode);
this.sidebar.destroy();
@ -175,11 +158,7 @@ DetailsView.prototype = {
* Returns a promise that resolves upon population the view.
*/
populate: function (data) {
$("#response-content-info-header").hidden = true;
$("#response-content-json-box").hidden = true;
$("#response-content-textarea-box").hidden = true;
$("#raw-headers").hidden = true;
$("#response-content-image-box").hidden = true;
let isHtml = Filters.html(data);
@ -205,7 +184,6 @@ DetailsView.prototype = {
this._headers.empty();
this._cookies.empty();
this._json.empty();
this._dataSrc = { src: data, populated: [] };
this._onTabSelect();
@ -254,10 +232,6 @@ DetailsView.prototype = {
yield view._setResponseCookies(src.responseCookies);
yield view._setRequestCookies(src.requestCookies);
break;
// "Response"
case 3:
yield view._setResponseBody(src.url, src.responseContent);
break;
}
viewState.updating[tab] = false;
}).then(() => {
@ -471,125 +445,9 @@ DetailsView.prototype = {
}
}),
/**
* Sets the network response body shown in this view.
*
* @param string url
* The request's url.
* @param object response
* The message received from the server.
* @return object
* A promise that is resolved when the response body is set.
*/
_setResponseBody: Task.async(function* (url, response) {
if (!response) {
return;
}
let { mimeType, text, encoding } = response.content;
let responseBody = yield gNetwork.getString(text);
// Handle json, which we tentatively identify by checking the MIME type
// for "json" after any word boundary. This works for the standard
// "application/json", and also for custom types like "x-bigcorp-json".
// Additionally, we also directly parse the response text content to
// verify whether it's json or not, to handle responses incorrectly
// labeled as text/plain instead.
let jsonMimeType, jsonObject, jsonObjectParseError;
try {
jsonMimeType = /\bjson/.test(mimeType);
jsonObject = JSON.parse(responseBody);
} catch (e) {
jsonObjectParseError = e;
}
if (jsonMimeType || jsonObject) {
// Extract the actual json substring in case this might be a "JSONP".
// This regex basically parses a function call and captures the
// function name and arguments in two separate groups.
let jsonpRegex = /^\s*([\w$]+)\s*\(\s*([^]*)\s*\)\s*;?\s*$/;
let [_, callbackPadding, jsonpString] = // eslint-disable-line
responseBody.match(jsonpRegex) || [];
// Make sure this is a valid JSON object first. If so, nicely display
// the parsing results in a variables view. Otherwise, simply show
// the contents as plain text.
if (callbackPadding && jsonpString) {
try {
jsonObject = JSON.parse(jsonpString);
} catch (e) {
jsonObjectParseError = e;
}
}
// Valid JSON or JSONP.
if (jsonObject) {
$("#response-content-json-box").hidden = false;
let jsonScopeName = callbackPadding
? L10N.getFormatStr("jsonpScopeName", callbackPadding)
: L10N.getStr("jsonScopeName");
let jsonVar = { label: jsonScopeName, rawObject: jsonObject };
yield this._json.controller.setSingleVariable(jsonVar).expanded;
} else {
// Malformed JSON.
$("#response-content-textarea-box").hidden = false;
let infoHeader = $("#response-content-info-header");
infoHeader.setAttribute("value", jsonObjectParseError);
infoHeader.setAttribute("tooltiptext", jsonObjectParseError);
infoHeader.hidden = false;
let editor = yield NetMonitorView.editor("#response-content-textarea");
editor.setMode(Editor.modes.js);
editor.setText(responseBody);
}
} else if (mimeType.includes("image/")) {
// Handle images.
$("#response-content-image-box").setAttribute("align", "center");
$("#response-content-image-box").setAttribute("pack", "center");
$("#response-content-image-box").hidden = false;
$("#response-content-image").src = formDataURI(mimeType, encoding, responseBody);
// Immediately display additional information about the image:
// file name, mime type and encoding.
$("#response-content-image-name-value").setAttribute("value",
getUrlBaseName(url));
$("#response-content-image-mime-value").setAttribute("value", mimeType);
// Wait for the image to load in order to display the width and height.
$("#response-content-image").onload = e => {
// XUL images are majestic so they don't bother storing their dimensions
// in width and height attributes like the rest of the folk. Hack around
// this by getting the bounding client rect and subtracting the margins.
let { width, height } = e.target.getBoundingClientRect();
let dimensions = (width - 2) + " \u00D7 " + (height - 2);
$("#response-content-image-dimensions-value").setAttribute("value",
dimensions);
};
} else {
$("#response-content-textarea-box").hidden = false;
let editor = yield NetMonitorView.editor("#response-content-textarea");
editor.setMode(Editor.modes.text);
editor.setText(responseBody);
// Maybe set a more appropriate mode in the Source Editor if possible,
// but avoid doing this for very large files.
if (responseBody.length < SOURCE_SYNTAX_HIGHLIGHT_MAX_FILE_SIZE) {
let mapping = Object.keys(CONTENT_MIME_TYPE_MAPPINGS).find(key => {
return mimeType.includes(key);
});
if (mapping) {
editor.setMode(CONTENT_MIME_TYPE_MAPPINGS[mapping]);
}
}
}
window.emit(EVENTS.RESPONSE_BODY_DISPLAYED);
}),
_dataSrc: null,
_headers: null,
_cookies: null,
_json: null,
_requestHeaders: "",
_responseHeaders: "",
_requestCookies: "",

View File

@ -55,9 +55,6 @@ const EVENTS = {
// When the request post params are displayed in the UI.
REQUEST_POST_PARAMS_DISPLAYED: "NetMonitor:RequestPostParamsAvailable",
// When the response body is displayed in the UI.
RESPONSE_BODY_DISPLAYED: "NetMonitor:ResponseBodyAvailable",
// When the image response thumbnail is displayed in the UI.
RESPONSE_IMAGE_THUMBNAIL_DISPLAYED:
"NetMonitor:ResponseImageThumbnailAvailable",

View File

@ -8,8 +8,6 @@
"use strict";
const { testing: isTesting } = require("devtools/shared/flags");
const promise = require("promise");
const Editor = require("devtools/client/sourceeditor/editor");
const { Task } = require("devtools/shared/task");
const { ViewHelpers } = require("devtools/client/shared/widgets/view-helpers");
const { RequestsMenuView } = require("./requests-menu-view");
@ -32,12 +30,6 @@ const WDA_DEFAULT_VERIFY_INTERVAL = 50;
// ms
const WDA_DEFAULT_GIVE_UP_TIMEOUT = isTesting ? 45000 : 2000;
const DEFAULT_EDITOR_CONFIG = {
mode: Editor.modes.text,
readOnly: true,
lineNumbers: true
};
/**
* Object defining the network monitor view components.
*/
@ -102,11 +94,6 @@ var NetMonitorView = {
Prefs.networkDetailsHeight = this._detailsPane.getAttribute("height");
this._detailsPane = null;
for (let p of this._editorPromises.values()) {
let editor = yield p;
editor.destroy();
}
}),
/**
@ -214,35 +201,8 @@ var NetMonitorView = {
ACTIVITY_TYPE.RELOAD.WITH_CACHE_DEFAULT);
},
/**
* Lazily initializes and returns a promise for a Editor instance.
*
* @param string id
* The id of the editor placeholder node.
* @return object
* A promise that is resolved when the editor is available.
*/
editor: function (id) {
dumpn("Getting a NetMonitorView editor: " + id);
if (this._editorPromises.has(id)) {
return this._editorPromises.get(id);
}
let deferred = promise.defer();
this._editorPromises.set(id, deferred.promise);
// Initialize the source editor and store the newly created instance
// in the ether of a resolved promise's value.
let editor = new Editor(DEFAULT_EDITOR_CONFIG);
editor.appendTo($(id)).then(() => deferred.resolve(editor));
return deferred.promise;
},
_body: null,
_detailsPane: null,
_editorPromises: new Map()
};
/**

View File

@ -217,42 +217,8 @@
</tabpanel>
<tabpanel id="response-tabpanel"
class="tabpanel-content">
<vbox flex="1">
<label id="response-content-info-header"/>
<vbox id="response-content-json-box" flex="1" hidden="true">
<vbox id="response-content-json" flex="1" context="network-response-popup" />
</vbox>
<vbox id="response-content-textarea-box" flex="1" hidden="true">
<vbox id="response-content-textarea" flex="1"/>
</vbox>
<vbox id="response-content-image-box" flex="1" hidden="true">
<image id="response-content-image"/>
<hbox>
<label class="plain tabpanel-summary-label"
data-localization="content=netmonitor.response.name"/>
<label id="response-content-image-name-value"
class="plain tabpanel-summary-value devtools-monospace"
crop="end"
flex="1"/>
</hbox>
<hbox>
<label class="plain tabpanel-summary-label"
data-localization="content=netmonitor.response.dimensions"/>
<label id="response-content-image-dimensions-value"
class="plain tabpanel-summary-value devtools-monospace"
crop="end"
flex="1"/>
</hbox>
<hbox>
<label class="plain tabpanel-summary-label"
data-localization="content=netmonitor.response.mime"/>
<label id="response-content-image-mime-value"
class="plain tabpanel-summary-value devtools-monospace"
crop="end"
flex="1"/>
</hbox>
</vbox>
</vbox>
<html:div xmlns="http://www.w3.org/1999/xhtml"
id="react-response-tabpanel-hook"/>
</tabpanel>
<tabpanel id="timings-tabpanel"
class="tabpanel-content">

View File

@ -263,10 +263,8 @@ RequestsMenuView.prototype = {
payload.responseContentDataUri = formDataURI(mimeType, encoding, response);
}
if (mimeType.includes("text/")) {
responseContent.content.text = response;
payload.responseContent = responseContent;
}
responseContent.content.text = response;
payload.responseContent = responseContent;
yield this.store.dispatch(Actions.updateRequest(action.id, payload, true));

View File

@ -16,22 +16,28 @@ const Editor = createClass({
displayName: "Editor",
propTypes: {
// Source editor syntax hightligh mode, which is a mime type defined in CodeMirror
mode: PropTypes.string,
// Source editor is displayed if set to true
open: PropTypes.bool,
// Source editor content
text: PropTypes.string,
},
getDefaultProps() {
return {
mode: null,
open: true,
text: "",
};
},
componentDidMount() {
const { text } = this.props;
const { mode, text } = this.props;
this.editor = new SourceEditor({
lineNumbers: true,
mode,
readOnly: true,
value: text,
});
@ -56,8 +62,8 @@ const Editor = createClass({
this.deferEditor.then(() => {
// FIXME: Workaround for browser_net_accessibility test to
// make sure editor node exists while setting editor text.
// deferEditor workround should be removed in bug 1308442
if (this.refs.editor) {
// deferEditor workaround should be removed in bug 1308442
if (this.refs.editorElement) {
this.editor.setText(text);
}
});

View File

@ -7,6 +7,7 @@ DevToolsModules(
'params-panel.js',
'preview-panel.js',
'properties-view.js',
'response-panel.js',
'security-panel.js',
'timings-panel.js',
)

View File

@ -195,3 +195,4 @@ const PropertiesView = createClass({
});
module.exports = PropertiesView;

View File

@ -0,0 +1,204 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const {
createClass,
createFactory,
DOM,
PropTypes,
} = require("devtools/client/shared/vendor/react");
const { connect } = require("devtools/client/shared/vendor/react-redux");
const { L10N } = require("../../l10n");
const { getSelectedRequest } = require("../../selectors/index");
const { formDataURI, getUrlBaseName } = require("../../request-utils");
// Components
const PropertiesView = createFactory(require("./properties-view"));
const { div, img } = DOM;
const JSON_SCOPE_NAME = L10N.getStr("jsonScopeName");
const JSON_FILTER_TEXT = L10N.getStr("jsonFilterText");
const RESPONSE_IMG_NAME = L10N.getStr("netmonitor.response.name");
const RESPONSE_IMG_DIMENSIONS = L10N.getStr("netmonitor.response.dimensions");
const RESPONSE_IMG_MIMETYPE = L10N.getStr("netmonitor.response.mime");
const RESPONSE_PAYLOAD = L10N.getStr("responsePayload");
/*
* Response panel component
* Displays the GET parameters and POST data of a request
*/
const ResponsePanel = createClass({
displayName: "ResponsePanel",
propTypes: {
encoding: PropTypes.string,
mimeType: PropTypes.string,
response: PropTypes.string,
url: PropTypes.string,
},
getInitialState() {
return {
imageDimensions: {
width: 0,
height: 0,
},
};
},
updateImageDimemsions({ target }) {
this.setState({
imageDimensions: {
width: target.naturalWidth,
height: target.naturalHeight,
},
});
},
// Handle json, which we tentatively identify by checking the MIME type
// for "json" after any word boundary. This works for the standard
// "application/json", and also for custom types like "x-bigcorp-json".
// Additionally, we also directly parse the response text content to
// verify whether it's json or not, to handle responses incorrectly
// labeled as text/plain instead.
isJSON(mimeType, response) {
let json, error;
try {
json = JSON.parse(response);
} catch (err) {
error = err;
}
if (/\bjson/.test(mimeType) || json) {
// Extract the actual json substring in case this might be a "JSONP".
// This regex basically parses a function call and captures the
// function name and arguments in two separate groups.
let jsonpRegex = /^\s*([\w$]+)\s*\(\s*([^]*)\s*\)\s*;?\s*$/;
let [, jsonpCallback, jsonp] = response.match(jsonpRegex) || [];
let result = {};
// Make sure this is a valid JSON object first. If so, nicely display
// the parsing results in a tree view.
if (jsonpCallback && jsonp) {
error = null;
try {
json = JSON.parse(jsonp);
} catch (err) {
error = err;
}
}
// Valid JSON
if (json) {
result.json = json;
}
// Valid JSONP
if (jsonpCallback) {
result.jsonpCallback = jsonpCallback;
}
// Malformed JSON
if (error) {
result.error = "" + error;
}
return result;
}
return null;
},
render() {
const { encoding, mimeType, response, url } = this.props;
if (!mimeType || !url || typeof response !== "string") {
return null;
}
if (mimeType.includes("image/")) {
let { width, height } = this.state.imageDimensions;
return (
div({ className: "response-image-box devtools-monospace" },
img({
className: "response-image",
src: formDataURI(mimeType, encoding, response),
onLoad: this.updateImageDimemsions,
}),
div({ className: "response-summary" },
div({ className: "tabpanel-summary-label" }, RESPONSE_IMG_NAME),
div({ className: "tabpanel-summary-value" }, getUrlBaseName(url)),
),
div({ className: "response-summary" },
div({ className: "tabpanel-summary-label" }, RESPONSE_IMG_DIMENSIONS),
div({ className: "tabpanel-summary-value" }, `${width} × ${height}`),
),
div({ className: "response-summary" },
div({ className: "tabpanel-summary-label" }, RESPONSE_IMG_MIMETYPE),
div({ className: "tabpanel-summary-value" }, mimeType),
),
)
);
}
// Display Properties View
let { json, jsonpCallback, error } = this.isJSON(mimeType, response) || {};
let object = {};
let sectionName;
if (json) {
if (jsonpCallback) {
sectionName = L10N.getFormatStr("jsonpScopeName", jsonpCallback);
} else {
sectionName = JSON_SCOPE_NAME;
}
object[sectionName] = json;
} else {
sectionName = RESPONSE_PAYLOAD;
object[sectionName] = {
EDITOR_CONFIG: {
text: response,
mode: mimeType.replace(/;.+/, ""),
},
};
}
return (
div({},
error && div({ className: "response-error-header", title: error },
error
),
PropertiesView({
object,
filterPlaceHolder: JSON_FILTER_TEXT,
sectionNames: [sectionName],
}),
)
);
}
});
module.exports = connect(
(state) => {
const selectedRequest = getSelectedRequest(state);
if (selectedRequest) {
const { responseContent, url } = selectedRequest;
if (responseContent) {
const { encoding, mimeType, text } = responseContent.content;
return {
encoding,
mimeType,
response: text,
url,
};
}
}
return {};
},
)(ResponsePanel);

View File

@ -122,9 +122,6 @@ add_task(function* () {
EventUtils.sendKey("DOWN", window);
check(19, true);
EventUtils.sendMouseEvent({ type: "mousedown" }, $("#details-pane-toggle"));
check(-1, false);
EventUtils.sendMouseEvent({ type: "mousedown" }, $(".request-list-item"));
check(0, true);

View File

@ -16,7 +16,7 @@ add_task(function* () {
let { tab, monitor } = yield initNetMonitor(BROTLI_URL);
info("Starting test... ");
let { document, Editor, NetMonitorView } = monitor.panelWin;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
@ -38,54 +38,28 @@ add_task(function* () {
time: true
});
let onEvent = waitForResponseBodyDisplayed();
wait = waitForDOM(document, "#response-tabpanel .editor-mount iframe");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
yield onEvent;
yield testResponseTab("br");
let [editorFrame] = yield wait;
yield once(editorFrame, "DOMContentLoaded");
yield waitForDOM(editorFrame.contentDocument, ".CodeMirror-code");
yield testResponse("br");
yield teardown(monitor);
function* testResponseTab(type) {
let tabEl = document.querySelectorAll("#details-pane tab")[3];
let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3];
is(tabEl.getAttribute("selected"), "true",
"The response tab in the network details pane should be selected.");
function checkVisibility(box) {
is(tabpanel.querySelector("#response-content-info-header")
.hasAttribute("hidden"), true,
"The response info header doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-json-box")
.hasAttribute("hidden"), box != "json",
"The response content json box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-textarea-box")
.hasAttribute("hidden"), box != "textarea",
"The response content textarea box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-image-box")
.hasAttribute("hidden"), box != "image",
"The response content image box doesn't have the intended visibility.");
}
function* testResponse(type) {
switch (type) {
case "br": {
checkVisibility("textarea");
let text = editorFrame.contentDocument
.querySelector(".CodeMirror-line").textContent;
let expected = "X".repeat(64);
let editor = yield NetMonitorView.editor("#response-content-textarea");
is(editor.getText(), expected,
is(text, "X".repeat(64),
"The text shown in the source editor is incorrect for the brotli request.");
is(editor.getMode(), Editor.modes.text,
"The mode active in the source editor is incorrect for the brotli request.");
break;
}
}
}
function waitForResponseBodyDisplayed() {
return monitor.panelWin.once(monitor.panelWin.EVENTS.RESPONSE_BODY_DISPLAYED);
}
});

View File

@ -13,7 +13,7 @@ add_task(function* () {
let { tab, monitor } = yield initNetMonitor(CONTENT_TYPE_WITHOUT_CACHE_URL);
info("Starting test... ");
let { document, Editor, NetMonitorView } = monitor.panelWin;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
@ -90,166 +90,175 @@ add_task(function* () {
time: true
});
let onEvent = waitForResponseBodyDisplayed();
wait = waitForDOM(document, "#response-tabpanel");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
yield onEvent;
yield wait;
RequestsMenu.selectedIndex = -1;
yield selectIndexAndWaitForEditor(0);
yield testResponseTab("xml");
yield selectIndexAndWaitForTabUpdated(1);
yield selectIndexAndWaitForEditor(1);
yield testResponseTab("css");
yield selectIndexAndWaitForTabUpdated(2);
yield selectIndexAndWaitForEditor(2);
yield testResponseTab("js");
yield selectIndexAndWaitForTabUpdated(3);
yield selectIndexAndWaitForJSONView(3);
yield testResponseTab("json");
yield selectIndexAndWaitForTabUpdated(4);
yield selectIndexAndWaitForEditor(4);
yield testResponseTab("html");
yield selectIndexAndWaitForTabUpdated(5);
yield selectIndexAndWaitForImageView(5);
yield testResponseTab("png");
yield selectIndexAndWaitForTabUpdated(6);
yield selectIndexAndWaitForEditor(6);
yield testResponseTab("gzip");
yield teardown(monitor);
function* testResponseTab(type) {
let tabEl = document.querySelectorAll("#details-pane tab")[3];
let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3];
is(tabEl.getAttribute("selected"), "true",
"The response tab in the network details pane should be selected.");
function checkVisibility(box) {
is(tabpanel.querySelector("#response-content-info-header")
.hasAttribute("hidden"), true,
"The response info header doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-json-box")
.hasAttribute("hidden"), box != "json",
"The response content json box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-textarea-box")
.hasAttribute("hidden"), box != "textarea",
"The response content textarea box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-image-box")
.hasAttribute("hidden"), box != "image",
"The response content image box doesn't have the intended visibility.");
is(tabpanel.querySelector(".response-error-header") === null,
true,
"The response error header doesn't display");
let jsonView = tabpanel.querySelector(".tree-section .treeLabel") || {};
is(jsonView.textContent !== L10N.getStr("jsonScopeName"),
box != "json",
"The response json view doesn't display");
is(tabpanel.querySelector(".editor-mount") === null,
box != "textarea",
"The response editor doesn't display");
is(tabpanel.querySelector(".response-image-box") === null,
box != "image",
"The response image view doesn't display");
}
switch (type) {
case "xml": {
checkVisibility("textarea");
let editor = yield NetMonitorView.editor("#response-content-textarea");
is(editor.getText(), "<label value='greeting'>Hello XML!</label>",
let editor = tabpanel.querySelector(".editor-mount iframe");
let text = editor.contentDocument .querySelector(".CodeMirror-line").textContent;
is(text, "<label value='greeting'>Hello XML!</label>",
"The text shown in the source editor is incorrect for the xml request.");
is(editor.getMode(), Editor.modes.html,
"The mode active in the source editor is incorrect for the xml request.");
break;
}
case "css": {
checkVisibility("textarea");
let editor = yield NetMonitorView.editor("#response-content-textarea");
is(editor.getText(), "body:pre { content: 'Hello CSS!' }",
"The text shown in the source editor is incorrect for the xml request.");
is(editor.getMode(), Editor.modes.css,
"The mode active in the source editor is incorrect for the xml request.");
let editor = tabpanel.querySelector(".editor-mount iframe");
let text = editor.contentDocument.querySelector(".CodeMirror-line").textContent;
is(text, "body:pre { content: 'Hello CSS!' }",
"The text shown in the source editor is incorrect for the css request.");
break;
}
case "js": {
checkVisibility("textarea");
let editor = yield NetMonitorView.editor("#response-content-textarea");
is(editor.getText(), "function() { return 'Hello JS!'; }",
"The text shown in the source editor is incorrect for the xml request.");
is(editor.getMode(), Editor.modes.js,
"The mode active in the source editor is incorrect for the xml request.");
let editor = tabpanel.querySelector(".editor-mount iframe");
let text = editor.contentDocument.querySelector(".CodeMirror-line").textContent;
is(text, "function() { return 'Hello JS!'; }",
"The text shown in the source editor is incorrect for the js request.");
break;
}
case "json": {
checkVisibility("json");
is(tabpanel.querySelectorAll(".variables-view-scope").length, 1,
"There should be 1 json scope displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-property").length, 2,
"There should be 2 json properties displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 0,
is(tabpanel.querySelectorAll(".tree-section").length, 1,
"There should be 1 tree sections displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".empty-notice").length, 0,
"The empty notice should not be displayed in this tabpanel.");
let jsonScope = tabpanel.querySelectorAll(".variables-view-scope")[0];
is(jsonScope.querySelector(".name").getAttribute("value"),
is(tabpanel.querySelector(".tree-section .treeLabel").textContent,
L10N.getStr("jsonScopeName"),
"The json scope doesn't have the correct title.");
"The json view section doesn't have the correct title.");
is(jsonScope.querySelectorAll(".variables-view-property .name")[0]
.getAttribute("value"),
"greeting", "The first json property name was incorrect.");
is(jsonScope.querySelectorAll(".variables-view-property .value")[0]
.getAttribute("value"),
let labels = tabpanel
.querySelectorAll("tr:not(.tree-section) .treeLabelCell .treeLabel");
let values = tabpanel
.querySelectorAll("tr:not(.tree-section) .treeValueCell .objectBox");
is(labels[0].textContent, "greeting",
"The first json property name was incorrect.");
is(values[0].textContent,
"\"Hello JSON!\"", "The first json property value was incorrect.");
is(jsonScope.querySelectorAll(".variables-view-property .name")[1]
.getAttribute("value"),
"__proto__", "The second json property name was incorrect.");
is(jsonScope.querySelectorAll(".variables-view-property .value")[1]
.getAttribute("value"),
"Object", "The second json property value was incorrect.");
break;
}
case "html": {
checkVisibility("textarea");
let editor = yield NetMonitorView.editor("#response-content-textarea");
is(editor.getText(), "<blink>Not Found</blink>",
"The text shown in the source editor is incorrect for the xml request.");
is(editor.getMode(), Editor.modes.html,
"The mode active in the source editor is incorrect for the xml request.");
let editor = document.querySelector(".editor-mount iframe");
let text = editor.contentDocument.querySelector(".CodeMirror-line").textContent;
is(text, "<blink>Not Found</blink>",
"The text shown in the source editor is incorrect for the html request.");
break;
}
case "png": {
checkVisibility("image");
let imageNode = tabpanel.querySelector("#response-content-image");
yield once(imageNode, "load");
let [name, dimensions, mime] = tabpanel
.querySelectorAll(".response-image-box .tabpanel-summary-value");
is(tabpanel.querySelector("#response-content-image-name-value")
.getAttribute("value"), "test-image.png",
is(name.textContent, "test-image.png",
"The image name info isn't correct.");
is(tabpanel.querySelector("#response-content-image-mime-value")
.getAttribute("value"), "image/png",
is(mime.textContent, "image/png",
"The image mime info isn't correct.");
is(tabpanel.querySelector("#response-content-image-dimensions-value")
.getAttribute("value"), "16" + " \u00D7 " + "16",
is(dimensions.textContent, "16" + " \u00D7 " + "16",
"The image dimensions info isn't correct.");
break;
}
case "gzip": {
checkVisibility("textarea");
let expected = new Array(1000).join("Hello gzip!");
let editor = yield NetMonitorView.editor("#response-content-textarea");
is(editor.getText(), expected,
let editor = tabpanel.querySelector(".editor-mount iframe");
let text = editor.contentDocument.querySelector(".CodeMirror-line").textContent;
is(text, new Array(1000).join("Hello gzip!"),
"The text shown in the source editor is incorrect for the gzip request.");
is(editor.getMode(), Editor.modes.text,
"The mode active in the source editor is incorrect for the gzip request.");
break;
}
}
}
function selectIndexAndWaitForTabUpdated(index) {
let onTabUpdated = monitor.panelWin.once(monitor.panelWin.EVENTS.TAB_UPDATED);
RequestsMenu.selectedIndex = index;
return onTabUpdated;
function* selectIndexAndWaitForEditor(index) {
let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3];
let editor = tabpanel.querySelector(".editor-mount iframe");
if (!editor) {
let waitDOM = waitForDOM(tabpanel, ".editor-mount iframe");
RequestsMenu.selectedIndex = index;
[editor] = yield waitDOM;
yield once(editor, "DOMContentLoaded");
} else {
RequestsMenu.selectedIndex = index;
}
yield waitForDOM(editor.contentDocument, ".CodeMirror-code");
}
function waitForResponseBodyDisplayed() {
return monitor.panelWin.once(monitor.panelWin.EVENTS.RESPONSE_BODY_DISPLAYED);
function* selectIndexAndWaitForJSONView(index) {
let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3];
let waitDOM = waitForDOM(tabpanel, ".treeTable");
RequestsMenu.selectedIndex = index;
yield waitDOM;
}
function* selectIndexAndWaitForImageView(index) {
let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3];
let waitDOM = waitForDOM(tabpanel, ".response-image");
RequestsMenu.selectedIndex = index;
let [imageNode] = yield waitDOM;
yield once(imageNode, "load");
}
});

View File

@ -11,7 +11,7 @@ add_task(function* () {
let { tab, monitor } = yield initNetMonitor(CYRILLIC_URL);
info("Starting test... ");
let { document, EVENTS, Editor, NetMonitorView } = monitor.panelWin;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
@ -28,18 +28,19 @@ add_task(function* () {
statusText: "DA DA DA"
});
wait = waitForDOM(document, "#response-tabpanel .editor-mount iframe");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
let [editor] = yield wait;
yield once(editor, "DOMContentLoaded");
yield waitForDOM(editor.contentDocument, ".CodeMirror-code");
let text = editor.contentDocument
.querySelector(".CodeMirror-line").textContent;
yield monitor.panelWin.once(EVENTS.RESPONSE_BODY_DISPLAYED);
let editor = yield NetMonitorView.editor("#response-content-textarea");
// u044F = я
is(editor.getText().indexOf("\u044F"), 26,
ok(text.includes("\u0411\u0440\u0430\u0442\u0430\u043d"),
"The text shown in the source editor is correct.");
is(editor.getMode(), Editor.modes.text,
"The mode active in the source editor is correct.");
yield teardown(monitor);
});

View File

@ -12,7 +12,7 @@ add_task(function* () {
let { tab, monitor } = yield initNetMonitor(CYRILLIC_URL);
info("Starting test... ");
let { document, EVENTS, Editor, NetMonitorView } = monitor.panelWin;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
@ -27,18 +27,19 @@ add_task(function* () {
statusText: "OK"
});
wait = waitForDOM(document, "#response-tabpanel .editor-mount iframe");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
let [editor] = yield wait;
yield once(editor, "DOMContentLoaded");
yield waitForDOM(editor.contentDocument, ".CodeMirror-code");
let text = editor.contentDocument
.querySelector(".CodeMirror-code").textContent;
yield monitor.panelWin.once(EVENTS.RESPONSE_BODY_DISPLAYED);
let editor = yield NetMonitorView.editor("#response-content-textarea");
// u044F = я
is(editor.getText().indexOf("\u044F"), 486,
ok(text.includes("\u0411\u0440\u0430\u0442\u0430\u043d"),
"The text shown in the source editor is correct.");
is(editor.getMode(), Editor.modes.html,
"The mode active in the source editor is correct.");
return teardown(monitor);
});

View File

@ -17,7 +17,7 @@ add_task(function* () {
// in a variables view instance. Debug builds are slow.
requestLongerTimeout(4);
let { document, EVENTS, NetMonitorView } = monitor.panelWin;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
@ -39,60 +39,54 @@ add_task(function* () {
time: true
});
let onEvent = monitor.panelWin.once(EVENTS.RESPONSE_BODY_DISPLAYED);
wait = waitForDOM(document, "#response-tabpanel");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
yield onEvent;
yield wait;
testResponseTab();
yield teardown(monitor);
function testResponseTab() {
let tabEl = document.querySelectorAll("#details-pane tab")[3];
let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3];
is(tabEl.getAttribute("selected"), "true",
"The response tab in the network details pane should be selected.");
is(tabpanel.querySelector(".response-error-header") === null, true,
"The response error header doesn't have the intended visibility.");
let jsonView = tabpanel.querySelector(".tree-section .treeLabel") || {};
is(jsonView.textContent === L10N.getStr("jsonScopeName"), true,
"The response json view has the intended visibility.");
is(tabpanel.querySelector(".editor-mount iframe") === null, true,
"The response editor doesn't have the intended visibility.");
is(tabpanel.querySelector(".response-image-box") === null, true,
"The response image box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-info-header")
.hasAttribute("hidden"), true,
"The response info header doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-json-box")
.hasAttribute("hidden"), false,
"The response content json box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-textarea-box")
.hasAttribute("hidden"), true,
"The response content textarea box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-image-box")
.hasAttribute("hidden"), true,
"The response content image box doesn't have the intended visibility.");
is(tabpanel.querySelectorAll(".variables-view-scope").length, 1,
"There should be 1 json scope displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-property").length, 6143,
"There should be 6143 json properties displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 0,
is(tabpanel.querySelectorAll(".tree-section").length, 1,
"There should be 1 tree sections displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".treeRow:not(.tree-section)").length, 4094,
"There should be 4094 json properties displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".empty-notice").length, 0,
"The empty notice should not be displayed in this tabpanel.");
let jsonScope = tabpanel.querySelectorAll(".variables-view-scope")[0];
let names = ".variables-view-property > .title > .name";
let values = ".variables-view-property > .title > .value";
is(jsonScope.querySelector(".name").getAttribute("value"),
is(tabpanel.querySelector(".tree-section .treeLabel").textContent,
L10N.getStr("jsonScopeName"),
"The json scope doesn't have the correct title.");
"The json view section doesn't have the correct title.");
is(jsonScope.querySelectorAll(names)[0].getAttribute("value"),
"0", "The first json property name was incorrect.");
is(jsonScope.querySelectorAll(values)[0].getAttribute("value"),
"Object", "The first json property value was incorrect.");
let labels = tabpanel
.querySelectorAll("tr:not(.tree-section) .treeLabelCell .treeLabel");
let values = tabpanel
.querySelectorAll("tr:not(.tree-section) .treeValueCell .objectBox");
is(jsonScope.querySelectorAll(names)[1].getAttribute("value"),
"greeting", "The second json property name was incorrect.");
is(jsonScope.querySelectorAll(values)[1].getAttribute("value"),
"\"Hello long string JSON!\"", "The second json property value was incorrect.");
is(labels[0].textContent, "0",
"The first json property name was incorrect.");
is(values[0].textContent, "Object",
"The first json property value was incorrect.");
is(labels[1].textContent, "greeting",
"The second json property name was incorrect.");
is(values[1].textContent, "\"Hello long string JSON!\"",
"The second json property value was incorrect.");
}
});

View File

@ -8,10 +8,11 @@
*/
add_task(function* () {
let { L10N } = require("devtools/client/netmonitor/l10n");
let { tab, monitor } = yield initNetMonitor(JSON_MALFORMED_URL);
info("Starting test... ");
let { document, EVENTS, Editor, NetMonitorView } = monitor.panelWin;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
@ -30,48 +31,40 @@ add_task(function* () {
fullMimeType: "text/json; charset=utf-8"
});
let onEvent = monitor.panelWin.once(EVENTS.RESPONSE_BODY_DISPLAYED);
wait = waitForDOM(document, "#response-tabpanel .editor-mount iframe");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
yield onEvent;
let [editor] = yield wait;
yield once(editor, "DOMContentLoaded");
yield waitForDOM(editor.contentDocument, ".CodeMirror-code");
let tabEl = document.querySelectorAll("#details-pane tab")[3];
let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3];
is(tabEl.getAttribute("selected"), "true",
"The response tab in the network details pane should be selected.");
is(tabpanel.querySelector("#response-content-info-header")
.hasAttribute("hidden"), false,
"The response info header doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-info-header")
.getAttribute("value"),
is(tabpanel.querySelector(".response-error-header") === null, false,
"The response error header doesn't have the intended visibility.");
is(tabpanel.querySelector(".response-error-header").textContent,
"SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data" +
" at line 1 column 40 of the JSON data",
"The response info header doesn't have the intended value attribute.");
is(tabpanel.querySelector("#response-content-info-header")
.getAttribute("tooltiptext"),
"The response error header doesn't have the intended text content.");
is(tabpanel.querySelector(".response-error-header").getAttribute("title"),
"SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data" +
" at line 1 column 40 of the JSON data",
"The response info header doesn't have the intended tooltiptext attribute.");
"The response error header doesn't have the intended tooltiptext attribute.");
let jsonView = tabpanel.querySelector(".tree-section .treeLabel") || {};
is(jsonView.textContent === L10N.getStr("jsonScopeName"), false,
"The response json view doesn't have the intended visibility.");
is(tabpanel.querySelector(".editor-mount iframe") === null, false,
"The response editor doesn't have the intended visibility.");
is(tabpanel.querySelector(".response-image-box") === null, true,
"The response image box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-json-box")
.hasAttribute("hidden"), true,
"The response content json box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-textarea-box")
.hasAttribute("hidden"), false,
"The response content textarea box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-image-box")
.hasAttribute("hidden"), true,
"The response content image box doesn't have the intended visibility.");
// Strip CodeMirror line number through slice(1)
let text = editor.contentDocument
.querySelector(".CodeMirror-line").textContent;
let editor = yield NetMonitorView.editor("#response-content-textarea");
is(editor.getText(), "{ \"greeting\": \"Hello malformed JSON!\" },",
is(text, "{ \"greeting\": \"Hello malformed JSON!\" },",
"The text shown in the source editor is incorrect.");
is(editor.getMode(), Editor.modes.js,
"The mode active in the source editor is incorrect.");
yield teardown(monitor);
});

View File

@ -13,7 +13,7 @@ add_task(function* () {
let { tab, monitor } = yield initNetMonitor(JSON_CUSTOM_MIME_URL);
info("Starting test... ");
let { document, EVENTS, NetMonitorView } = monitor.panelWin;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
@ -34,57 +34,45 @@ add_task(function* () {
time: true
});
let onEvent = monitor.panelWin.once(EVENTS.RESPONSE_BODY_DISPLAYED);
wait = waitForDOM(document, "#response-tabpanel");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
yield onEvent;
yield wait;
testResponseTab();
yield teardown(monitor);
function testResponseTab() {
let tabEl = document.querySelectorAll("#details-pane tab")[3];
let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3];
is(tabEl.getAttribute("selected"), "true",
"The response tab in the network details pane should be selected.");
is(tabpanel.querySelector(".response-error-header") === null, true,
"The response error header doesn't have the intended visibility.");
let jsonView = tabpanel.querySelector(".tree-section .treeLabel") || {};
is(jsonView.textContent === L10N.getStr("jsonScopeName"), true,
"The response json view has the intended visibility.");
is(tabpanel.querySelector(".editor-mount iframe") === null, true,
"The response editor doesn't have the intended visibility.");
is(tabpanel.querySelector(".response-image-box") === null, true,
"The response image box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-info-header")
.hasAttribute("hidden"), true,
"The response info header doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-json-box")
.hasAttribute("hidden"), false,
"The response content json box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-textarea-box")
.hasAttribute("hidden"), true,
"The response content textarea box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-image-box")
.hasAttribute("hidden"), true,
"The response content image box doesn't have the intended visibility.");
is(tabpanel.querySelectorAll(".variables-view-scope").length, 1,
"There should be 1 json scope displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-property").length, 2,
"There should be 2 json properties displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 0,
is(tabpanel.querySelectorAll(".tree-section").length, 1,
"There should be 1 tree sections displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".treeRow:not(.tree-section)").length, 1,
"There should be 1 json properties displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".empty-notice").length, 0,
"The empty notice should not be displayed in this tabpanel.");
let jsonScope = tabpanel.querySelectorAll(".variables-view-scope")[0];
is(jsonScope.querySelectorAll(".variables-view-property .name")[0]
.getAttribute("value"),
"greeting", "The first json property name was incorrect.");
is(jsonScope.querySelectorAll(".variables-view-property .value")[0]
.getAttribute("value"),
"\"Hello oddly-named JSON!\"", "The first json property value was incorrect.");
let labels = tabpanel
.querySelectorAll("tr:not(.tree-section) .treeLabelCell .treeLabel");
let values = tabpanel
.querySelectorAll("tr:not(.tree-section) .treeValueCell .objectBox");
is(jsonScope.querySelectorAll(".variables-view-property .name")[1]
.getAttribute("value"),
"__proto__", "The second json property name was incorrect.");
is(jsonScope.querySelectorAll(".variables-view-property .value")[1]
.getAttribute("value"),
"Object", "The second json property value was incorrect.");
is(labels[0].textContent, "greeting",
"The first json property name was incorrect.");
is(values[0].textContent, "\"Hello oddly-named JSON!\"",
"The first json property value was incorrect.");
}
});

View File

@ -13,7 +13,7 @@ add_task(function* () {
let { tab, monitor } = yield initNetMonitor(JSON_TEXT_MIME_URL);
info("Starting test... ");
let { document, EVENTS, NetMonitorView } = monitor.panelWin;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
@ -34,57 +34,45 @@ add_task(function* () {
time: true
});
let onEvent = monitor.panelWin.once(EVENTS.RESPONSE_BODY_DISPLAYED);
wait = waitForDOM(document, "#response-tabpanel");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
yield onEvent;
yield wait;
testResponseTab();
yield teardown(monitor);
function testResponseTab() {
let tabEl = document.querySelectorAll("#details-pane tab")[3];
let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3];
is(tabEl.getAttribute("selected"), "true",
"The response tab in the network details pane should be selected.");
is(tabpanel.querySelector(".response-error-header") === null, true,
"The response error header doesn't have the intended visibility.");
let jsonView = tabpanel.querySelector(".tree-section .treeLabel") || {};
is(jsonView.textContent === L10N.getStr("jsonScopeName"), true,
"The response json view has the intended visibility.");
is(tabpanel.querySelector(".editor-mount iframe") === null, true,
"The response editor doesn't have the intended visibility.");
is(tabpanel.querySelector(".response-image-box") === null, true,
"The response image box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-info-header")
.hasAttribute("hidden"), true,
"The response info header doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-json-box")
.hasAttribute("hidden"), false,
"The response content json box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-textarea-box")
.hasAttribute("hidden"), true,
"The response content textarea box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-image-box")
.hasAttribute("hidden"), true,
"The response content image box doesn't have the intended visibility.");
is(tabpanel.querySelectorAll(".variables-view-scope").length, 1,
"There should be 1 json scope displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-property").length, 2,
"There should be 2 json properties displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 0,
is(tabpanel.querySelectorAll(".tree-section").length, 1,
"There should be 1 tree sections displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".treeRow:not(.tree-section)").length, 1,
"There should be 1 json properties displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".empty-notice").length, 0,
"The empty notice should not be displayed in this tabpanel.");
let jsonScope = tabpanel.querySelectorAll(".variables-view-scope")[0];
is(jsonScope.querySelectorAll(".variables-view-property .name")[0]
.getAttribute("value"),
"greeting", "The first json property name was incorrect.");
is(jsonScope.querySelectorAll(".variables-view-property .value")[0]
.getAttribute("value"),
"\"Hello third-party JSON!\"", "The first json property value was incorrect.");
let labels = tabpanel
.querySelectorAll("tr:not(.tree-section) .treeLabelCell .treeLabel");
let values = tabpanel
.querySelectorAll("tr:not(.tree-section) .treeValueCell .objectBox");
is(jsonScope.querySelectorAll(".variables-view-property .name")[1]
.getAttribute("value"),
"__proto__", "The second json property name was incorrect.");
is(jsonScope.querySelectorAll(".variables-view-property .value")[1]
.getAttribute("value"),
"Object", "The second json property value was incorrect.");
is(labels[0].textContent, "greeting",
"The first json property name was incorrect.");
is(values[0].textContent, "\"Hello third-party JSON!\"",
"The first json property value was incorrect.");
}
});

View File

@ -13,11 +13,10 @@ add_task(function* () {
let { tab, monitor } = yield initNetMonitor(JSONP_URL);
info("Starting test... ");
let { document, EVENTS, NetMonitorView } = monitor.panelWin;
let { RequestsMenu, NetworkDetails } = NetMonitorView;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
NetworkDetails._json.lazyEmpty = false;
let wait = waitForNetworkEvents(monitor, 2);
yield ContentTask.spawn(tab.linkedBrowser, {}, function* () {
@ -44,68 +43,51 @@ add_task(function* () {
time: true
});
let onEvent = monitor.panelWin.once(EVENTS.RESPONSE_BODY_DISPLAYED);
wait = waitForDOM(document, "#response-tabpanel");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
yield onEvent;
yield wait;
testResponseTab("$_0123Fun", "\"Hello JSONP!\"");
onEvent = monitor.panelWin.once(EVENTS.RESPONSE_BODY_DISPLAYED);
wait = waitForDOM(document, "#response-tabpanel .tree-section");
RequestsMenu.selectedIndex = 1;
yield onEvent;
yield wait;
testResponseTab("$_4567Sad", "\"Hello weird JSONP!\"");
yield teardown(monitor);
function testResponseTab(func, greeting) {
let tabEl = document.querySelectorAll("#details-pane tab")[3];
let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3];
is(tabEl.getAttribute("selected"), "true",
"The response tab in the network details pane should be selected.");
is(tabpanel.querySelector(".response-error-header") === null, true,
"The response error header doesn't have the intended visibility.");
is(tabpanel.querySelector(".tree-section .treeLabel").textContent,
L10N.getFormatStr("jsonpScopeName", func),
"The response json view has the intened visibility and correct title.");
is(tabpanel.querySelector(".editor-mount iframe") === null, true,
"The response editor doesn't have the intended visibility.");
is(tabpanel.querySelector(".responseImageBox") === null, true,
"The response image box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-info-header")
.hasAttribute("hidden"), true,
"The response info header doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-json-box")
.hasAttribute("hidden"), false,
"The response content json box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-textarea-box")
.hasAttribute("hidden"), true,
"The response content textarea box doesn't have the intended visibility.");
is(tabpanel.querySelector("#response-content-image-box")
.hasAttribute("hidden"), true,
"The response content image box doesn't have the intended visibility.");
is(tabpanel.querySelectorAll(".variables-view-scope").length, 1,
"There should be 1 json scope displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-property").length, 2,
"There should be 2 json properties displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 0,
is(tabpanel.querySelectorAll(".tree-section").length, 1,
"There should be 1 tree sections displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".treeRow:not(.tree-section)").length, 1,
"There should be 1 json properties displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".empty-notice").length, 0,
"The empty notice should not be displayed in this tabpanel.");
let jsonScope = tabpanel.querySelectorAll(".variables-view-scope")[0];
let labels = tabpanel
.querySelectorAll("tr:not(.tree-section) .treeLabelCell .treeLabel");
let values = tabpanel
.querySelectorAll("tr:not(.tree-section) .treeValueCell .objectBox");
is(jsonScope.querySelector(".name").getAttribute("value"),
L10N.getFormatStr("jsonpScopeName", func),
"The json scope doesn't have the correct title.");
is(jsonScope.querySelectorAll(".variables-view-property .name")[0]
.getAttribute("value"),
"greeting", "The first json property name was incorrect.");
is(jsonScope.querySelectorAll(".variables-view-property .value")[0]
.getAttribute("value"),
greeting, "The first json property value was incorrect.");
is(jsonScope.querySelectorAll(".variables-view-property .name")[1]
.getAttribute("value"),
"__proto__", "The second json property name was incorrect.");
is(jsonScope.querySelectorAll(".variables-view-property .value")[1]
.getAttribute("value"),
"Object", "The second json property value was incorrect.");
is(labels[0].textContent, "greeting",
"The first json property name was incorrect.");
is(values[0].textContent, greeting,
"The first json property value was incorrect.");
}
});

View File

@ -17,7 +17,7 @@ add_task(function* () {
// is going to be requested and displayed in the source editor.
requestLongerTimeout(2);
let { document, EVENTS, Editor, NetMonitorView } = monitor.panelWin;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
@ -34,18 +34,19 @@ add_task(function* () {
statusText: "OK"
});
let onEvent = monitor.panelWin.once(EVENTS.RESPONSE_BODY_DISPLAYED);
let waitDOM = waitForDOM(document, "#response-tabpanel .editor-mount iframe");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
yield onEvent;
let [editor] = yield waitDOM;
yield once(editor, "DOMContentLoaded");
yield waitForDOM(editor.contentDocument, ".CodeMirror-code");
let editor = yield NetMonitorView.editor("#response-content-textarea");
ok(editor.getText().match(/^<p>/),
"The text shown in the source editor is incorrect.");
is(editor.getMode(), Editor.modes.text,
"The mode active in the source editor is incorrect.");
let text = editor.contentDocument
.querySelector(".CodeMirror-line").textContent;
ok(text.match(/^<p>/), "The text shown in the source editor is incorrect.");
yield teardown(monitor);

View File

@ -9,8 +9,9 @@
add_task(function* () {
let { tab, monitor } = yield initNetMonitor(CUSTOM_GET_URL);
let { $, $all, EVENTS, NetMonitorView } = monitor.panelWin;
let { RequestsMenu, NetworkDetails } = NetMonitorView;
let { document, NetMonitorView } = monitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
info("Performing a secure request.");
@ -21,27 +22,20 @@ add_task(function* () {
});
yield wait;
info("Selecting the request.");
RequestsMenu.selectedIndex = 0;
wait = waitForDOM(document, "#security-tabpanel");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[5]);
yield wait;
info("Waiting for details pane to be updated.");
yield monitor.panelWin.once(EVENTS.TAB_UPDATED);
is(document.querySelector("#security-error"), null, "Error box is hidden.");
ok(document.querySelector("#security-information"), "Information box visible.");
info("Selecting security tab.");
NetworkDetails.widget.selectedIndex = 5;
let tabpanel = document.querySelector("#security-tabpanel");
let textboxes = tabpanel.querySelectorAll(".textbox-input");
info("Waiting for security tab to be updated.");
yield monitor.panelWin.once(EVENTS.TAB_UPDATED);
let errorbox = $("#security-error");
let infobox = $("#security-information");
is(errorbox, null, "Error box is hidden.");
ok(infobox, "Information box visible.");
let textboxes = $all(".textbox-input");
// Connection
// The protocol will be TLS but the exact version depends on which protocol
// the test server example.com supports.
let protocol = textboxes[0].value;
@ -54,8 +48,9 @@ add_task(function* () {
ok(suite.startsWith("TLS_"), "The suite " + suite + " seems valid.");
// Host
let hostLabel = $all(".treeLabel.objectLabel")[1];
is(hostLabel.textContent, "Host example.com:", "Label has the expected value.");
is(tabpanel.querySelectorAll(".treeLabel.objectLabel")[1].textContent,
"Host example.com:",
"Label has the expected value.");
is(textboxes[2].value, "Disabled", "Label has the expected value.");
is(textboxes[3].value, "Disabled", "Label has the expected value.");

View File

@ -13,12 +13,12 @@ add_task(function* () {
info("Starting test... ");
let { panelWin } = monitor;
let { document, Editor, NetMonitorView } = panelWin;
let { document, NetMonitorView } = panelWin;
let { RequestsMenu } = NetMonitorView;
const REQUESTS = [
[ "hls-m3u8", /^#EXTM3U/, Editor.modes.text ],
[ "mpeg-dash", /^<\?xml/, Editor.modes.html ]
[ "hls-m3u8", /^#EXTM3U/ ],
[ "mpeg-dash", /^<\?xml/ ]
];
RequestsMenu.lazyUpdate = false;
@ -40,30 +40,45 @@ add_task(function* () {
});
});
wait = waitForDOM(document, "#response-tabpanel");
EventUtils.sendMouseEvent({ type: "mousedown" },
document.getElementById("details-pane-toggle"));
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[3]);
yield panelWin.once(panelWin.EVENTS.RESPONSE_BODY_DISPLAYED);
let editor = yield NetMonitorView.editor("#response-content-textarea");
// the hls-m3u8 part
testEditorContent(editor, REQUESTS[0]);
wait = panelWin.once(panelWin.EVENTS.RESPONSE_BODY_DISPLAYED);
RequestsMenu.selectedIndex = 1;
yield wait;
RequestsMenu.selectedIndex = -1;
yield selectIndexAndWaitForEditor(0);
// the hls-m3u8 part
testEditorContent(REQUESTS[0]);
yield selectIndexAndWaitForEditor(1);
// the mpeg-dash part
testEditorContent(editor, REQUESTS[1]);
testEditorContent(REQUESTS[1]);
return teardown(monitor);
function testEditorContent(e, [ fmt, textRe, mode ]) {
ok(e.getText().match(textRe),
function* selectIndexAndWaitForEditor(index) {
let editor = document.querySelector("#response-tabpanel .editor-mount iframe");
if (!editor) {
let waitDOM = waitForDOM(document, "#response-tabpanel .editor-mount iframe");
RequestsMenu.selectedIndex = index;
[editor] = yield waitDOM;
yield once(editor, "DOMContentLoaded");
} else {
RequestsMenu.selectedIndex = index;
}
yield waitForDOM(editor.contentDocument, ".CodeMirror-code");
}
function testEditorContent([ fmt, textRe ]) {
let editor = document.querySelector("#response-tabpanel .editor-mount iframe");
let text = editor.contentDocument
.querySelector(".CodeMirror-line").textContent;
ok(text.match(textRe),
"The text shown in the source editor for " + fmt + " is correct.");
is(e.getMode(), mode,
"The mode active in the source editor for " + fmt + " is correct.");
}
});

View File

@ -717,22 +717,30 @@
/* Response tabpanel */
#response-content-info-header {
.response-error-header {
margin: 0;
padding: 3px 8px;
background-color: var(--theme-highlight-red);
color: var(--theme-selection-color);
}
#response-content-image-box {
padding-top: 10px;
padding-bottom: 10px;
.response-image-box {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
/* Minus 24px * 2 for toolbox height + tabpanel height + padding top + padding bottom */
height: calc(100vh - 68px);
overflow-y: auto;
padding: 10px;
}
#response-content-image {
.response-image {
background: #fff;
border: 1px dashed GrayText;
margin-bottom: 10px;
max-width: 100%;
max-height: 100%;
}
/* Preview tabpanel */
@ -1186,6 +1194,10 @@
padding: 3px 8px;
}
.response-summary {
display: flex;
}
.editor-container,
.editor-mount,
.editor-mount iframe {
@ -1200,6 +1212,7 @@
*/
#react-params-tabpanel-hook,
#react-preview-tabpanel-hook,
#react-response-tabpanel-hook,
#react-security-tabpanel-hook,
#react-timings-tabpanel-hook,
#network-statistics-charts,
@ -1212,6 +1225,7 @@
/* For vbox */
#react-params-tabpanel-hook,
#react-preview-tabpanel-hook,
#react-response-tabpanel-hook,
#react-security-tabpanel-hook,
#react-timings-tabpanel-hook,
#primed-cache-chart,

View File

@ -286,8 +286,16 @@ CanvasFrameAnonymousContentHelper.prototype = {
// <style scoped> doesn't work inside anonymous content (see bug 1086532).
// If it did, highlighters.css would be injected as an anonymous content
// node using CanvasFrameAnonymousContentHelper instead.
installHelperSheet(this.highlighterEnv.window,
"@import url('" + STYLESHEET_URI + "');");
if (!installedHelperSheets.has(doc)) {
installedHelperSheets.set(doc, true);
let source = "@import url('" + STYLESHEET_URI + "');";
let url = "data:text/css;charset=utf-8," + encodeURIComponent(source);
let winUtils = this.highlighterEnv.window
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils);
winUtils.loadSheetUsingURIString(url, winUtils.AGENT_SHEET);
}
let node = this.nodeBuilder();
// It was stated that hidden documents don't accept

View File

@ -284,7 +284,11 @@ function prettifyCSS(text, ruleCount) {
}
if (isCloseBrace) {
indent = TAB_CHARS.repeat(--indentLevel);
// Even if the stylesheet contains extra closing braces, the indent level should
// remain > 0.
indentLevel = Math.max(0, indentLevel - 1);
indent = TAB_CHARS.repeat(indentLevel);
result = result + indent + "}";
}

View File

@ -49,6 +49,19 @@ const TESTS = [
"}"
]
},
{ name: "CSS with extra closing brace",
input: "body{margin:0}} div{color:red}",
expected: [
"body {",
"\tmargin:0",
"}",
"}",
"div {",
"\tcolor:red",
"}",
]
},
];
function run_test() {

View File

@ -4,6 +4,7 @@ support-files =
../../imptests/testharness.js
../../imptests/testharnessreport.js
!/dom/animation/test/chrome/file_animate_xrays.html
chrome/file_animation_performance_warning.html
[chrome/test_animate_xrays.html]
# file_animate_xrays.html needs to go in mochitest.ini since it is served

File diff suppressed because it is too large Load Diff

View File

@ -162,15 +162,6 @@ function waitForFrame() {
});
}
/**
* Promise wrapper for requestIdleCallback.
*/
function waitForIdleCallback() {
return new Promise(function(resolve, reject) {
window.requestIdleCallback(resolve);
});
}
/**
* Returns a Promise that is resolved after the given number of consecutive
* animation frames have occured (using requestAnimationFrame callbacks).
@ -220,6 +211,8 @@ if (opener) {
for (var funcName of ["async_test", "assert_not_equals", "assert_equals",
"assert_approx_equals", "assert_less_than",
"assert_less_than_equal", "assert_greater_than",
"assert_greater_than_equal",
"assert_not_exists",
"assert_between_inclusive",
"assert_true", "assert_false",
"assert_class_string", "assert_throws",
@ -229,6 +222,8 @@ if (opener) {
}
window.EventWatcher = opener.EventWatcher;
// Used for requestLongerTimeout.
window.W3CTest = opener.W3CTest;
function done() {
opener.add_completion_callback(function() {

View File

@ -1249,6 +1249,13 @@ ContentChild::RecvGMPsChanged(nsTArray<GMPCapabilityData>&& capabilities)
return IPC_OK();
}
mozilla::ipc::IPCResult
ContentChild::RecvInitProcessHangMonitor(Endpoint<PProcessHangMonitorChild>&& aHangMonitor)
{
CreateHangMonitorChild(Move(aHangMonitor));
return IPC_OK();
}
mozilla::ipc::IPCResult
ContentChild::RecvInitRendering(Endpoint<PCompositorBridgeChild>&& aCompositor,
Endpoint<PImageBridgeChild>&& aImageBridge,
@ -1312,13 +1319,6 @@ ContentChild::AllocPBackgroundChild(Transport* aTransport,
return BackgroundChild::Alloc(aTransport, aOtherProcess);
}
PProcessHangMonitorChild*
ContentChild::AllocPProcessHangMonitorChild(Transport* aTransport,
ProcessId aOtherProcess)
{
return CreateHangMonitorChild(aTransport, aOtherProcess);
}
#if defined(XP_MACOSX) && defined(MOZ_CONTENT_SANDBOX)
#include <stdlib.h>

View File

@ -165,6 +165,9 @@ public:
mozilla::ipc::IPCResult
RecvGMPsChanged(nsTArray<GMPCapabilityData>&& capabilities) override;
mozilla::ipc::IPCResult
RecvInitProcessHangMonitor(Endpoint<PProcessHangMonitorChild>&& aHangMonitor) override;
mozilla::ipc::IPCResult
RecvInitRendering(
Endpoint<PCompositorBridgeChild>&& aCompositor,
@ -179,10 +182,6 @@ public:
Endpoint<PVRManagerChild>&& aVRBridge,
Endpoint<PVideoDecoderManagerChild>&& aVideoManager) override;
PProcessHangMonitorChild*
AllocPProcessHangMonitorChild(Transport* aTransport,
ProcessId aOtherProcess) override;
virtual mozilla::ipc::IPCResult RecvSetProcessSandbox(const MaybeFileDesc& aBroker) override;
PBackgroundChild*

View File

@ -1777,7 +1777,7 @@ ContentParent::LaunchSubprocess(ProcessPriority aInitialPriority /* = PROCESS_PR
ContentProcessManager::GetSingleton()->AddContentProcess(this);
ProcessHangMonitor::AddProcess(this);
mHangMonitorActor = ProcessHangMonitor::AddProcess(this);
// Set a reply timeout for CPOWs.
SetReplyTimeoutMs(Preferences::GetInt("dom.ipc.cpow.timeout", 0));
@ -2477,14 +2477,6 @@ ContentParent::AllocPBackgroundParent(Transport* aTransport,
return BackgroundParent::Alloc(this, aTransport, aOtherProcess);
}
PProcessHangMonitorParent*
ContentParent::AllocPProcessHangMonitorParent(Transport* aTransport,
ProcessId aOtherProcess)
{
mHangMonitorActor = CreateHangMonitorParent(this, aTransport, aOtherProcess);
return mHangMonitorActor;
}
mozilla::ipc::IPCResult
ContentParent::RecvGetProcessAttributes(ContentParentId* aCpId,
bool* aIsForBrowser)

View File

@ -710,10 +710,6 @@ private:
AllocPBackgroundParent(Transport* aTransport, ProcessId aOtherProcess)
override;
PProcessHangMonitorParent*
AllocPProcessHangMonitorParent(Transport* aTransport,
ProcessId aOtherProcess) override;
virtual mozilla::ipc::IPCResult RecvGetProcessAttributes(ContentParentId* aCpId,
bool* aIsForBrowser) override;

View File

@ -347,7 +347,6 @@ nested(upto inside_cpow) sync protocol PContent
{
parent spawns PPluginModule;
parent opens PProcessHangMonitor;
parent opens PGMPService;
child opens PBackground;
@ -415,6 +414,8 @@ both:
uint64_t aOuterWindowID);
child:
async InitProcessHangMonitor(Endpoint<PProcessHangMonitorChild> hangMonitor);
// Give the content process its endpoints to the compositor.
async InitRendering(
Endpoint<PCompositorBridgeChild> compositor,

View File

@ -41,6 +41,7 @@
using namespace mozilla;
using namespace mozilla::dom;
using namespace mozilla::ipc;
/*
* Basic architecture:
@ -78,8 +79,7 @@ class HangMonitorChild
explicit HangMonitorChild(ProcessHangMonitor* aMonitor);
~HangMonitorChild() override;
void Open(Transport* aTransport, ProcessId aOtherPid,
MessageLoop* aIOLoop);
void Bind(Endpoint<PProcessHangMonitorChild>&& aEndpoint);
typedef ProcessHangMonitor::SlowScriptAction SlowScriptAction;
SlowScriptAction NotifySlowScript(nsITabChild* aTabChild,
@ -211,7 +211,7 @@ public:
explicit HangMonitorParent(ProcessHangMonitor* aMonitor);
~HangMonitorParent() override;
void Open(Transport* aTransport, ProcessId aPid, MessageLoop* aIOLoop);
void Bind(Endpoint<PProcessHangMonitorParent>&& aEndpoint);
mozilla::ipc::IPCResult RecvHangEvidence(const HangData& aHangData) override;
mozilla::ipc::IPCResult RecvClearHang() override;
@ -416,15 +416,14 @@ HangMonitorChild::ClearForcePaint()
}
void
HangMonitorChild::Open(Transport* aTransport, ProcessId aPid,
MessageLoop* aIOLoop)
HangMonitorChild::Bind(Endpoint<PProcessHangMonitorChild>&& aEndpoint)
{
MOZ_RELEASE_ASSERT(MessageLoop::current() == MonitorLoop());
MOZ_ASSERT(!sInstance);
sInstance = this;
DebugOnly<bool> ok = PProcessHangMonitorChild::Open(aTransport, aPid, aIOLoop);
DebugOnly<bool> ok = aEndpoint.Bind(this);
MOZ_ASSERT(ok);
}
@ -635,12 +634,11 @@ HangMonitorParent::ActorDestroy(ActorDestroyReason aWhy)
}
void
HangMonitorParent::Open(Transport* aTransport, ProcessId aPid,
MessageLoop* aIOLoop)
HangMonitorParent::Bind(Endpoint<PProcessHangMonitorParent>&& aEndpoint)
{
MOZ_RELEASE_ASSERT(MessageLoop::current() == MonitorLoop());
DebugOnly<bool> ok = PProcessHangMonitorParent::Open(aTransport, aPid, aIOLoop);
DebugOnly<bool> ok = aEndpoint.Bind(this);
MOZ_ASSERT(ok);
}
@ -1173,10 +1171,9 @@ ProcessHangMonitor::NotifyPluginHang(uint32_t aPluginId)
return HangMonitorChild::Get()->NotifyPluginHang(aPluginId);
}
PProcessHangMonitorParent*
mozilla::CreateHangMonitorParent(ContentParent* aContentParent,
mozilla::ipc::Transport* aTransport,
base::ProcessId aOtherPid)
static PProcessHangMonitorParent*
CreateHangMonitorParent(ContentParent* aContentParent,
Endpoint<PProcessHangMonitorParent>&& aEndpoint)
{
MOZ_RELEASE_ASSERT(NS_IsMainThread());
@ -1187,19 +1184,15 @@ mozilla::CreateHangMonitorParent(ContentParent* aContentParent,
parent->SetProcess(process);
monitor->MonitorLoop()->PostTask(NewNonOwningRunnableMethod
<mozilla::ipc::Transport*,
base::ProcessId,
MessageLoop*>(parent,
&HangMonitorParent::Open,
aTransport, aOtherPid,
XRE_GetIOMessageLoop()));
<Endpoint<PProcessHangMonitorParent>&&>(parent,
&HangMonitorParent::Bind,
Move(aEndpoint)));
return parent;
}
PProcessHangMonitorChild*
mozilla::CreateHangMonitorChild(mozilla::ipc::Transport* aTransport,
base::ProcessId aOtherPid)
void
mozilla::CreateHangMonitorChild(Endpoint<PProcessHangMonitorChild>&& aEndpoint)
{
MOZ_RELEASE_ASSERT(NS_IsMainThread());
@ -1211,14 +1204,9 @@ mozilla::CreateHangMonitorChild(mozilla::ipc::Transport* aTransport,
auto* child = new HangMonitorChild(monitor);
monitor->MonitorLoop()->PostTask(NewNonOwningRunnableMethod
<mozilla::ipc::Transport*,
base::ProcessId,
MessageLoop*>(child,
&HangMonitorChild::Open,
aTransport, aOtherPid,
XRE_GetIOMessageLoop()));
return child;
<Endpoint<PProcessHangMonitorChild>&&>(child,
&HangMonitorChild::Bind,
Move(aEndpoint)));
}
MessageLoop*
@ -1227,15 +1215,32 @@ ProcessHangMonitor::MonitorLoop()
return mThread->message_loop();
}
/* static */ void
/* static */ PProcessHangMonitorParent*
ProcessHangMonitor::AddProcess(ContentParent* aContentParent)
{
MOZ_RELEASE_ASSERT(NS_IsMainThread());
if (mozilla::Preferences::GetBool("dom.ipc.processHangMonitor", false)) {
DebugOnly<bool> opened = PProcessHangMonitor::Open(aContentParent);
MOZ_ASSERT(opened);
if (!mozilla::Preferences::GetBool("dom.ipc.processHangMonitor", false)) {
return nullptr;
}
Endpoint<PProcessHangMonitorParent> parent;
Endpoint<PProcessHangMonitorChild> child;
nsresult rv;
rv = PProcessHangMonitor::CreateEndpoints(base::GetCurrentProcId(),
aContentParent->OtherPid(),
&parent, &child);
if (NS_FAILED(rv)) {
MOZ_ASSERT(false, "PProcessHangMonitor::CreateEndpoints failed");
return nullptr;
}
if (!aContentParent->SendInitProcessHangMonitor(Move(child))) {
MOZ_ASSERT(false);
return nullptr;
}
return CreateHangMonitorParent(aContentParent, Move(parent));
}
/* static */ void

View File

@ -41,7 +41,7 @@ class ProcessHangMonitor final
NS_DECL_ISUPPORTS
NS_DECL_NSIOBSERVER
static void AddProcess(dom::ContentParent* aContentParent);
static PProcessHangMonitorParent* AddProcess(dom::ContentParent* aContentParent);
static void RemoveProcess(PProcessHangMonitorParent* aParent);
static void ClearHang();

View File

@ -20,14 +20,8 @@ namespace dom {
class ContentParent;
} // namespace dom
PProcessHangMonitorParent*
CreateHangMonitorParent(mozilla::dom::ContentParent* aContentParent,
mozilla::ipc::Transport* aTransport,
base::ProcessId aOtherProcess);
PProcessHangMonitorChild*
CreateHangMonitorChild(mozilla::ipc::Transport* aTransport,
base::ProcessId aOtherProcess);
void
CreateHangMonitorChild(ipc::Endpoint<PProcessHangMonitorChild>&& aEndpoint);
} // namespace mozilla

View File

@ -192,41 +192,46 @@ public:
// Event handlers for various events.
virtual void HandleCDMProxyReady() {}
virtual void HandleAudioDecoded(MediaData* aAudio) {}
virtual void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) {}
virtual void HandleAudioWaited(MediaData::Type aType);
virtual void HandleVideoWaited(MediaData::Type aType);
virtual void HandleNotWaited(const WaitForDataRejectValue& aRejection);
virtual void HandleAudioCaptured() {}
virtual void HandleAudioDecoded(MediaData* aAudio)
{
Crash("Unexpected event!", __func__);
}
virtual void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart)
{
Crash("Unexpected event!", __func__);
}
virtual void HandleAudioWaited(MediaData::Type aType)
{
Crash("Unexpected event!", __func__);
}
virtual void HandleVideoWaited(MediaData::Type aType)
{
Crash("Unexpected event!", __func__);
}
virtual void HandleWaitingForAudio()
{
mMaster->WaitForData(MediaData::AUDIO_DATA);
Crash("Unexpected event!", __func__);
}
virtual void HandleAudioCanceled()
{
mMaster->EnsureAudioDecodeTaskQueued();
Crash("Unexpected event!", __func__);
}
virtual void HandleEndOfAudio()
{
AudioQueue().Finish();
Crash("Unexpected event!", __func__);
}
virtual void HandleWaitingForVideo()
{
mMaster->WaitForData(MediaData::VIDEO_DATA);
Crash("Unexpected event!", __func__);
}
virtual void HandleVideoCanceled()
{
mMaster->EnsureVideoDecodeTaskQueued();
Crash("Unexpected event!", __func__);
}
virtual void HandleEndOfVideo()
{
VideoQueue().Finish();
Crash("Unexpected event!", __func__);
}
virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
@ -245,6 +250,14 @@ private:
template <class S, typename R, typename... As>
auto ReturnTypeHelper(R(S::*)(As...)) -> R;
void Crash(const char* aReason, const char* aSite)
{
char buf[1024];
SprintfLiteral(buf, "%s state=%s callsite=%s", aReason, ToStateStr(GetState()), aSite);
MOZ_ReportAssertionFailure(buf, __FILE__, __LINE__);
MOZ_CRASH();
}
protected:
enum class EventVisibility : int8_t
{
@ -659,6 +672,16 @@ public:
CheckSlowDecoding(aDecodeStart);
}
void HandleAudioCanceled() override
{
mMaster->EnsureAudioDecodeTaskQueued();
}
void HandleVideoCanceled() override
{
mMaster->EnsureVideoDecodeTaskQueued();
}
void HandleEndOfAudio() override;
void HandleEndOfVideo() override;
@ -674,6 +697,16 @@ public:
MaybeStopPrerolling();
}
void HandleAudioWaited(MediaData::Type aType) override
{
mMaster->EnsureAudioDecodeTaskQueued();
}
void HandleVideoWaited(MediaData::Type aType) override
{
mMaster->EnsureVideoDecodeTaskQueued();
}
void HandleAudioCaptured() override
{
MaybeStopPrerolling();
@ -884,7 +917,6 @@ public:
void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override = 0;
void HandleAudioWaited(MediaData::Type aType) override = 0;
void HandleVideoWaited(MediaData::Type aType) override = 0;
void HandleNotWaited(const WaitForDataRejectValue& aRejection) override = 0;
void HandleVideoSuspendTimeout() override
{
@ -1064,11 +1096,6 @@ public:
RequestVideoData();
}
void HandleNotWaited(const WaitForDataRejectValue& aRejection) override
{
MOZ_ASSERT(!mDoneAudioSeeking || !mDoneVideoSeeking, "Seek shouldn't be finished");
}
private:
void DemuxerSeek()
{
@ -1515,28 +1542,6 @@ private:
RequestVideoData();
}
void HandleNotWaited(const WaitForDataRejectValue& aRejection) override
{
MOZ_ASSERT(!mSeekJob.mPromise.IsEmpty(), "Seek shouldn't be finished");
MOZ_ASSERT(NeedMoreVideo());
switch(aRejection.mType) {
case MediaData::AUDIO_DATA:
{
// We don't care about audio in this state.
break;
}
case MediaData::VIDEO_DATA:
{
// Error out if we can't finish video seeking.
mMaster->DecodeError(NS_ERROR_DOM_MEDIA_CANCELED);
break;
}
default:
MOZ_ASSERT_UNREACHABLE("We cannot handle RAW_DATA or NULL_DATA here.");
}
}
int64_t CalculateNewCurrentTime() const override
{
// The HTMLMediaElement.currentTime should be updated to the seek target
@ -1644,6 +1649,36 @@ public:
mMaster->ScheduleStateMachine();
}
void HandleAudioCanceled() override
{
mMaster->RequestAudioData();
}
void HandleVideoCanceled() override
{
mMaster->RequestVideoData(false, media::TimeUnit());
}
void HandleWaitingForAudio() override
{
mMaster->WaitForData(MediaData::AUDIO_DATA);
}
void HandleWaitingForVideo() override
{
mMaster->WaitForData(MediaData::VIDEO_DATA);
}
void HandleAudioWaited(MediaData::Type aType) override
{
mMaster->RequestAudioData();
}
void HandleVideoWaited(MediaData::Type aType) override
{
mMaster->RequestVideoData(false, media::TimeUnit());
}
void HandleEndOfAudio() override;
void HandleEndOfVideo() override;
@ -1818,27 +1853,6 @@ public:
}
};
void
MediaDecoderStateMachine::
StateObject::HandleAudioWaited(MediaData::Type aType)
{
mMaster->EnsureAudioDecodeTaskQueued();
}
void
MediaDecoderStateMachine::
StateObject::HandleVideoWaited(MediaData::Type aType)
{
mMaster->EnsureVideoDecodeTaskQueued();
}
void
MediaDecoderStateMachine::
StateObject::HandleNotWaited(const WaitForDataRejectValue& aRejection)
{
}
RefPtr<MediaDecoder::SeekPromise>
MediaDecoderStateMachine::
StateObject::HandleSeek(SeekTarget aTarget)
@ -2232,13 +2246,17 @@ MediaDecoderStateMachine::
BufferingState::DispatchDecodeTasksIfNeeded()
{
if (mMaster->IsAudioDecoding() &&
!mMaster->HaveEnoughDecodedAudio()) {
mMaster->EnsureAudioDecodeTaskQueued();
!mMaster->HaveEnoughDecodedAudio() &&
!mMaster->IsRequestingAudioData() &&
!mMaster->IsWaitingAudioData()) {
mMaster->RequestAudioData();
}
if (mMaster->IsVideoDecoding() &&
!mMaster->HaveEnoughDecodedVideo()) {
mMaster->EnsureVideoDecodeTaskQueued();
!mMaster->HaveEnoughDecodedVideo() &&
!mMaster->IsRequestingVideoData() &&
!mMaster->IsWaitingVideoData()) {
mMaster->RequestVideoData(false, media::TimeUnit());
}
}
@ -3122,7 +3140,7 @@ MediaDecoderStateMachine::WaitForData(MediaData::Type aType)
},
[this] (const WaitForDataRejectValue& aRejection) {
mAudioWaitRequest.Complete();
mStateObj->HandleNotWaited(aRejection);
DecodeError(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
})
);
} else {
@ -3136,7 +3154,7 @@ MediaDecoderStateMachine::WaitForData(MediaData::Type aType)
},
[this] (const WaitForDataRejectValue& aRejection) {
mVideoWaitRequest.Complete();
mStateObj->HandleNotWaited(aRejection);
DecodeError(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
})
);
}

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
<script>
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
window.opener.opener.postMessage(window.opener.testNum + " - " + window.x, "http://mochi.test:8888");
window.opener.close();
window.close();
var win = SpecialPowers.wrap(window).wrappedJSObject;
win.opener.opener.postMessage(win.opener.testNum + " - " + win.x, "http://mochi.test:8888");
win.opener.close();
win.close();
</script>

View File

@ -1,5 +1,5 @@
<script>
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
window.parent.opener.postMessage(window.parent.testNum + " - " + window.x, "http://mochi.test:8888");
window.parent.close();
var win = SpecialPowers.wrap(window).wrappedJSObject;
win.parent.opener.postMessage(win.parent.testNum + " - " + win.x, "http://mochi.test:8888");
win.parent.close();
</script>

View File

@ -37,14 +37,11 @@ function handleCmd(evt) {
return false;
}
// Grab privileges so we can access cross-domain windows
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
if ("load" in cmd) {
var testNum = cmd.load;
var win = wins[testNum];
var win = SpecialPowers.wrap(wins[testNum]).wrappedJSObject;
win.childWin.x = testNum;
if (win.childWin.opener == win) {
if (SpecialPowers.unwrap(win.childWin.opener) == SpecialPowers.unwrap(win)) {
if ("xsite" in cmd) {
var loc = r(window.location.href, "bug346659-opener-echoer.html");
} else {

View File

@ -29,12 +29,11 @@ var promptState;
function registerMockPromptService()
{
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var XPCOMUtils = SpecialPowers.Cu.import("resource://gre/modules/XPCOMUtils.jsm").XPCOMUtils;
var Ci = SpecialPowers.Ci;
function MockPrompt(aDOMWindow) {
this.domWindow = aDOMWindow;
this.domWindow = SpecialPowers.unwrap(aDOMWindow);
}
MockPrompt.prototype = {

View File

@ -92,7 +92,6 @@ function persistDocument(aDoc) {
SimpleTest.waitForExplicitFinish();
addLoadEvent(function() {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var srcDoc = document.getElementById('source').contentDocument;
persistDocument(srcDoc);
});

View File

@ -575,7 +575,7 @@ public:
T& as() {
static_assert(detail::IsVariant<T, Ts...>::value,
"provided a type not found in this Variant's type list");
MOZ_ASSERT(is<T>());
MOZ_RELEASE_ASSERT(is<T>());
return *reinterpret_cast<T*>(&raw);
}
@ -584,7 +584,7 @@ public:
const T& as() const {
static_assert(detail::IsVariant<T, Ts...>::value,
"provided a type not found in this Variant's type list");
MOZ_ASSERT(is<T>());
MOZ_RELEASE_ASSERT(is<T>());
return *reinterpret_cast<const T*>(&raw);
}

View File

@ -147,6 +147,8 @@ class ActionModeCompatView extends LinearLayout implements GeckoMenu.ActionItemB
if (mActionButtonsWidth + w < maxWidth) {
// We cache the new width of our children.
mActionButtonsWidth += w;
// Make sure the actionItem scales to the full height of the button bar.
actionItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
mActionButtonBar.addView(actionItem);
return true;
}

View File

@ -35,6 +35,7 @@ import org.mozilla.gecko.distribution.Distribution;
import org.mozilla.gecko.distribution.DistributionStoreCallback;
import org.mozilla.gecko.distribution.PartnerBrowserCustomizationsClient;
import org.mozilla.gecko.dlc.DownloadContentService;
import org.mozilla.gecko.icons.IconsHelper;
import org.mozilla.gecko.icons.decoders.IconDirectoryEntry;
import org.mozilla.gecko.feeds.ContentNotificationsDelegate;
import org.mozilla.gecko.feeds.FeedService;
@ -725,7 +726,6 @@ public class BrowserApp extends GeckoApp
EventDispatcher.getInstance().registerGeckoThreadListener(this,
"Search:Keyword",
"Favicon:CacheLoad",
null);
EventDispatcher.getInstance().registerUiThreadListener(this,
@ -746,6 +746,7 @@ public class BrowserApp extends GeckoApp
"Experiments:GetActive",
"Experiments:SetOverride",
"Experiments:ClearOverride",
"Favicon:Request",
"Feedback:MaybeLater",
"Sanitize:ClearHistory",
"Sanitize:ClearSyncedTabs",
@ -1438,7 +1439,6 @@ public class BrowserApp extends GeckoApp
EventDispatcher.getInstance().unregisterGeckoThreadListener(this,
"Search:Keyword",
"Favicon:CacheLoad",
null);
EventDispatcher.getInstance().unregisterUiThreadListener(this,
@ -1459,6 +1459,7 @@ public class BrowserApp extends GeckoApp
"Experiments:GetActive",
"Experiments:SetOverride",
"Experiments:ClearOverride",
"Favicon:Request",
"Feedback:MaybeLater",
"Sanitize:ClearHistory",
"Sanitize:ClearSyncedTabs",
@ -1888,9 +1889,22 @@ public class BrowserApp extends GeckoApp
Experiments.clearOverride(getContext(), message.getString("name"));
break;
case "Favicon:CacheLoad":
case "Favicon:Request":
final String url = message.getString("url");
getFaviconFromCache(callback, url);
final boolean shouldSkipNetwork = message.getBoolean("skipNetwork");
if (TextUtils.isEmpty(url)) {
callback.sendError(null);
break;
}
Icons.with(this)
.pageUrl(url)
.privileged(false)
.skipNetworkIf(shouldSkipNetwork)
.executeCallbackOnBackgroundThread()
.build()
.execute(IconsHelper.createBase64EventCallback(callback));
break;
case "Feedback:MaybeLater":
@ -2041,43 +2055,6 @@ public class BrowserApp extends GeckoApp
}
}
private void getFaviconFromCache(final EventCallback callback, final String url) {
Icons.with(this)
.pageUrl(url)
.skipNetwork()
.executeCallbackOnBackgroundThread()
.build()
.execute(new IconCallback() {
@Override
public void onIconResponse(IconResponse response) {
ByteArrayOutputStream out = null;
Base64OutputStream b64 = null;
try {
out = new ByteArrayOutputStream();
out.write("data:image/png;base64,".getBytes(StringUtils.UTF_8));
b64 = new Base64OutputStream(out, Base64.NO_WRAP);
response.getBitmap().compress(Bitmap.CompressFormat.PNG, 100, b64);
callback.sendSuccess(new String(out.toByteArray(), StringUtils.UTF_8));
} catch (IOException e) {
Log.w(LOGTAG, "Failed to convert to base64 data URI");
callback.sendError("Failed to convert favicon to a base64 data URI");
} finally {
try {
if (out != null) {
out.close();
}
if (b64 != null) {
b64.close();
}
} catch (IOException e) {
Log.w(LOGTAG, "Failed to close the streams");
}
}
}
});
}
/**
* Use a dummy Intent to do a default browser check.
*

View File

@ -297,6 +297,14 @@ public class Distribution {
// This will bail if we aren't delayed, or we already have a distribution.
distribution.processDelayedReferrer(ref);
// On Android 5+ we might receive the referrer intent
// and never actually launch the browser, which is the usual signal
// for the distribution init process to complete.
// Attempt to init here to handle that case.
// Profile setup that relies on the distribution will occur
// when the browser is eventually launched, via `addOnDistributionReadyCallback`.
distribution.doInit();
}
});
}

View File

@ -67,6 +67,15 @@ public class IconRequestBuilder {
return this;
}
/**
* If shouldSkipNetwork is true then do not load icon from a network connection.
*/
@CheckResult
public IconRequestBuilder skipNetworkIf(boolean shouldSkipNetwork) {
request.skipNetwork = shouldSkipNetwork;
return this;
}
/**
* Skip the disk cache and do not load an icon from disk.
*/

View File

@ -5,15 +5,22 @@
package org.mozilla.gecko.icons;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Base64OutputStream;
import android.util.Log;
import org.mozilla.gecko.AboutPages;
import org.mozilla.gecko.util.EventCallback;
import org.mozilla.gecko.util.IOUtils;
import org.mozilla.gecko.util.StringUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashSet;
/**
@ -137,4 +144,30 @@ public class IconsHelper {
public static boolean canDecodeType(@NonNull String imgType) {
return sDecodableMimeTypes.contains(imgType);
}
/**
* Create an icon callback that encodes the icon as base64 image URI and returns it via the
* EventCallback to JavaScript.
*/
public static IconCallback createBase64EventCallback(final EventCallback callback) {
return new IconCallback() {
@Override
public void onIconResponse(IconResponse response) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
try {
response.getBitmap().compress(
Bitmap.CompressFormat.PNG,
100, // PNG which is lossless will ignore the quality setting
stream);
callback.sendSuccess(
"data:image/x-icon;base64,"
+ Base64.encodeToString(stream.toByteArray(), Base64.NO_WRAP));
} finally {
IOUtils.safeStreamClose(stream);
}
}
};
}
}

View File

@ -87,7 +87,9 @@
<style name="GeckoActionBar.Button" parent="android:style/Widget.Holo.Light.ActionButton">
<item name="android:padding">8dip</item>
<!-- The default implementation doesn't do any image scaling. Our custom menus mean we can't just use the same image
in both menus and the actionbar without doing some scaling though. -->
in both menus and the actionbar without doing some scaling though. Users may also want to set
layout_height="match_parent" to make sure buttons are scaled to full action bar height - setting it here
doesn't work. -->
<item name="android:scaleType">centerInside</item>
</style>

View File

@ -418,8 +418,9 @@ var Logins = {
_loadFavicon: function (aImg, aHostname) {
// Load favicon from cache.
EventDispatcher.instance.sendRequestForResult({
type: "Favicon:CacheLoad",
type: "Favicon:Request",
url: aHostname,
skipNetwork: true
}).then(function(faviconUrl) {
aImg.style.backgroundImage= "url('" + faviconUrl + "')";
aImg.style.visibility = "visible";

View File

@ -6247,14 +6247,6 @@ var SearchEngines = {
return;
}
// fetch the favicon for this page
let dbFile = FileUtils.getFile("ProfD", ["browser.db"]);
let mDBConn = Services.storage.openDatabase(dbFile);
let stmts = [];
stmts[0] = mDBConn.createStatement("SELECT favicon FROM history_with_favicons WHERE url = ?");
stmts[0].bindByIndex(0, docURI.spec);
let favicon = null;
Services.search.init(function addEngine_cb(rv) {
if (!Components.isSuccessCode(rv)) {
Cu.reportError("Could not initialize search service, bailing out.");
@ -6264,31 +6256,32 @@ var SearchEngines = {
return;
}
mDBConn.executeAsync(stmts, stmts.length, {
handleResult: function (results) {
let bytes = results.getNextRow().getResultByName("favicon");
if (bytes && bytes.length) {
favicon = "data:image/x-icon;base64," + btoa(String.fromCharCode.apply(null, bytes));
}
},
handleCompletion: function (reason) {
// if there's already an engine with this name, add a number to
// make the name unique (e.g., "Google" becomes "Google 2")
let name = title.value;
for (let i = 2; Services.search.getEngineByName(name); i++)
GlobalEventDispatcher.sendRequestForResult({
type: 'Favicon:Request',
url: docURI.spec,
skipNetwork: false
}).then(data => {
// if there's already an engine with this name, add a number to
// make the name unique (e.g., "Google" becomes "Google 2")
let name = title.value;
for (let i = 2; Services.search.getEngineByName(name); i++) {
name = title.value + " " + i;
Services.search.addEngineWithDetails(name, favicon, null, null, method, formURL);
Snackbars.show(Strings.browser.formatStringFromName("alertSearchEngineAddedToast", [name], 1), Snackbars.LENGTH_LONG);
let engine = Services.search.getEngineByName(name);
engine.wrappedJSObject._queryCharset = charset;
formData.forEach(param => { engine.addParam(param.name, param.value, null); });
if (resultCallback) {
return resultCallback(true);
};
}
Services.search.addEngineWithDetails(name, data, null, null, method, formURL);
Snackbars.show(Strings.browser.formatStringFromName("alertSearchEngineAddedToast", [name], 1), Snackbars.LENGTH_LONG);
let engine = Services.search.getEngineByName(name);
engine.wrappedJSObject._queryCharset = charset;
formData.forEach(param => { engine.addParam(param.name, param.value, null); });
if (resultCallback) {
return resultCallback(true);
};
}).catch(e => {
dump("Error while fetching icon for search engine");
resultCallback(false);
});
});
}

View File

@ -13,7 +13,7 @@ Cu.import("resource://gre/modules/Messaging.jsm");
const {
PushCrypto,
getCryptoParams,
} = Cu.import("resource://gre/modules/PushCrypto.jsm");
} = Cu.import("resource://gre/modules/PushCrypto.jsm", {});
XPCOMUtils.defineLazyServiceGetter(this, "PushService",
"@mozilla.org/push/Service;1", "nsIPushService");

View File

@ -17,6 +17,7 @@ Contents:
defaultdomains
bouncer
shutdown
push
Indices and tables
==================

View File

@ -0,0 +1,145 @@
.. -*- Mode: rst; fill-column: 80; -*-
=======================================================
The architecture of the Fennec Webpush implementation
=======================================================
Overview of the Push API
========================
The *Push API* is a Web API that allows web applications to "wake up" the User
Agent (the browser, Fennec), even when the application is not visible (or even
loaded in a tab). The Push API can only be used by secure sites that register a
Service Worker.
There are four major components in Push:
1. A *web application*;
2. The User Agent (Fennec);
3. An *app server* associated to the web application;
4. A *push service backend*.
These are listed roughly in the order that they appear in a successful push
message. First, the web application registers a Service Worker and requests a
*push subscription*. Fennec arranges a push channel and returns a subscription,
including a User-Agent-specific *push endpoint* URL to the web application. The
web application then provides that push endpoint URL to its app server. When
the app server wishes to push a message to the web application, it posts the
message and some additional meta-data to the provided push endpoint URL. The
message is received by the *push service backend* and delivered by some
unspecified out-of-band mechanism to the User Agent.
Two notes on terminology
------------------------
"Push notifications" mean many things to many people. In this system, "push
notifications" may or may not notify the user. Therefore, we use the term "push
messages" exclusively. This avoids confusing the push system with the "Web
Notification" API, which provides the familiar pop-up and system notification
based user interface.
Throughout, we use Fennec to refer to the Java-and-Android application shell,
and Gecko to refer to the embedded Gecko platform.
Overview of the Fennec Push implementation
==========================================
Fennec uses the Google Cloud Messaging (GCM) service to deliver messages to the
User Agent. Fennec registers for Google Cloud Messaging directly, like any
other Android App; however, consumers do not interact with GCM directly. To
provide a uniform interface to all consumers across all implementations, Fennec
intermediates through the Mozilla-specific *autopush* service. Autopush
maintains User Agent identification and authentication, provides per-web
application messaging channels, and bridges unauthenticated push messages to the
GCM delivery queue.
The Fennec Push implementation is designed to address the following technical
challenge: **GCM events, including incoming push messages, can occur when Gecko
is not running**. In case of an incoming push message, if Gecko is not running
Fennec will request startup of necessary Gecko services and queue incoming
push messages in the meantime. Once services are running, messages are sent over.
It's worth noting that Fennec uses push to implement internal functionality like
Sync and Firefox Accounts, and that these background services are *not* tied to
Gecko being available.
Therefore, the principal constraints and requirements are:
1) Fennec must be able to service GCM events, including incoming push messages,
independently of Gecko.
2) Gecko must be able to maintain push subscriptions across its entire
life-cycle.
3) Fennec must be able to use push messages for non-Gecko purposes independently
of Gecko.
Significant previous experience building Fennec background services has shown
that configuring such services across the Gecko-Fennec interface is both
valuable and difficult. Therefore, we add the following requirement:
4) Gecko must own the push configuration details where appropriate and possible.
We explicitly do not care to support push messages across multiple processes. This
will matter more in a post-e10s-on-Android world.
Push component architecture
===========================
Fennec components
-----------------
The two major components are the `PushManager` and the associated
`PushManagerStorage`. The `PushManager` interacts with the GCM system on the
device and the autopush service, updating the `PushManagerStorage` as the system
state changes.
There is a unique `PushManagerStorage` instance per-App that may only be
accessed by the main process. The `PushManagerStorage` maintains two mappings.
The first is a one-to-one mapping from a Gecko profile to a `PushRegistration`:
a datum of User Agent state. The `PushManager` maintains each profile's
registration across Android life-cycle events, Gecko events, and GCM events.
Each `PushRegistration` includes:
* autopush server configuration details;
* debug settings;
* profile details;
* access tokens and invalidation timestamps.
The second mapping is a one-to-many mapping from push registrations to
`PushSubscription` instances. A push subscription corresponds to a unique push
message channel from the autopush server to Fennec. Each `PushSubscription`
includes:
* a Fennec service identifier, one of "webpush" or "fxa";
* an associated Gecko profile;
* a unique channel identifier.
The `PushManager` uses the `PushSubscription` service and profile maintained in
the `PushManagerStorage` to determine how to deliver incoming GCM push messages.
Each `PushRegistration` corresponds to a unique *uaid* (User-Agent ID) on the
autopush server. Each *uaid* is long-lived; a healthy client will maintain the
same *uaid* until the client's configuration changes or the service expires the
registration due to inactivity or an unexpected server event. Each
`PushSubscription` is associated to a given *uaid* and correponds to a unique
(per-*uaid*) *chid* (Channel ID) on the autopush server. An individual *chid*
is potentially long-lived, but clients must expect the service to expire *chid*s
as part of regular maintainence. The `PushManager` uses an `AutopushClient`
instance to interact with the autopush server.
Between the `PushManager`, the `PushManagerStorage`, and assorted GCM event
broadcast receivers, push messages that do not target Gecko can be implemented.
Gecko components
----------------
The Gecko side of the architecture is implemented in JavaScript by the
`PushServiceAndroidGCM.jsm` module. This registers a PushService, like the Web
Socket and HTTP2 backed services, which simply delegates to the Fennec
`PushManager` using `Messaging.jsm` and friends.
There are some complications: first, Gecko must maintain the autopush
configuration; and second, it is possible for the push system to change while
Gecko is not running. Therefore, the communication is bi-directional
throughout, so that Gecko can react to Fennec events after-the-fact.

View File

@ -94,6 +94,27 @@ public class TestIconRequestBuilder {
Assert.assertTrue(request.shouldSkipNetwork());
}
@Test
public void testSkipNetworkIf() {
IconRequest request = Icons.with(RuntimeEnvironment.application)
.pageUrl(TEST_PAGE_URL_1)
.build();
Assert.assertFalse(request.shouldSkipNetwork());
request.modify()
.skipNetworkIf(true)
.deferBuild();
Assert.assertTrue(request.shouldSkipNetwork());
request.modify()
.skipNetworkIf(false)
.deferBuild();
Assert.assertFalse(request.shouldSkipNetwork());
}
@Test
public void testSkipDisk() {
IconRequest request = Icons.with(RuntimeEnvironment.application)

View File

@ -40,7 +40,6 @@
#include "xpcpublic.h"
#if defined(XP_WIN)
#include "mozilla/WindowsVersion.h"
#include "ShutdownLayer.h"
#endif
@ -1743,21 +1742,6 @@ nsSocketTransport::OnSocketConnected()
NS_ASSERTION(mFDref == 1, "wrong socket ref count");
SetSocketName(mFD);
mFDconnected = true;
#ifdef XP_WIN
if (!IsWin2003OrLater()) { // windows xp
PRSocketOptionData opt;
opt.option = PR_SockOpt_RecvBufferSize;
if (PR_GetSocketOption(mFD, &opt) == PR_SUCCESS) {
SOCKET_LOG(("%p checking rwin on xp originally=%u\n",
this, opt.value.recv_buffer_size));
if (opt.value.recv_buffer_size < 65535) {
opt.value.recv_buffer_size = 65535;
PR_SetSocketOption(mFD, &opt);
}
}
}
#endif
}
// Ensure keepalive is configured correctly if previously enabled.

View File

@ -28,10 +28,6 @@
#include "nsIWidget.h"
#include "mozilla/dom/FlyWebService.h"
#if defined(XP_WIN)
#include "mozilla/WindowsVersion.h"
#endif
#ifdef MOZ_TASK_TRACER
#include "GeckoTaskTracer.h"
#endif
@ -1220,12 +1216,7 @@ nsSocketTransportService::UpdateSendBufferPref(nsIPrefBranch *pref)
}
#if defined(XP_WIN)
// If the pref is not set but this is windows set it depending on windows version
if (!IsWin2003OrLater()) { // windows xp
mSendBufferSize = 131072;
} else { // vista or later
mSendBufferSize = 131072 * 4;
}
mSendBufferSize = 131072 * 4;
#endif
}

View File

@ -671,6 +671,10 @@ nsUDPSocket::Connect(const NetAddr *aAddr)
NS_ENSURE_ARG(aAddr);
if (NS_WARN_IF(!mFD)) {
return NS_ERROR_NOT_INITIALIZED;
}
bool onSTSThread = false;
mSts->IsOnCurrentThread(&onSTSThread);
NS_ASSERTION(onSTSThread, "NOT ON STS THREAD");

View File

@ -13,9 +13,6 @@
#include "nsIScriptSecurityManager.h"
#include "nsITimer.h"
#include "mozilla/net/DNS.h"
#ifdef XP_WIN
#include "mozilla/WindowsVersion.h"
#endif
#include "prerror.h"
#define REQUEST 0x68656c6f
@ -321,16 +318,6 @@ TEST(TestUDPSocket, TestUDPSocketMain)
ASSERT_TRUE(timer);
RefPtr<MulticastTimerCallback> timerCb = new MulticastTimerCallback(waiter);
// The following multicast tests using multiple sockets require a firewall
// exception on Windows XP (the earliest version of Windows we now support)
// before they pass. For now, we'll skip them here. Later versions of Windows
// (Win2003 and onward) don't seem to have this issue.
#ifdef XP_WIN
if (!mozilla::IsWin2003OrLater()) { // i.e. if it is WinXP
goto close;
}
#endif
// Join multicast group
printf("Joining multicast group\n");
phase = TEST_MULTICAST;

View File

@ -45,7 +45,6 @@ elif CONFIG['OS_ARCH'] == 'WINNT':
'nsWifiScannerWin.cpp',
'win_wifiScanner.cpp',
'win_wlanLibrary.cpp',
'win_xp_wifiScanner.cpp'
]
elif CONFIG['OS_ARCH'] == 'SunOS':
CXXFLAGS += CONFIG['GLIB_CFLAGS']

View File

@ -76,7 +76,7 @@ class nsWifiMonitor final : nsIRunnable, nsIWifiMonitor, nsIObserver
mozilla::ReentrantMonitor mReentrantMonitor;
#ifdef XP_WIN
nsAutoPtr<WindowsWifiScannerInterface> mWinWifiScanner;
nsAutoPtr<WinWifiScanner> mWinWifiScanner;
#endif
};
#else

View File

@ -12,8 +12,6 @@
#include "nsServiceManagerUtils.h"
#include "nsWifiAccessPoint.h"
#include "win_wifiScanner.h"
#include "win_xp_wifiScanner.h"
#include "mozilla/WindowsVersion.h"
using namespace mozilla;
@ -31,14 +29,7 @@ nsresult
nsWifiMonitor::DoScan()
{
if (!mWinWifiScanner) {
if (IsWin2003OrLater()) {
mWinWifiScanner = new WinWifiScanner();
LOG(("Using Windows 2003+ wifi scanner."));
} else {
mWinWifiScanner = new WinXPWifiScanner();
LOG(("Using Windows XP wifi scanner."));
}
mWinWifiScanner = new WinWifiScanner();
if (!mWinWifiScanner) {
// TODO: Probably return OOM error
return NS_ERROR_FAILURE;

View File

@ -11,19 +11,10 @@
class nsWifiAccessPoint;
// This class allows the wifi monitor to use WinWifiScanner and WinXPWifiScanner interchangeably.
class WindowsWifiScannerInterface {
public:
virtual ~WindowsWifiScannerInterface() {}
virtual nsresult GetAccessPointsFromWLAN(nsCOMArray<nsWifiAccessPoint> &accessPoints) = 0;
};
class WinWifiScanner : public WindowsWifiScannerInterface {
class WinWifiScanner final {
public:
WinWifiScanner();
virtual ~WinWifiScanner();
~WinWifiScanner();
/**
* GetAccessPointsFromWLAN

View File

@ -1,399 +0,0 @@
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Windows Vista uses the Native Wifi (WLAN) API for accessing WiFi cards. See
// http://msdn.microsoft.com/en-us/library/ms705945(VS.85).aspx. Windows XP
// Service Pack 3 (and Windows XP Service Pack 2, if upgraded with a hot fix)
// also support a limited version of the WLAN API. See
// http://msdn.microsoft.com/en-us/library/bb204766.aspx. The WLAN API uses
// wlanapi.h, which is not part of the SDK used by Gears, so is replicated
// locally using data from the MSDN.
//\
// Windows XP from Service Pack 2 onwards supports the Wireless Zero
// Configuration (WZC) programming interface. See
// http://msdn.microsoft.com/en-us/library/ms706587(VS.85).aspx.
//
// The MSDN recommends that one use the WLAN API where available, and WZC
// otherwise.
//
// However, it seems that WZC fails for some wireless cards. Also, WLAN seems
// not to work on XP SP3. So we use WLAN on Vista, and use NDIS directly
// otherwise.
// MOZILLA NOTE:
// This code is ported from chromium:
// https://chromium.googlesource.com/chromium/src/+/master/content/browser/geolocation/wifi_data_provider_win.cc
// Based on changeset 42c5878
#include "win_xp_wifiScanner.h"
#include "nsWifiAccessPoint.h"
#include <windows.h>
#include <winioctl.h>
#include <wlanapi.h>
#include <string>
#include <vector>
// Taken from ndis.h for WinCE.
#define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L)
#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L)
namespace {
// The limits on the size of the buffer used for the OID query.
const int kInitialBufferSize = 2 << 12; // Good for about 50 APs.
const int kMaximumBufferSize = 2 << 20; // 2MB
// Length for generic string buffers passed to Win32 APIs.
const int kStringLength = 512;
// WlanOpenHandle
typedef DWORD (WINAPI* WlanOpenHandleFunction)(DWORD dwClientVersion,
PVOID pReserved,
PDWORD pdwNegotiatedVersion,
PHANDLE phClientHandle);
// WlanEnumInterfaces
typedef DWORD (WINAPI* WlanEnumInterfacesFunction)(
HANDLE hClientHandle,
PVOID pReserved,
PWLAN_INTERFACE_INFO_LIST* ppInterfaceList);
// WlanGetNetworkBssList
typedef DWORD (WINAPI* WlanGetNetworkBssListFunction)(
HANDLE hClientHandle,
const GUID* pInterfaceGuid,
const PDOT11_SSID pDot11Ssid,
DOT11_BSS_TYPE dot11BssType,
BOOL bSecurityEnabled,
PVOID pReserved,
PWLAN_BSS_LIST* ppWlanBssList
);
// WlanFreeMemory
typedef VOID (WINAPI* WlanFreeMemoryFunction)(PVOID pMemory);
// WlanCloseHandle
typedef DWORD (WINAPI* WlanCloseHandleFunction)(HANDLE hClientHandle,
PVOID pReserved);
// Extracts data for an access point and converts to Gears format.
bool UndefineDosDevice(const std::string& device_name);
bool DefineDosDeviceIfNotExists(const std::string& device_name);
HANDLE GetFileHandle(const std::string& device_name);
// Makes the OID query and returns a Win32 error code.
int PerformQuery(HANDLE adapter_handle, std::vector<char>& buffer, DWORD* bytes_out);
bool ResizeBuffer(size_t requested_size, std::vector<char>& buffer);
// Gets the system directory and appends a trailing slash if not already
// present.
bool GetSystemDirectory(std::string* path);
bool ConvertToAccessPointData(const NDIS_WLAN_BSSID& data, nsWifiAccessPoint* access_point_data);
int GetDataFromBssIdList(const NDIS_802_11_BSSID_LIST& bss_id_list,
int list_size,
nsCOMArray<nsWifiAccessPoint>& outData);
} // namespace
class WindowsNdisApi
{
public:
virtual ~WindowsNdisApi();
static WindowsNdisApi* Create();
virtual bool GetAccessPointData(nsCOMArray<nsWifiAccessPoint>& outData);
private:
static bool GetInterfacesNDIS(std::vector<std::string>& interface_service_names_out);
// Swaps in content of the vector passed
explicit WindowsNdisApi(std::vector<std::string>* interface_service_names);
bool GetInterfaceDataNDIS(HANDLE adapter_handle, nsCOMArray<nsWifiAccessPoint>& outData);
// NDIS variables.
std::vector<std::string> interface_service_names_;
std::vector<char> _buffer;
};
// WindowsNdisApi
WindowsNdisApi::WindowsNdisApi(
std::vector<std::string>* interface_service_names)
: _buffer(kInitialBufferSize) {
interface_service_names_.swap(*interface_service_names);
}
WindowsNdisApi::~WindowsNdisApi() {
}
WindowsNdisApi* WindowsNdisApi::Create() {
std::vector<std::string> interface_service_names;
if (GetInterfacesNDIS(interface_service_names)) {
return new WindowsNdisApi(&interface_service_names);
}
return NULL;
}
bool WindowsNdisApi::GetAccessPointData(nsCOMArray<nsWifiAccessPoint>& outData) {
int interfaces_failed = 0;
int interfaces_succeeded = 0;
for (int i = 0; i < static_cast<int>(interface_service_names_.size()); ++i) {
// First, check that we have a DOS device for this adapter.
if (!DefineDosDeviceIfNotExists(interface_service_names_[i])) {
continue;
}
// Get the handle to the device. This will fail if the named device is not
// valid.
HANDLE adapter_handle = GetFileHandle(interface_service_names_[i]);
if (adapter_handle == INVALID_HANDLE_VALUE) {
continue;
}
// Get the data.
if (GetInterfaceDataNDIS(adapter_handle, outData)) {
++interfaces_succeeded;
} else {
++interfaces_failed;
}
// Clean up.
CloseHandle(adapter_handle);
UndefineDosDevice(interface_service_names_[i]);
}
// Return true if at least one interface succeeded, or at the very least none
// failed.
return interfaces_succeeded > 0 || interfaces_failed == 0;
}
bool WindowsNdisApi::GetInterfacesNDIS(std::vector<std::string>& interface_service_names_out) {
HKEY network_cards_key = NULL;
if (RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"Software\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards",
0,
KEY_READ,
&network_cards_key) != ERROR_SUCCESS) {
return false;
}
if (!network_cards_key) {
return false;
}
for (int i = 0; ; ++i) {
TCHAR name[kStringLength];
DWORD name_size = kStringLength;
FILETIME time;
if (RegEnumKeyEx(network_cards_key,
i,
name,
&name_size,
NULL,
NULL,
NULL,
&time) != ERROR_SUCCESS) {
break;
}
HKEY hardware_key = NULL;
if (RegOpenKeyEx(network_cards_key, name, 0, KEY_READ, &hardware_key) !=
ERROR_SUCCESS) {
break;
}
if (!hardware_key) {
return false;
}
TCHAR service_name[kStringLength];
DWORD service_name_size = kStringLength;
DWORD type = 0;
if (RegQueryValueEx(hardware_key,
"ServiceName",
NULL,
&type,
reinterpret_cast<LPBYTE>(service_name),
&service_name_size) == ERROR_SUCCESS) {
interface_service_names_out.push_back(service_name);
}
RegCloseKey(hardware_key);
}
RegCloseKey(network_cards_key);
return true;
}
bool WindowsNdisApi::GetInterfaceDataNDIS(HANDLE adapter_handle,
nsCOMArray<nsWifiAccessPoint>& outData) {
DWORD bytes_out;
int result;
while (true) {
bytes_out = 0;
result = PerformQuery(adapter_handle, _buffer, &bytes_out);
if (result == ERROR_GEN_FAILURE || // Returned by some Intel cards.
result == ERROR_INSUFFICIENT_BUFFER ||
result == ERROR_MORE_DATA ||
result == NDIS_STATUS_INVALID_LENGTH ||
result == NDIS_STATUS_BUFFER_TOO_SHORT) {
// The buffer we supplied is too small, so increase it. bytes_out should
// provide the required buffer size, but this is not always the case.
size_t newSize;
if (bytes_out > static_cast<DWORD>(_buffer.size())) {
newSize = bytes_out;
} else {
newSize = _buffer.size() * 2;
}
if (!ResizeBuffer(newSize, _buffer)) {
return false;
}
} else {
// The buffer is not too small.
break;
}
}
if (result == ERROR_SUCCESS) {
NDIS_802_11_BSSID_LIST* bssid_list =
reinterpret_cast<NDIS_802_11_BSSID_LIST*>(&_buffer[0]);
GetDataFromBssIdList(*bssid_list, _buffer.size(), outData);
}
return true;
}
namespace {
#define uint8 unsigned char
bool ConvertToAccessPointData(const NDIS_WLAN_BSSID& data, nsWifiAccessPoint* access_point_data)
{
access_point_data->setMac(data.MacAddress);
access_point_data->setSignal(data.Rssi);
// Note that _NDIS_802_11_SSID::Ssid::Ssid is not null-terminated.
const unsigned char* ssid = data.Ssid.Ssid;
size_t len = data.Ssid.SsidLength;
access_point_data->setSSID(reinterpret_cast<const char*>(ssid), len);
return true;
}
int GetDataFromBssIdList(const NDIS_802_11_BSSID_LIST& bss_id_list,
int list_size,
nsCOMArray<nsWifiAccessPoint>& outData)
{
// Walk through the BSS IDs.
int found = 0;
const uint8* iterator = reinterpret_cast<const uint8*>(&bss_id_list.Bssid[0]);
const uint8* end_of_buffer =
reinterpret_cast<const uint8*>(&bss_id_list) + list_size;
for (int i = 0; i < static_cast<int>(bss_id_list.NumberOfItems); ++i) {
const NDIS_WLAN_BSSID *bss_id =
reinterpret_cast<const NDIS_WLAN_BSSID*>(iterator);
// Check that the length of this BSS ID is reasonable.
if (bss_id->Length < sizeof(NDIS_WLAN_BSSID) ||
iterator + bss_id->Length > end_of_buffer) {
break;
}
nsWifiAccessPoint* ap = new nsWifiAccessPoint();
if (ConvertToAccessPointData(*bss_id, ap)) {
outData.AppendObject(ap);
++found;
}
// Move to the next BSS ID.
iterator += bss_id->Length;
}
return found;
}
bool UndefineDosDevice(const std::string& device_name) {
// We remove only the mapping we use, that is \Device\<device_name>.
std::string target_path = "\\Device\\" + device_name;
return DefineDosDevice(
DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
device_name.c_str(),
target_path.c_str()) == TRUE;
}
bool DefineDosDeviceIfNotExists(const std::string& device_name) {
// We create a DOS device name for the device at \Device\<device_name>.
std::string target_path = "\\Device\\" + device_name;
TCHAR target[kStringLength];
if (QueryDosDevice(device_name.c_str(), target, kStringLength) > 0 &&
target_path.compare(target) == 0) {
// Device already exists.
return true;
}
if (GetLastError() != ERROR_FILE_NOT_FOUND) {
return false;
}
if (!DefineDosDevice(DDD_RAW_TARGET_PATH,
device_name.c_str(),
target_path.c_str())) {
return false;
}
// Check that the device is really there.
return QueryDosDevice(device_name.c_str(), target, kStringLength) > 0 &&
target_path.compare(target) == 0;
}
HANDLE GetFileHandle(const std::string& device_name) {
// We access a device with DOS path \Device\<device_name> at
// \\.\<device_name>.
std::string formatted_device_name = "\\\\.\\" + device_name;
return CreateFile(formatted_device_name.c_str(),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
0, // security attributes
OPEN_EXISTING,
0, // flags and attributes
INVALID_HANDLE_VALUE);
}
int PerformQuery(HANDLE adapter_handle,
std::vector<char>& buffer,
DWORD* bytes_out) {
DWORD oid = OID_802_11_BSSID_LIST;
if (!DeviceIoControl(adapter_handle,
IOCTL_NDIS_QUERY_GLOBAL_STATS,
&oid,
sizeof(oid),
&buffer[0],
buffer.size(),
bytes_out,
NULL)) {
return GetLastError();
}
return ERROR_SUCCESS;
}
bool ResizeBuffer(size_t requested_size, std::vector<char>& buffer) {
if (requested_size > kMaximumBufferSize) {
buffer.resize(kInitialBufferSize);
return false;
}
buffer.resize(requested_size);
return true;
}
} // namespace
nsresult
WinXPWifiScanner::GetAccessPointsFromWLAN(nsCOMArray<nsWifiAccessPoint> &accessPoints)
{
if (!mImplementation) {
mImplementation = WindowsNdisApi::Create();
if (!mImplementation) {
return NS_ERROR_FAILURE;
}
}
accessPoints.Clear();
bool isOk = mImplementation->GetAccessPointData(accessPoints);
if (!isOk) {
mImplementation = 0;
return NS_ERROR_FAILURE;
}
return NS_OK;
}

View File

@ -1,25 +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/. */
#ifndef WINXPWIFISCANNER_H_
#define WINXPWIFISCANNER_H_
#include "nsAutoPtr.h"
#include "nsCOMArray.h"
#include "win_wifiScanner.h"
class nsWifiAccessPoint;
class WindowsNdisApi;
// This class is wrapper into the Chromium WindowNdisApi class for scanning wifis
// on Windows XP. When Firefox drops XP support, this code can go.
class WinXPWifiScanner : public WindowsWifiScannerInterface {
public:
nsresult GetAccessPointsFromWLAN(nsCOMArray<nsWifiAccessPoint> &accessPoints);
virtual ~WinXPWifiScanner() {}
private:
nsAutoPtr<WindowsNdisApi> mImplementation;
};
#endif

View File

@ -127,7 +127,8 @@ class ArtifactJob(object):
('bin/pk12util', ('bin', 'bin')),
('bin/ssltunnel', ('bin', 'bin')),
('bin/xpcshell', ('bin', 'bin')),
('bin/plugins/*', ('bin/plugins', 'plugins'))
('bin/plugins/*', ('bin/plugins', 'plugins')),
('bin/components/*', ('bin/components', 'bin/components')),
}
# We can tell our input is a test archive by this suffix, which happens to
@ -222,7 +223,7 @@ class AndroidArtifactJob(ArtifactJob):
'**/interfaces.xpt',
}
def process_artifact(self, filename, processed_filename):
def process_package_artifact(self, filename, processed_filename):
# Extract all .so files into the root, which will get copied into dist/bin.
with JarWriter(file=processed_filename, optimize=False, compress_level=5) as writer:
for p, f in UnpackFinder(JarFinder(filename, JarReader(filename))):
@ -407,7 +408,8 @@ class WinArtifactJob(ArtifactJob):
('bin/pk12util.exe', ('bin', 'bin')),
('bin/ssltunnel.exe', ('bin', 'bin')),
('bin/xpcshell.exe', ('bin', 'bin')),
('bin/plugins/*', ('bin/plugins', 'plugins'))
('bin/plugins/*', ('bin/plugins', 'plugins')),
('bin/components/*', ('bin/components', 'bin/components')),
}
def process_package_artifact(self, filename, processed_filename):
@ -436,32 +438,32 @@ class WinArtifactJob(ArtifactJob):
# https://tools.taskcluster.net/index/artifacts/#gecko.v2.mozilla-central.latest/gecko.v2.mozilla-central.latest
# The values correpsond to a pair of (<package regex>, <test archive regex>).
JOB_DETAILS = {
'android-api-15-opt': (AndroidArtifactJob, ('(public/build/fennec-(.*)\.android-arm.apk|public/build/target.apk)',
None)),
'android-api-15-debug': (AndroidArtifactJob, ('public/build/target.apk',
None)),
'android-x86-opt': (AndroidArtifactJob, ('public/build/target.apk',
None)),
'linux-opt': (LinuxArtifactJob, ('public/build/firefox-(.*)\.linux-i686\.tar\.bz2',
'public/build/firefox-(.*)\.common\.tests\.zip')),
'linux-debug': (LinuxArtifactJob, ('public/build/firefox-(.*)\.linux-i686\.tar\.bz2',
'public/build/firefox-(.*)\.common\.tests\.zip')),
'linux64-opt': (LinuxArtifactJob, ('public/build/firefox-(.*)\.linux-x86_64\.tar\.bz2',
'public/build/firefox-(.*)\.common\.tests\.zip')),
'linux64-debug': (LinuxArtifactJob, ('public/build/target\.tar\.bz2',
'public/build/target\.common\.tests\.zip')),
'macosx64-opt': (MacArtifactJob, ('public/build/firefox-(.*)\.mac\.dmg',
'public/build/firefox-(.*)\.common\.tests\.zip')),
'macosx64-debug': (MacArtifactJob, ('public/build/firefox-(.*)\.mac\.dmg',
'public/build/firefox-(.*)\.common\.tests\.zip')),
'win32-opt': (WinArtifactJob, ('public/build/firefox-(.*)\.win32.zip',
'public/build/firefox-(.*)\.common\.tests\.zip')),
'win32-debug': (WinArtifactJob, ('public/build/firefox-(.*)\.win32.zip',
'public/build/firefox-(.*)\.common\.tests\.zip')),
'win64-opt': (WinArtifactJob, ('public/build/firefox-(.*)\.win64.zip',
'public/build/firefox-(.*)\.common\.tests\.zip')),
'win64-debug': (WinArtifactJob, ('public/build/firefox-(.*)\.win64.zip',
'public/build/firefox-(.*)\.common\.tests\.zip')),
'android-api-15-opt': (AndroidArtifactJob, (r'(public/build/fennec-(.*)\.android-arm.apk|public/build/target\.apk)',
r'public/build/fennec-(.*)\.common\.tests\.zip|public/build/target-(.*)\.common\.tests\.zip')),
'android-api-15-debug': (AndroidArtifactJob, (r'public/build/target\.apk',
r'public/build/target\.common\.tests\.zip')),
'android-x86-opt': (AndroidArtifactJob, (r'public/build/target\.apk',
r'public/build/target\.common\.tests\.zip')),
'linux-opt': (LinuxArtifactJob, (r'public/build/firefox-(.*)\.linux-i686\.tar\.bz2',
r'public/build/firefox-(.*)\.common\.tests\.zip')),
'linux-debug': (LinuxArtifactJob, (r'public/build/firefox-(.*)\.linux-i686\.tar\.bz2',
r'public/build/firefox-(.*)\.common\.tests\.zip')),
'linux64-opt': (LinuxArtifactJob, (r'public/build/firefox-(.*)\.linux-x86_64\.tar\.bz2',
r'public/build/firefox-(.*)\.common\.tests\.zip')),
'linux64-debug': (LinuxArtifactJob, (r'public/build/target\.tar\.bz2',
r'public/build/target\.common\.tests\.zip')),
'macosx64-opt': (MacArtifactJob, (r'public/build/firefox-(.*)\.mac\.dmg',
r'public/build/firefox-(.*)\.common\.tests\.zip')),
'macosx64-debug': (MacArtifactJob, (r'public/build/firefox-(.*)\.mac\.dmg',
r'public/build/firefox-(.*)\.common\.tests\.zip')),
'win32-opt': (WinArtifactJob, (r'public/build/firefox-(.*)\.win32.zip',
r'public/build/firefox-(.*)\.common\.tests\.zip')),
'win32-debug': (WinArtifactJob, (r'public/build/firefox-(.*)\.win32.zip',
r'public/build/firefox-(.*)\.common\.tests\.zip')),
'win64-opt': (WinArtifactJob, (r'public/build/firefox-(.*)\.win64.zip',
r'public/build/firefox-(.*)\.common\.tests\.zip')),
'win64-debug': (WinArtifactJob, (r'public/build/firefox-(.*)\.win64.zip',
r'public/build/firefox-(.*)\.common\.tests\.zip')),
}

View File

@ -1149,4 +1149,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
static const int32_t kUnknownId = -1;
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1492526599120000);
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1492612710776000);

View File

@ -1,3 +1,4 @@
007sascha.de: max-age too low: 3600
00f.net: did not receive HSTS header
020wifi.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
0p.no: did not receive HSTS header
@ -24,7 +25,6 @@
247loan.com: could not connect to host
25daysof.io: could not connect to host
2859cc.com: could not connect to host
2kgwf.fi: could not connect to host
2or3.tk: could not connect to host
300651.ru: did not receive HSTS header
302.nyc: could not connect to host
@ -63,7 +63,7 @@ aaeblog.com: did not receive HSTS header
aaeblog.net: did not receive HSTS header
aaeblog.org: did not receive HSTS header
aapp.space: could not connect to host
abearofsoap.com: did not receive HSTS header
abearofsoap.com: could not connect to host
abecodes.net: could not connect to host
abeestrada.com: did not receive HSTS header
abilitylist.org: did not receive HSTS header
@ -185,7 +185,7 @@ amigogeek.net: could not connect to host
amilx.com: could not connect to host
amilx.org: could not connect to host
amitube.com: could not connect to host
amri.nl: did not receive HSTS header
amri.nl: could not connect to host
anagra.ms: could not connect to host
anakros.me: did not receive HSTS header
analytic-s.ml: could not connect to host
@ -240,6 +240,7 @@ apibot.de: could not connect to host
apis.google.com: did not receive HSTS header (error ignored - included regardless)
apis.world: did not receive HSTS header
apmg-certified.com: did not receive HSTS header
apmg-cyber.com: did not receive HSTS header
apnakliyat.com: did not receive HSTS header
apolloyl.com: did not receive HSTS header
aponkralsunucu.com: did not receive HSTS header
@ -265,7 +266,7 @@ arlen.se: could not connect to host
armory.consulting: could not connect to host
armory.supplies: could not connect to host
armytricka.cz: did not receive HSTS header
arpr.co: could not connect to host
arpr.co: did not receive HSTS header
arrayify.com: could not connect to host
ars-design.net: could not connect to host
ars.toscana.it: max-age too low: 0
@ -283,12 +284,13 @@ askfit.cz: did not receive HSTS header
asm-x.com: did not receive HSTS header
asmui.ga: could not connect to host
asmui.ml: could not connect to host
asr.li: could not connect to host
asr.rocks: could not connect to host
asrob.eu: could not connect to host
ass.org.au: did not receive HSTS header
assdecoeur.org: could not connect to host
asset-alive.com: did not receive HSTS header
asset-alive.net: did not receive HSTS header
astengox.com: did not receive HSTS header
astrath.net: could not connect to host
astrolpost.com: could not connect to host
astromelody.com: did not receive HSTS header
@ -309,6 +311,7 @@ aubiosales.com: did not receive HSTS header
aucubin.moe: could not connect to host
aufmerksamkeitsstudie.com: could not connect to host
aujapan.ru: could not connect to host
aunali1.com: could not connect to host
aurainfosec.com: did not receive HSTS header
aurainfosec.com.au: could not connect to host
auroratownshipfd.org: could not connect to host
@ -414,6 +417,7 @@ bf.am: max-age too low: 0
bgcparkstad.nl: did not receive HSTS header
bgmn.net: could not connect to host
bi.search.yahoo.com: did not receive HSTS header
bianinapiccanovias.com: could not connect to host
bidon.ca: did not receive HSTS header
bieberium.de: could not connect to host
bienenblog.cc: could not connect to host
@ -490,6 +494,7 @@ boensou.com: did not receive HSTS header
bogosity.se: could not connect to host
bohan.life: could not connect to host
bonapp.restaurant: could not connect to host
bondskampeerder.nl: could not connect to host
bonfi.net: did not receive HSTS header
bonigo.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
bonitabrazilian.co.nz: did not receive HSTS header
@ -523,7 +528,6 @@ brandspray.com: did not receive HSTS header
brettabel.com: could not connect to host
brianmwaters.net: did not receive HSTS header
brickoo.com: could not connect to host
brideandgroomdirect.ie: did not receive HSTS header
brks.xyz: could not connect to host
broken-oak.com: could not connect to host
brookechase.com: did not receive HSTS header
@ -551,7 +555,7 @@ burrow.ovh: could not connect to host
burtrum.me: could not connect to host
burtrum.top: could not connect to host
business.lookout.com: could not connect to host
business.medbank.com.mt: max-age too low: 10443202
business.medbank.com.mt: max-age too low: 10356774
businesshosting.nl: did not receive HSTS header
businessloanstoday.com: could not connect to host
busold.ws: could not connect to host
@ -559,7 +563,7 @@ bustimes.org: could not connect to host
butchersworkshop.com: did not receive HSTS header
buttercoin.com: could not connect to host
buybaby.eu: did not receive HSTS header
buyfox.de: did not receive HSTS header
buyfox.de: could not connect to host
by4cqb.cn: could not connect to host
bynet.cz: could not connect to host
bypassed.press: could not connect to host
@ -683,7 +687,6 @@ chrisfaber.com: could not connect to host
chriskyrouac.com: could not connect to host
christiaandruif.nl: could not connect to host
christianbro.gq: could not connect to host
christophersole.com: could not connect to host
christophheich.me: did not receive HSTS header
chrisupjohn.com: could not connect to host
chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless)
@ -698,6 +701,7 @@ cimalando.eu: could not connect to host
cip.md: max-age too low: 604800
ciplanutrition.com: did not receive HSTS header
circara.com: did not receive HSTS header
ciscommerce.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
citiagent.cz: could not connect to host
cityoflaurel.org: did not receive HSTS header
clara-baumert.de: could not connect to host
@ -705,7 +709,6 @@ classicsandexotics.com: did not receive HSTS header
classicspublishing.com: could not connect to host
clcleaningco.com: could not connect to host
cleaningsquad.ca: max-age too low: 0
clearc.tk: did not receive HSTS header
clerkendweller.uk: could not connect to host
clickandgo.com: did not receive HSTS header
clint.id.au: max-age too low: 0
@ -804,7 +807,6 @@ coursdeprogrammation.com: could not connect to host
coursella.com: did not receive HSTS header
covenantbank.net: could not connect to host
coverduck.ru: could not connect to host
cpuvinf.eu.org: could not connect to host
cr.search.yahoo.com: did not receive HSTS header
cracking.org: did not receive HSTS header
craftbeerbarn.co.uk: could not connect to host
@ -994,6 +996,8 @@ djz4music.com: did not receive HSTS header
dl.google.com: did not receive HSTS header (error ignored - included regardless)
dlc.viasinc.com: could not connect to host
dlemper.de: did not receive HSTS header
dlouwrink.nl: could not connect to host
dmix.ca: could not connect to host
dn42.eu: could not connect to host
dns.google.com: did not receive HSTS header (error ignored - included regardless)
do-do.tk: could not connect to host
@ -1046,7 +1050,6 @@ drtroyhendrickson.com: could not connect to host
drumbandesperanto.nl: could not connect to host
ds-christiansen.de: did not receive HSTS header
dshiv.io: could not connect to host
dubrovskiy.net: could not connect to host
dubrovskiy.pro: could not connect to host
duesee.org: could not connect to host
dullsir.com: did not receive HSTS header
@ -1149,6 +1152,7 @@ encrypted.google.com: did not receive HSTS header (error ignored - included rega
end.pp.ua: could not connect to host
endlessdark.net: max-age too low: 600
endzeit-architekten.com: did not receive HSTS header
engelundlicht.ch: did not receive HSTS header
engelwerbung.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
enigmacpt.com: did not receive HSTS header
enigmail.net: did not receive HSTS header
@ -1249,6 +1253,7 @@ falkp.no: did not receive HSTS header
fallenangelspirits.uk: could not connect to host
familie-zimmermann.at: could not connect to host
fanyl.cn: could not connect to host
farhood.org: could not connect to host
fashioncare.cz: did not receive HSTS header
fasset.jp: could not connect to host
fastograph.com: could not connect to host
@ -1257,6 +1262,7 @@ fatgeekflix.net: could not connect to host
fatherhood.gov: did not receive HSTS header
fatlossguide.xyz: could not connect to host
fatox.de: could not connect to host
fawkex.me: did not receive HSTS header
fayolle.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
fbox.li: could not connect to host
fdj.im: could not connect to host
@ -1316,7 +1322,6 @@ florianlillpopp.de: max-age too low: 10
floridaescapes.co.uk: did not receive HSTS header
flouartistique.ch: could not connect to host
flow.pe: could not connect to host
flow.su: could not connect to host
flowersandclouds.com: could not connect to host
flukethoughts.com: could not connect to host
flushstudios.com: did not receive HSTS header
@ -1326,6 +1331,7 @@ fndout.com: did not receive HSTS header
fnvsecurity.com: could not connect to host
fonetiq.io: could not connect to host
food4health.guide: could not connect to host
foodievenues.com: could not connect to host
footballmapped.com: could not connect to host
foraje-profesionale.ro: did not receive HSTS header
forbook.net: could not connect to host
@ -1345,6 +1351,7 @@ foxdev.io: could not connect to host
foxelbox.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
foxtrot.pw: could not connect to host
fr33d0m.link: could not connect to host
fragmentspuren.de: could not connect to host
francescopalazzo.com: could not connect to host
francevpn.xyz: could not connect to host
frangor.info: did not receive HSTS header
@ -1367,6 +1374,7 @@ frforms.com: did not receive HSTS header
friendica.ch: could not connect to host
frizo.com: did not receive HSTS header
froggstack.de: could not connect to host
fromlemaytoz.com: could not connect to host
frontmin.com: did not receive HSTS header
frost-ci.xyz: could not connect to host
frosty-gaming.xyz: did not receive HSTS header
@ -1380,6 +1388,7 @@ fugle.de: could not connect to host
fukushima-web.com: did not receive HSTS header
fundacionhijosdelsol.org: could not connect to host
funkyweddingideas.com.au: could not connect to host
funnyang.com: could not connect to host
funrun.com: did not receive HSTS header
furiffic.com: did not receive HSTS header
furry.be: max-age too low: 86400
@ -1425,6 +1434,7 @@ garden-life.org: could not connect to host
gatilagata.com.br: did not receive HSTS header
gchq.wtf: could not connect to host
gdpventure.com: max-age too low: 0
gdv.me: could not connect to host
gedankenbude.info: did not receive HSTS header
geekbundle.org: did not receive HSTS header
geekcast.co.uk: did not receive HSTS header
@ -1435,6 +1445,7 @@ gendrin.com: could not connect to host
genuu.com: could not connect to host
genuxation.com: could not connect to host
genyaa.com: could not connect to host
georgmayer.eu: could not connect to host
gerencianet.com.br: did not receive HSTS header
gersting.net: could not connect to host
get.zenpayroll.com: did not receive HSTS header
@ -1462,6 +1473,7 @@ gheorghesarcov.tk: could not connect to host
giakki.eu: could not connect to host
gietvloergarant.nl: did not receive HSTS header
gigacloud.org: max-age too low: 0
gilcloud.com: could not connect to host
gilly.berlin: did not receive HSTS header
gingali.de: did not receive HSTS header
gintenreiter-photography.com: did not receive HSTS header
@ -1515,12 +1527,13 @@ goolok.com: did not receive HSTS header
gorilla-gym.site: could not connect to host
gotech.com.eg: did not receive HSTS header
goto.google.com: did not receive HSTS header (error ignored - included regardless)
goto.world: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
goto.world: did not receive HSTS header
gotowned.org: did not receive HSTS header
gottcode.org: did not receive HSTS header
gov.ax: could not connect to host
govillemo.ca: did not receive HSTS header
gparent.org: did not receive HSTS header
gpfclan.de: could not connect to host
gpsfix.cz: could not connect to host
gpstuner.com: did not receive HSTS header
gracesofgrief.com: max-age too low: 86400
@ -1538,6 +1551,7 @@ gremots.com: did not receive HSTS header
greplin.com: could not connect to host
gresb.com: did not receive HSTS header
gribani.com: could not connect to host
griesser2.de: could not connect to host
grigalanzsoftware.com: could not connect to host
grossmann.gr: could not connect to host
groups.google.com: did not receive HSTS header (error ignored - included regardless)
@ -1553,7 +1567,6 @@ gtlfsonlinepay.com: did not receive HSTS header
gtraxapp.com: could not connect to host
guava.studio: did not receive HSTS header
guilde-vindicta.fr: did not receive HSTS header
guoqiang.info: did not receive HSTS header
gurusupe.com: could not connect to host
gussi.is: could not connect to host
gvt2.com: could not connect to host (error ignored - included regardless)
@ -1586,7 +1599,6 @@ haitschi.com: could not connect to host
haitschi.de: could not connect to host
haitschi.net: could not connect to host
haitschi.org: could not connect to host
hajnzic.at: could not connect to host
haku.moe: could not connect to host
hakugin.org: could not connect to host
halo.red: could not connect to host
@ -1596,8 +1608,10 @@ hannover-banditen.de: did not receive HSTS header
hao2taiwan.com: max-age too low: 0
happyfabric.me: did not receive HSTS header
happygadget.me: could not connect to host
happygastro.com: could not connect to host
harabuhouse.com: did not receive HSTS header
harbor-light.net: could not connect to host
hardfalcon.net: could not connect to host
hardline.xyz: could not connect to host
harmonycosmetic.com: max-age too low: 300
harristony.com: could not connect to host
@ -1630,7 +1644,6 @@ healtious.com: did not receive HSTS header
heart.ge: did not receive HSTS header
heartlandrentals.com: did not receive HSTS header
heftkaufen.de: did not receive HSTS header
hejahanif.se: could not connect to host
helloworldhost.com: did not receive HSTS header
helpadmin.net: could not connect to host
helpium.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
@ -1643,12 +1656,10 @@ herpaderp.net: did not receive HSTS header
herzbotschaft.de: did not receive HSTS header
hex2013.com: did not receive HSTS header
hexid.me: could not connect to host
heyguevara.com: could not connect to host
hibilog.com: could not connect to host
hicn.gq: could not connect to host
hiddendepth.ie: max-age too low: 0
hiddenmail.xyz: could not connect to host
hiddenrefuge.eu.org: could not connect to host
highseer.com: did not receive HSTS header
highsurf-miyazaki.com: did not receive HSTS header
hiitcentre.com: did not receive HSTS header
@ -1660,6 +1671,7 @@ hippies.com.br: could not connect to host
hitoy.org: did not receive HSTS header
hittipps.com: did not receive HSTS header
hlavacek.us: could not connect to host
hlyue.com: did not receive HSTS header
hmm.nyc: could not connect to host
hn.search.yahoo.com: did not receive HSTS header
hobbiesandotherstuff.com: could not connect to host
@ -1784,6 +1796,7 @@ indoorskiassen.nl: did not receive HSTS header
indust.me: did not receive HSTS header
infcof.com: max-age too low: 0
infinitude.xyz: could not connect to host
infinitudecloud.com: could not connect to host
infinitusgaming.eu: could not connect to host
inflation.ml: could not connect to host
infogrfx.com: did not receive HSTS header
@ -1799,7 +1812,7 @@ innophate-security.nl: could not connect to host
ins1gn1a.com: did not receive HSTS header
insane.zone: could not connect to host
insite-feedback.com: did not receive HSTS header
inspire-av.com: did not receive HSTS header
inspire-av.com: could not connect to host
inspiroinc.com: could not connect to host
instacart.com: did not receive HSTS header
instantdev.io: could not connect to host
@ -1837,6 +1850,7 @@ iranianlawschool.com: could not connect to host
iraqidinar.org: did not receive HSTS header
irazimina.ru: could not connect to host
irccloud.com: did not receive HSTS header
iready.ro: could not connect to host
irelandesign.com: did not receive HSTS header
ischool.co.jp: did not receive HSTS header
iseek.biz: max-age too low: 0
@ -1859,6 +1873,7 @@ itshost.ru: could not connect to host
ivi-fertility.com: max-age too low: 0
ivi.es: max-age too low: 0
ivk.website: could not connect to host
ivo.co.za: could not connect to host
izdiwho.com: could not connect to host
izolight.ch: could not connect to host
izoox.com: did not receive HSTS header
@ -1888,6 +1903,7 @@ jan27.org: did not receive HSTS header
janario.me: could not connect to host
janbrodda.de: max-age too low: 2592000
jannyrijneveld.nl: did not receive HSTS header
janokacer.sk: could not connect to host
janus-engineering.de: did not receive HSTS header
japlex.com: could not connect to host
jaqen.ch: could not connect to host
@ -1942,7 +1958,7 @@ joedavison.me: could not connect to host
jogi-server.de: did not receive HSTS header
johnblackbourn.com: could not connect to host
johners.me: could not connect to host
johners.tech: could not connect to host
johners.tech: max-age too low: 86400
johnrom.com: did not receive HSTS header
jonas-keidel.de: did not receive HSTS header
jonasgroth.se: did not receive HSTS header
@ -2065,7 +2081,6 @@ knowledgesnap.com: did not receive HSTS header
kodokushi.fr: could not connect to host
koen.io: did not receive HSTS header
koenrouwhorst.nl: did not receive HSTS header
koketteriet.se: could not connect to host
kollabria.com: max-age too low: 0
komikito.com: could not connect to host
kompetenzwerft.de: did not receive HSTS header
@ -2083,7 +2098,6 @@ kr.search.yahoo.com: did not receive HSTS header
krayx.com: could not connect to host
kredite.sale: could not connect to host
kriegt.es: could not connect to host
kristikala.nl: could not connect to host
krmela.com: could not connect to host
kroetenfuchs.de: could not connect to host
kropkait.pl: could not connect to host
@ -2116,7 +2130,6 @@ labordata.io: could not connect to host
labrador-retrievers.com.au: did not receive HSTS header
labs.moscow: could not connect to host
lachlankidson.net: did not receive HSTS header
lacicloud.net: could not connect to host
lacledeslan.ninja: could not connect to host
lacocinadelila.com: did not receive HSTS header
ladbroke.net: did not receive HSTS header
@ -2201,6 +2214,7 @@ lilpwny.com: could not connect to host
limalama.eu: max-age too low: 1
limeyeti.com: could not connect to host
limiteddata.co.uk: could not connect to host
limpid.nl: could not connect to host
limpido.it: could not connect to host
lincolnwayflorist.com: could not connect to host
lindberg.io: did not receive HSTS header
@ -2310,7 +2324,6 @@ mail-settings.google.com: did not receive HSTS header (error ignored - included
mail.google.com: did not receive HSTS header (error ignored - included regardless)
maildragon.com: could not connect to host
mailhost.it: could not connect to host
mailinabox.email: could not connect to host
makeitdynamic.com: could not connect to host
makerstuff.net: did not receive HSTS header
malerversand.de: did not receive HSTS header
@ -2324,6 +2337,7 @@ mammothmail.org: could not connect to host
managemynetsuite.com: could not connect to host
mannsolutions.co.uk: did not receive HSTS header
mansion-note.com: could not connect to host
maomaofuli.vip: could not connect to host
marchagen.nl: did not receive HSTS header
marcontrol.com: did not receive HSTS header
marcuskoh.com: could not connect to host
@ -2355,9 +2369,9 @@ matsuz.com: could not connect to host
mattberryman.com: did not receive HSTS header
mattcoles.io: did not receive HSTS header
mattfin.ch: could not connect to host
matthewohare.com: could not connect to host
matthewprenger.com: could not connect to host
matthiassteen.be: max-age too low: 0
mattli.us: could not connect to host
mattsvensson.com: did not receive HSTS header
mattwb65.com: could not connect to host
matty.digital: max-age too low: 3600
@ -2386,6 +2400,7 @@ mediawikicn.org: could not connect to host
medirich.co: could not connect to host
meditek-dv.ru: could not connect to host
medm-test.com: could not connect to host
medusa.wtf: could not connect to host
medwayindia.com: could not connect to host
meedoenzaanstad.nl: could not connect to host
meetings2.com: did not receive HSTS header
@ -2467,12 +2482,12 @@ mister.hosting: could not connect to host
misterl.net: did not receive HSTS header
mitchellrenouf.ca: could not connect to host
mittenhacks.com: could not connect to host
mitzpettel.com: could not connect to host
miui-germany.de: did not receive HSTS header
miyoshi-kikaku.co.jp: did not receive HSTS header
miyoshi-kikaku.com: did not receive HSTS header
mizd.at: could not connect to host
mizi.name: did not receive HSTS header
mlemay.com: could not connect to host
mlpepilepsy.org: could not connect to host
mmgazhomeloans.com: did not receive HSTS header
mnemotiv.com: could not connect to host
@ -2535,6 +2550,7 @@ mt.search.yahoo.com: did not receive HSTS header
mtcgf.com: did not receive HSTS header
mtg-esport.de: could not connect to host
mu.search.yahoo.com: did not receive HSTS header
muabannhanh.com: could not connect to host
mudcrab.us: did not receive HSTS header
mujadin.se: did not receive HSTS header
munich-rage.de: could not connect to host
@ -2575,7 +2591,7 @@ mypagella.eu: could not connect to host
mypagella.it: could not connect to host
myraytech.net: did not receive HSTS header
mysecretrewards.com: did not receive HSTS header
mystery-science-theater-3000.de: did not receive HSTS header
mystery-science-theater-3000.de: could not connect to host
mystudy.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
myvirtualserver.com: max-age too low: 2592000
myzone.com: did not receive HSTS header
@ -2594,7 +2610,8 @@ nanogeneinc.com: could not connect to host
nanto.eu: could not connect to host
narada.com.ua: could not connect to host
nargileh.nl: could not connect to host
nascher.org: could not connect to host
narindal.ch: did not receive HSTS header
nascher.org: max-age too low: 7884000
nasreddine.xyz: could not connect to host
natalia.io: could not connect to host
natalt.org: did not receive HSTS header
@ -2664,9 +2681,9 @@ nicolasbettag.me: did not receive HSTS header
niconiconi.xyz: could not connect to host
niconode.com: could not connect to host
nien.chat: could not connect to host
nightx.uk: could not connect to host
niho.jp: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
nikcub.com: could not connect to host
nikksno.io: could not connect to host
nikomo.fi: could not connect to host
ninchisho-online.com: did not receive HSTS header
nine-hells.net: could not connect to host
@ -2700,7 +2717,6 @@ norb.at: could not connect to host
nosecretshop.com: could not connect to host
nossasenhoradaconceicao.com.br: could not connect to host
notadd.com: did not receive HSTS header
notnl.com: could not connect to host
nottheonion.net: did not receive HSTS header
nouvelle-vague-saint-cast.fr: did not receive HSTS header
novacoast.com: did not receive HSTS header
@ -2800,7 +2816,6 @@ ooonja.de: could not connect to host
oopsmycase.com: could not connect to host
oost.io: could not connect to host
open-coding.org: could not connect to host
open-future.be: could not connect to host
open-mx.de: could not connect to host
open-to-repair.fr: did not receive HSTS header
opendesk.cc: did not receive HSTS header
@ -2884,6 +2899,7 @@ papygeek.com: could not connect to host
parent5446.us: could not connect to host
parentmail.co.uk: did not receive HSTS header
parithy.net: could not connect to host
parkingplus.co.il: did not receive HSTS header
parodybit.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
parpaing-paillette.net: could not connect to host
particonpsplus.it: could not connect to host
@ -2906,6 +2922,7 @@ pastenib.com: could not connect to host
paster.li: did not receive HSTS header
patflix.com: could not connect to host
patientinsight.net: could not connect to host
patrz.eu: could not connect to host
patt.us: did not receive HSTS header
patterson.mp: could not connect to host
paulchen.at: could not connect to host
@ -2926,12 +2943,12 @@ pekkapikkarainen.fi: did not receive HSTS header
pekkarik.ru: could not connect to host
penguinclientsystem.com: did not receive HSTS header
pensacolawinterfest.org: could not connect to host
pentandra.com: could not connect to host
pepchid.com: did not receive HSTS header
pepperhead.com: did not receive HSTS header
pepperworldhotshop.de: did not receive HSTS header
perfectionis.me: could not connect to host
performous.org: could not connect to host
perfumista.vn: could not connect to host
perlwork.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
perplex.nl: did not receive HSTS header
perroud.pro: max-age too low: 2592000
@ -2945,7 +2962,6 @@ petrachuk.ru: did not receive HSTS header
petravdbos.nl: did not receive HSTS header
petrolplus.ru: did not receive HSTS header
petsittersservices.com: could not connect to host
pettitcoat.com: could not connect to host
pettsy.com: could not connect to host
pewboards.com: could not connect to host
pgpm.io: could not connect to host
@ -2967,7 +2983,7 @@ pinesandneedles.com: did not receive HSTS header
pippen.io: could not connect to host
piratedb.com: could not connect to host
piratedot.com: could not connect to host
piratelist.online: did not receive HSTS header
piratelist.online: could not connect to host
piratenlogin.de: could not connect to host
pirateproxy.sx: could not connect to host
pirati.cz: max-age too low: 604800
@ -3020,6 +3036,7 @@ poon.tech: could not connect to host
porno-gif.ru: did not receive HSTS header
portalplatform.net: did not receive HSTS header
postcodewise.co.uk: did not receive HSTS header
posterspy.com: did not receive HSTS header
postscheduler.org: could not connect to host
posylka.de: did not receive HSTS header
poussinooz.fr: could not connect to host
@ -3070,7 +3087,7 @@ proximato.com: could not connect to host
proxybay.al: could not connect to host
proxybay.club: could not connect to host
proxybay.info: did not receive HSTS header
prxio.site: could not connect to host
prxio.site: did not receive HSTS header
prytkov.com: did not receive HSTS header
psicologia.co.ve: could not connect to host
psw.academy: did not receive HSTS header
@ -3095,6 +3112,7 @@ pyplo.org: did not receive HSTS header
pypt.lt: did not receive HSTS header
q2.si: did not receive HSTS header
qccqld.org.au: could not connect to host
qiliang.wang: could not connect to host
qingxuan.info: max-age too low: 864000
qinxi1992.com: did not receive HSTS header
qldconservation.org: could not connect to host
@ -3164,6 +3182,7 @@ reggae-cdmx.com: did not receive HSTS header
reic.me: could not connect to host
rejo.in: could not connect to host
rejuvemedspa.com: did not receive HSTS header
reliable-mail.de: max-age too low: 3600
relisten.nl: did not receive HSTS header
rem.pe: could not connect to host
remitatm.com: could not connect to host
@ -3213,7 +3232,6 @@ rk6.cz: could not connect to host
rkmantpur.org: did not receive HSTS header
rme.li: did not receive HSTS header
rngmeme.com: could not connect to host
roadfeast.com: could not connect to host
roan24.pl: did not receive HSTS header
robertglastra.com: could not connect to host
robigalia.org: did not receive HSTS header
@ -3295,11 +3313,13 @@ sandviks.com: did not receive HSTS header
sansemea.com: could not connect to host
sansonehowell.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
sarah-beckett-harpist.com: did not receive HSTS header
sarahsweetlife.com: could not connect to host
sarisonproductions.com: did not receive HSTS header
saruwebshop.co.za: did not receive HSTS header
satmep.com: did not receive HSTS header
satriyowibowo.my.id: did not receive HSTS header
satsukii.moe: did not receive HSTS header
saturne.tk: could not connect to host
saturngames.co.uk: did not receive HSTS header
saucyfox.net: did not receive HSTS header
saunasandstuff.ca: did not receive HSTS header
@ -3313,9 +3333,11 @@ sb-group.dk: did not receive HSTS header
sbox-archives.com: could not connect to host
sby.de: did not receive HSTS header
sc4le.com: could not connect to host
schamlosharmlos.de: could not connect to host
schmitz.link: could not connect to host
schnell-gold.com: could not connect to host
schoop.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
schopenhauer-institut.de: could not connect to host
schreiber-netzwerk.eu: did not receive HSTS header
schrodinger.io: could not connect to host
schulterglatzen-altenwalde.de: could not connect to host
@ -3431,7 +3453,6 @@ shukatsu-note.com: could not connect to host
shv25.se: could not connect to host
shwongacc.com: could not connect to host
siammedia.co: could not connect to host
siciliadigitale.pro: did not receive HSTS header
siddhant.me: could not connect to host
sifls.com: could not connect to host
sig6.org: could not connect to host
@ -3451,6 +3472,7 @@ simpleai.net: max-age too low: 600
simplefraud.com: could not connect to host
simplelearner.com: could not connect to host
simplepractice.com: did not receive HSTS header
simplixos.org: could not connect to host
simply-premium.com: max-age too low: 0
sincron.org: could not connect to host
siriad.com: did not receive HSTS header
@ -3541,7 +3563,7 @@ souyar.us: could not connect to host
sovereignshare.com: could not connect to host
sown.dyndns.org: could not connect to host
spacehq.org: max-age too low: 0
sparelib.com: max-age too low: 3650
sparelib.com: could not connect to host
spark.team: could not connect to host
sparklingsparklers.com: did not receive HSTS header
sparsa.army: could not connect to host
@ -3670,7 +3692,7 @@ suprlink.net: could not connect to host
supweb.ovh: did not receive HSTS header
surfeasy.com: did not receive HSTS header
surfone-leucate.com: did not receive HSTS header
sushi101tempe.com: did not receive HSTS header
sushi101tempe.com: could not connect to host
sustsol.com: could not connect to host
suzukikenichi.com: did not receive HSTS header
sv.search.yahoo.com: did not receive HSTS header
@ -3690,7 +3712,6 @@ syncer.jp: did not receive HSTS header
syncserve.net: did not receive HSTS header
syneic.com: did not receive HSTS header
syno.gq: could not connect to host
syntheticmotoroil.org: did not receive HSTS header
syso.name: could not connect to host
szaszm.tk: max-age too low: 0
t-tz.com: could not connect to host
@ -3703,7 +3724,6 @@ tafoma.com: did not receive HSTS header
tageau.com: could not connect to host
taglondon.org: did not receive HSTS header
tails.com.ar: did not receive HSTS header
taken.pl: could not connect to host
talk.google.com: did not receive HSTS header (error ignored - included regardless)
talktwincities.com: could not connect to host
tallr.se: could not connect to host
@ -3727,6 +3747,7 @@ taxbench.com: could not connect to host
taxsnaps.co.nz: did not receive HSTS header
tazemama.biz: could not connect to host
tazz.in: could not connect to host
tc-bonito.de: max-age too low: 3600
tcao.info: could not connect to host
tcby45.xyz: did not receive HSTS header
tcdw.net: could not connect to host
@ -3734,7 +3755,7 @@ tcl.ath.cx: did not receive HSTS header
tcomms.org: max-age too low: 0
tcp.expert: did not receive HSTS header
teachforcanada.ca: did not receive HSTS header
tealdrones.com: could not connect to host
team-teasers.com: could not connect to host
teamsocial.co: did not receive HSTS header
teamzeus.cz: could not connect to host
tech55i.com: did not receive HSTS header
@ -3858,6 +3879,7 @@ tmitchell.io: could not connect to host
tmprod.com: did not receive HSTS header
tncnanet.com.br: could not connect to host
tnrsca.jp: did not receive HSTS header
tobi-mayer.de: could not connect to host
tobias-bielefeld.de: did not receive HSTS header
tobiasmathes.com: could not connect to host
tobiasmathes.name: could not connect to host
@ -3868,7 +3890,6 @@ tokyopopline.com: did not receive HSTS header
tollmanz.com: did not receive HSTS header
tom.horse: did not receive HSTS header
tomberek.info: could not connect to host
tomcort.com: could not connect to host
tomeara.net: could not connect to host
tomharling.co.uk: max-age too low: 86400
tomharling.uk: max-age too low: 86400
@ -3896,7 +3917,7 @@ track.plus: could not connect to host
tracktivity.com.au: did not receive HSTS header
tradingcentre.com.au: did not receive HSTS header
tradinghope.com: could not connect to host
traeningsprojekt.dk: did not receive HSTS header
tradiz.org: could not connect to host
traindb.nl: could not connect to host
trainut.com: could not connect to host
translate.googleapis.com: did not receive HSTS header (error ignored - included regardless)
@ -3918,7 +3939,6 @@ tsecy.com: did not receive HSTS header
tsgoc.com: did not receive HSTS header
tsrstore.gq: could not connect to host
tssouthernpower.com: max-age too low: 0
tsumegumi.net: could not connect to host
tuamoronline.com: could not connect to host
tubepro.de: max-age too low: 600000
tuingereedschappen.net: could not connect to host
@ -3954,7 +3974,6 @@ tyroproducts.eu: did not receive HSTS header
tzappa.net: could not connect to host
u-blox.com: max-age too low: 0
ua.search.yahoo.com: did not receive HSTS header
uberwald.ws: could not connect to host
ubicloud.de: could not connect to host
ubicv.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
ublox.com: did not receive HSTS header
@ -4056,6 +4075,7 @@ videnskabsklubben.dk: did not receive HSTS header
videomuz.com: did not receive HSTS header
vidz.ga: could not connect to host
vieaw.com: could not connect to host
vietnamhost.vn: could not connect to host
viewsea.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
vigilo.cf: could not connect to host
viktorsvantesson.net: did not receive HSTS header
@ -4083,7 +4103,6 @@ voliere-info.nl: did not receive HSTS header
vortexhobbies.com: did not receive HSTS header
vosjesweb.nl: did not receive HSTS header
vox.vg: did not receive HSTS header
vpip.net: could not connect to host
vpl.me: did not receive HSTS header
vpn-byen.dk: did not receive HSTS header
vratny.space: could not connect to host
@ -4096,12 +4115,14 @@ vzk.io: could not connect to host
w4a.fr: max-age too low: 0
w4xzr.top: could not connect to host
w4xzr.xyz: could not connect to host
waixingrenfuli7.vip: could not connect to host
wakapp.de: could not connect to host
walkeryoung.ca: could not connect to host
wallet.google.com: did not receive HSTS header (error ignored - included regardless)
wallsblog.dk: could not connect to host
walnutgaming.co.uk: could not connect to host
wanban.io: could not connect to host
wangqiliang.org: could not connect to host
wangzuan168.cc: did not receive HSTS header
wapjt.cn: could not connect to host
warandpeace.xyz: could not connect to host
@ -4141,6 +4162,7 @@ webwork.pw: could not connect to host
weddingenvelopes.co.uk: did not receive HSTS header
weddingibiza.nl: could not connect to host
weekly.fyi: could not connect to host
weicn.org: did not receive HSTS header
weizenke.im: could not connect to host
wellsolveit.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
weltmeisterschaft.net: could not connect to host
@ -4148,7 +4170,6 @@ weme.eu: could not connect to host
wendalyncheng.com: could not connect to host
werdeeintimo.de: did not receive HSTS header
werkenbijkfc.nl: did not receive HSTS header
werkplaatsoost.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
werkruimtebottendaal.nl: did not receive HSTS header
wesleyharris.ca: did not receive HSTS header
westendzone.com: max-age too low: 0
@ -4214,7 +4235,6 @@ wootton95.com: could not connect to host
woresite.jp: did not receive HSTS header
workfone.io: did not receive HSTS header
workwithgo.com: could not connect to host
wormdisk.net: could not connect to host
wowapi.org: could not connect to host
wphostingspot.com: did not receive HSTS header
wpmetadatastandardsproject.org: could not connect to host
@ -4264,6 +4284,7 @@ xiaody.me: could not connect to host
xiaolvmu.me: could not connect to host
xiaoxiao.im: could not connect to host
ximens.me: did not receive HSTS header
xinbiji.cn: could not connect to host
xisa.it: could not connect to host
xiyu.moe: could not connect to host
xmonk.org: did not receive HSTS header
@ -4293,7 +4314,6 @@ xtream-hosting.com: could not connect to host
xtream-hosting.de: could not connect to host
xtream-hosting.eu: could not connect to host
xtreamhosting.eu: could not connect to host
xtremegaming.it: could not connect to host
xuri.me: max-age too low: 2592000
xuyh0120.win: could not connect to host
xwalck.se: could not connect to host
@ -4319,6 +4339,7 @@ yetcore.io: could not connect to host
yingyj.com: could not connect to host
yippie.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
yjsoft.me: did not receive HSTS header
yjsw.sh.cn: could not connect to host
ynode.co: did not receive HSTS header
ynsn.nl: did not receive HSTS header
yntongji.com: did not receive HSTS header
@ -4328,7 +4349,7 @@ yoloprod.fr: could not connect to host
yoloseo.com: could not connect to host
youcontrol.ru: could not connect to host
youngandunited.nl: did not receive HSTS header
yoursecondphone.co: did not receive HSTS header
yoursecondphone.co: could not connect to host
yourstrongbox.com: could not connect to host
ytec.ca: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
yu.gg: did not receive HSTS header
@ -4348,7 +4369,7 @@ zachgibbens.org: could not connect to host
zadieheimlich.com: did not receive HSTS header
zamorano.edu: could not connect to host
zap.yt: could not connect to host
zarooba.com: could not connect to host
zarooba.com: did not receive HSTS header
zbigniewgalucki.eu: did not receive HSTS header
zbp.at: did not receive HSTS header
zebrababy.cn: did not receive HSTS header

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