mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-01-08 12:22:34 +00:00
Merge mozilla-central to mozilla-inbound
This commit is contained in:
commit
ccfe5b9092
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
});
|
||||
|
||||
|
@ -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);
|
||||
});
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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 = {};
|
||||
|
@ -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 = {};
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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('/');
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -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() {
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
|
@ -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*() {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -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();
|
||||
});
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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) {
|
||||
|
@ -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");
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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]
|
||||
|
@ -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();
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
])
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 = {
|
||||
|
@ -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: "",
|
||||
|
@ -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",
|
||||
|
@ -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()
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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">
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
@ -7,6 +7,7 @@ DevToolsModules(
|
||||
'params-panel.js',
|
||||
'preview-panel.js',
|
||||
'properties-view.js',
|
||||
'response-panel.js',
|
||||
'security-panel.js',
|
||||
'timings-panel.js',
|
||||
)
|
||||
|
@ -195,3 +195,4 @@ const PropertiesView = createClass({
|
||||
});
|
||||
|
||||
module.exports = PropertiesView;
|
||||
|
||||
|
204
devtools/client/netmonitor/shared/components/response-panel.js
Normal file
204
devtools/client/netmonitor/shared/components/response-panel.js
Normal 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);
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
@ -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");
|
||||
}
|
||||
});
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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.");
|
||||
}
|
||||
});
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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.");
|
||||
}
|
||||
});
|
||||
|
@ -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.");
|
||||
}
|
||||
});
|
||||
|
@ -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.");
|
||||
}
|
||||
});
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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.");
|
||||
|
||||
|
@ -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.");
|
||||
}
|
||||
});
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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 + "}";
|
||||
}
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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
|
||||
|
1267
dom/animation/test/chrome/file_animation_performance_warning.html
Normal file
1267
dom/animation/test/chrome/file_animation_performance_warning.html
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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() {
|
||||
|
@ -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>
|
||||
|
@ -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*
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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 {
|
||||
|
@ -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 = {
|
||||
|
@ -92,7 +92,6 @@ function persistDocument(aDoc) {
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
addLoadEvent(function() {
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
var srcDoc = document.getElementById('source').contentDocument;
|
||||
persistDocument(srcDoc);
|
||||
});
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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";
|
||||
|
@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -17,6 +17,7 @@ Contents:
|
||||
defaultdomains
|
||||
bouncer
|
||||
shutdown
|
||||
push
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
145
mobile/android/docs/push.rst
Normal file
145
mobile/android/docs/push.rst
Normal 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.
|
@ -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)
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
|
@ -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']
|
||||
|
@ -76,7 +76,7 @@ class nsWifiMonitor final : nsIRunnable, nsIWifiMonitor, nsIObserver
|
||||
mozilla::ReentrantMonitor mReentrantMonitor;
|
||||
|
||||
#ifdef XP_WIN
|
||||
nsAutoPtr<WindowsWifiScannerInterface> mWinWifiScanner;
|
||||
nsAutoPtr<WinWifiScanner> mWinWifiScanner;
|
||||
#endif
|
||||
};
|
||||
#else
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
@ -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
|
@ -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')),
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user