Merge m-c to autoland, a=merge

This commit is contained in:
Wes Kocher 2016-12-02 13:14:06 -08:00
commit 1dd5ea0353
137 changed files with 17583 additions and 17144 deletions

File diff suppressed because it is too large Load Diff

View File

@ -293,29 +293,34 @@ let BrowserUsageTelemetry = {
}
// Dispatch the search signal to other handlers.
this._handleSearchAction(source, details);
this._handleSearchAction(engine, source, details);
},
_handleSearchAction(source, details) {
_recordSearch(engine, source, action = null) {
let scalarKey = action ? "search_" + action : "search";
Services.telemetry.keyedScalarAdd("browser.engagement.navigation." + source,
scalarKey, 1);
Services.telemetry.recordEvent("navigation", "search", source, action,
{ engine: getSearchEngineId(engine) });
},
_handleSearchAction(engine, source, details) {
switch (source) {
case "urlbar":
case "oneoff-urlbar":
case "searchbar":
case "oneoff-searchbar":
case "unknown": // Edge case: this is the searchbar (see bug 1195733 comment 7).
this._handleSearchAndUrlbar(source, details);
this._handleSearchAndUrlbar(engine, source, details);
break;
case "abouthome":
Services.telemetry.keyedScalarAdd("browser.engagement.navigation.about_home",
"search_enter", 1);
this._recordSearch(engine, "about_home", "enter");
break;
case "newtab":
Services.telemetry.keyedScalarAdd("browser.engagement.navigation.about_newtab",
"search_enter", 1);
this._recordSearch(engine, "about_newtab", "enter");
break;
case "contextmenu":
Services.telemetry.keyedScalarAdd("browser.engagement.navigation.contextmenu",
"search", 1);
this._recordSearch(engine, "contextmenu");
break;
}
},
@ -324,15 +329,14 @@ let BrowserUsageTelemetry = {
* This function handles the "urlbar", "urlbar-oneoff", "searchbar" and
* "searchbar-oneoff" sources.
*/
_handleSearchAndUrlbar(source, details) {
_handleSearchAndUrlbar(engine, source, details) {
// We want "urlbar" and "urlbar-oneoff" (and similar cases) to go in the same
// scalar, but in a different key.
// When using one-offs in the searchbar we get an "unknown" source. See bug
// 1195733 comment 7 for the context. Fix-up the label here.
const plainSourceName =
const sourceName =
(source === "unknown") ? "searchbar" : source.replace("oneoff-", "");
const scalarName = "browser.engagement.navigation." + plainSourceName;
const isOneOff = !!details.isOneOff;
if (isOneOff) {
@ -346,25 +350,24 @@ let BrowserUsageTelemetry = {
return;
}
// If that's a legit one-off search signal, increment the scalar using the
// relative key.
Services.telemetry.keyedScalarAdd(scalarName, "search_oneoff", 1);
// If that's a legit one-off search signal, record it using the relative key.
this._recordSearch(engine, sourceName, "oneoff");
return;
}
// The search was not a one-off. It was a search with the default search engine.
if (details.isSuggestion) {
// It came from a suggested search, so count it as such.
Services.telemetry.keyedScalarAdd(scalarName, "search_suggestion", 1);
this._recordSearch(engine, sourceName, "suggestion");
return;
} else if (details.isAlias) {
// This one came from a search that used an alias.
Services.telemetry.keyedScalarAdd(scalarName, "search_alias", 1);
this._recordSearch(engine, sourceName, "alias");
return;
}
// The search signal was generated by typing something and pressing enter.
Services.telemetry.keyedScalarAdd(scalarName, "search_enter", 1);
this._recordSearch(engine, sourceName, "enter");
},
/**

View File

@ -37,8 +37,9 @@ add_task(function* setup() {
});
add_task(function* test_context_menu() {
// Let's reset the counts.
// Let's reset the Telemetry data.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist = getSearchCountsHistogram();
// Open a new tab with a page containing some text.
@ -64,7 +65,7 @@ add_task(function* test_context_menu() {
let searchItem = contextMenu.getElementsByAttribute("id", "context-searchselect")[0];
searchItem.click();
info("Validate the search counts.");
info("Validate the search metrics.");
const scalars =
Services.telemetry.snapshotKeyedScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
checkKeyedScalar(scalars, SCALAR_CONTEXT_MENU, "search", 1);
@ -74,6 +75,11 @@ add_task(function* test_context_menu() {
// Make sure SEARCH_COUNTS contains identical values.
checkKeyedHistogram(search_hist, 'other-MozSearch.contextmenu', 1);
// Also check events.
let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
events = events.filter(e => e[1] == "navigation" && e[2] == "search");
checkEvents(events, [["navigation", "search", "contextmenu", null, {engine: "other-MozSearch"}]]);
contextMenu.hidePopup();
yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
yield BrowserTestUtils.removeTab(tab);
@ -82,6 +88,7 @@ add_task(function* test_context_menu() {
add_task(function* test_about_newtab() {
// Let's reset the counts.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist = getSearchCountsHistogram();
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "about:newtab", false);
@ -105,5 +112,10 @@ add_task(function* test_about_newtab() {
// Make sure SEARCH_COUNTS contains identical values.
checkKeyedHistogram(search_hist, 'other-MozSearch.newtab', 1);
// Also check events.
let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
events = events.filter(e => e[1] == "navigation" && e[2] == "search");
checkEvents(events, [["navigation", "search", "about_newtab", "enter", {engine: "other-MozSearch"}]]);
yield BrowserTestUtils.removeTab(tab);
});

View File

@ -41,6 +41,7 @@ add_task(function* setup() {
add_task(function* test_abouthome_simpleQuery() {
// Let's reset the counts.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist = getSearchCountsHistogram();
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser);
@ -74,5 +75,10 @@ add_task(function* test_abouthome_simpleQuery() {
// Make sure SEARCH_COUNTS contains identical values.
checkKeyedHistogram(search_hist, 'other-MozSearch.abouthome', 1);
// Also check events.
let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
events = events.filter(e => e[1] == "navigation" && e[2] == "search");
checkEvents(events, [["navigation", "search", "about_home", "enter", {engine: "other-MozSearch"}]]);
yield BrowserTestUtils.removeTab(tab);
});

View File

@ -81,6 +81,7 @@ add_task(function* setup() {
add_task(function* test_plainQuery() {
// Let's reset the counts.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist = getSearchCountsHistogram();
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank");
@ -101,12 +102,18 @@ add_task(function* test_plainQuery() {
// Make sure SEARCH_COUNTS contains identical values.
checkKeyedHistogram(search_hist, 'other-MozSearch.searchbar', 1);
// Also check events.
let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
events = events.filter(e => e[1] == "navigation" && e[2] == "search");
checkEvents(events, [["navigation", "search", "searchbar", "enter", {engine: "other-MozSearch"}]]);
yield BrowserTestUtils.removeTab(tab);
});
add_task(function* test_oneOff() {
// Let's reset the counts.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist = getSearchCountsHistogram();
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank");
@ -130,12 +137,18 @@ add_task(function* test_oneOff() {
// Make sure SEARCH_COUNTS contains identical values.
checkKeyedHistogram(search_hist, 'other-MozSearch2.searchbar', 1);
// Also check events.
let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
events = events.filter(e => e[1] == "navigation" && e[2] == "search");
checkEvents(events, [["navigation", "search", "searchbar", "oneoff", {engine: "other-MozSearch2"}]]);
yield BrowserTestUtils.removeTab(tab);
});
add_task(function* test_suggestion() {
// Let's reset the counts.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist = getSearchCountsHistogram();
// Create an engine to generate search suggestions and add it as default
@ -168,7 +181,13 @@ add_task(function* test_suggestion() {
"This search must only increment one entry in the scalar.");
// Make sure SEARCH_COUNTS contains identical values.
checkKeyedHistogram(search_hist, 'other-' + suggestionEngine.name + '.searchbar', 1);
let searchEngineId = 'other-' + suggestionEngine.name;
checkKeyedHistogram(search_hist, searchEngineId + '.searchbar', 1);
// Also check events.
let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
events = events.filter(e => e[1] == "navigation" && e[2] == "search");
checkEvents(events, [["navigation", "search", "searchbar", "suggestion", {engine: searchEngineId}]]);
Services.search.currentEngine = previousEngine;
Services.search.removeEngine(suggestionEngine);

View File

@ -74,6 +74,7 @@ add_task(function* setup() {
add_task(function* test_simpleQuery() {
// Let's reset the counts.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist = getSearchCountsHistogram();
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank");
@ -94,12 +95,18 @@ add_task(function* test_simpleQuery() {
// Make sure SEARCH_COUNTS contains identical values.
checkKeyedHistogram(search_hist, 'other-MozSearch.urlbar', 1);
// Also check events.
let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
events = events.filter(e => e[1] == "navigation" && e[2] == "search");
checkEvents(events, [["navigation", "search", "urlbar", "enter", {engine: "other-MozSearch"}]]);
yield BrowserTestUtils.removeTab(tab);
});
add_task(function* test_searchAlias() {
// Let's reset the counts.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist = getSearchCountsHistogram();
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank");
@ -120,12 +127,18 @@ add_task(function* test_searchAlias() {
// Make sure SEARCH_COUNTS contains identical values.
checkKeyedHistogram(search_hist, 'other-MozSearch.urlbar', 1);
// Also check events.
let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
events = events.filter(e => e[1] == "navigation" && e[2] == "search");
checkEvents(events, [["navigation", "search", "urlbar", "alias", {engine: "other-MozSearch"}]]);
yield BrowserTestUtils.removeTab(tab);
});
add_task(function* test_oneOff() {
// Let's reset the counts.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist = getSearchCountsHistogram();
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank");
@ -149,12 +162,18 @@ add_task(function* test_oneOff() {
// Make sure SEARCH_COUNTS contains identical values.
checkKeyedHistogram(search_hist, 'other-MozSearch.urlbar', 1);
// Also check events.
let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
events = events.filter(e => e[1] == "navigation" && e[2] == "search");
checkEvents(events, [["navigation", "search", "urlbar", "oneoff", {engine: "other-MozSearch"}]]);
yield BrowserTestUtils.removeTab(tab);
});
add_task(function* test_suggestion() {
// Let's reset the counts.
Services.telemetry.clearScalars();
Services.telemetry.clearEvents();
let search_hist = getSearchCountsHistogram();
// Create an engine to generate search suggestions and add it as default
@ -187,7 +206,13 @@ add_task(function* test_suggestion() {
"This search must only increment one entry in the scalar.");
// Make sure SEARCH_COUNTS contains identical values.
checkKeyedHistogram(search_hist, 'other-' + suggestionEngine.name + '.urlbar', 1);
let searchEngineId = 'other-' + suggestionEngine.name;
checkKeyedHistogram(search_hist, searchEngineId + '.urlbar', 1);
// Also check events.
let events = Services.telemetry.snapshotBuiltinEvents(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false);
events = events.filter(e => e[1] == "navigation" && e[2] == "search");
checkEvents(events, [["navigation", "search", "urlbar", "suggestion", {engine: searchEngineId}]]);
Services.search.currentEngine = previousEngine;
Services.search.removeEngine(suggestionEngine);

View File

@ -95,3 +95,19 @@ function checkKeyedHistogram(h, key, expectedValue) {
Assert.ok(key in snapshot, `The histogram must contain ${key}.`);
Assert.equal(snapshot[key].sum, expectedValue, `The key ${key} must contain ${expectedValue}.`);
}
function checkEvents(events, expectedEvents) {
if (!Services.telemetry.canRecordExtended) {
// Currently we only collect the tested events when extended Telemetry is enabled.
return;
}
Assert.equal(events.length, expectedEvents.length, "Should have matching amount of events.");
// Strip timestamps from the events for easier comparison.
events = events.map(e => e.slice(1));
for (let i = 0; i < events.length; ++i) {
Assert.deepEqual(events[i], expectedEvents[i], "Events should match.");
}
}

View File

@ -56,7 +56,7 @@ if test -n "$ENABLE_CLANG_PLUGIN"; then
dnl due to undefined symbols (which will be provided by clang).
CLANG_LDFLAGS="-Wl,-flat_namespace -Wl,-undefined,suppress -lclangASTMatchers"
elif test "${HOST_OS_ARCH}" = "WINNT"; then
CLANG_LDFLAGS="clangASTMatchers.lib"
CLANG_LDFLAGS="clang.lib"
else
CLANG_LDFLAGS="-lclangASTMatchers"
fi

View File

@ -205,6 +205,8 @@ def build_one_stage(cc, cxx, src_dir, stage_dir, build_libcxx,
"-DLLVM_TOOL_LIBCXX_BUILD=%s" % ("ON" if build_libcxx else "OFF"),
"-DLIBCXX_LIBCPPABI_VERSION=\"\"",
src_dir];
if is_windows():
cmake_args.insert(-1, "-DLLVM_EXPORT_SYMBOLS_FOR_PLUGINS=ON")
build_package(build_dir, run_cmake, cmake_args)
if is_linux():

View File

@ -2237,7 +2237,3 @@ public:
static FrontendPluginRegistry::Add<MozCheckAction> X("moz-check",
"check moz action");
// Export the registry on Windows.
#ifdef LLVM_EXPORT_REGISTRY
LLVM_EXPORT_REGISTRY(FrontendPluginRegistry)
#endif

View File

@ -4,8 +4,8 @@
# Build without any warning flags, and with clang verify flag for a
# syntax-only build (no codegen), without a limit on the number of errors.
OS_CFLAGS := $(filter-out -W%,$(OS_CFLAGS)) -fsyntax-only -Xclang -verify -ferror-limit=0 -std=c11
OS_CXXFLAGS := $(filter-out -W%,$(OS_CXXFLAGS)) -fsyntax-only -Xclang -verify -ferror-limit=0
OS_CFLAGS := $(filter-out -W%,$(OS_CFLAGS)) -fsyntax-only -Xclang -verify -ferror-limit=0 -std=c11 -Wno-invalid-noreturn
OS_CXXFLAGS := $(filter-out -W%,$(OS_CXXFLAGS)) -fsyntax-only -Xclang -verify -ferror-limit=0 -Wno-invalid-noreturn
include $(topsrcdir)/config/rules.mk

View File

@ -21,8 +21,7 @@ T *customAlloc() MOZ_HEAP_ALLOCATOR {
return new (arg) T();
}
template <typename T>
void misuseX(T q) {
void misuseX() {
X *foo = customAlloc<X>(); // expected-error {{variable of type 'X' is not valid on the heap}} expected-note {{value incorrectly allocated on the heap}}
X *foo2 = new (100) X(); // expected-error {{variable of type 'X' is not valid on the heap}} expected-note {{value incorrectly allocated on the heap}}
}

View File

@ -6,6 +6,14 @@
# script. Additional scripts may be added by specific subdirectories.
ifdef ENABLE_CLANG_PLUGIN
# Replace "clang-cl.exe" to "clang.exe --driver-mode=cl" to avoid loading the
# module clang.exe again when load the plugin dll, which links to the import
# library of clang.exe.
ifeq ($(OS_ARCH),WINNT)
CC := $(subst clang-cl.exe,clang.exe --driver-mode=cl,$(CC:.EXE=.exe))
CXX := $(subst clang-cl.exe,clang.exe --driver-mode=cl,$(CXX:.EXE=.exe))
endif
CLANG_PLUGIN := $(topobjdir)/build/clang-plugin/$(DLL_PREFIX)clang-plugin$(DLL_SUFFIX)
OS_CXXFLAGS += -Xclang -load -Xclang $(CLANG_PLUGIN) -Xclang -add-plugin -Xclang moz-check
OS_CFLAGS += -Xclang -load -Xclang $(CLANG_PLUGIN) -Xclang -add-plugin -Xclang moz-check

View File

@ -2,10 +2,6 @@
# 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/.
DIRS += [
'shared',
]
DevToolsModules(
'clear-button.js',
'filter-buttons.js',

View File

@ -1,7 +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/.
DevToolsModules(
'timings-panel.js',
)

View File

@ -1,85 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const { 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 { div, span } = DOM;
const types = ["blocked", "dns", "connect", "send", "wait", "receive"];
const TIMINGS_END_PADDING = "80px";
/*
* Timings panel component
* Display timeline bars that shows the total wait time for various stages
*/
function TimingsPanel({
timings = {},
totalTime = 0,
}) {
const timelines = types.map((type, idx) => {
// Determine the relative offset for each timings box. For example, the
// offset of third timings box will be 0 + blocked offset + dns offset
const offset = types
.slice(0, idx)
.reduce((acc, cur) => (acc + timings[cur] || 0), 0);
const offsetScale = offset / totalTime || 0;
const timelineScale = timings[type] / totalTime || 0;
return div({
key: type,
id: `timings-summary-${type}`,
className: "tabpanel-summary-container",
},
span({ className: "tabpanel-summary-label" },
L10N.getStr(`netmonitor.timings.${type}`)
),
div({ className: "requests-menu-timings-container" },
span({
className: "requests-menu-timings-offset",
style: {
width: `calc(${offsetScale} * (100% - ${TIMINGS_END_PADDING})`,
},
}),
span({
className: `requests-menu-timings-box ${type}`,
style: {
width: `calc(${timelineScale} * (100% - ${TIMINGS_END_PADDING}))`,
},
}),
span({ className: "requests-menu-timings-total" },
L10N.getFormatStr("networkMenu.totalMS", timings[type])
)
),
);
});
return div({}, timelines);
}
TimingsPanel.displayName = "TimingsPanel";
TimingsPanel.propTypes = {
timings: PropTypes.object,
totalTime: PropTypes.number,
};
module.exports = connect(
(state) => {
const selectedRequest = getSelectedRequest(state);
if (selectedRequest && selectedRequest.eventTimings) {
const { timings, totalTime } = selectedRequest.eventTimings;
return {
timings,
totalTime,
};
}
return {};
}
)(TimingsPanel);

View File

@ -27,10 +27,6 @@ const {
getUrlHost,
parseQueryString,
} = 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 TimingsPanel = createFactory(require("./components/shared/timings-panel"));
// 100 KB in bytes
const SOURCE_SYNTAX_HIGHLIGHT_MAX_FILE_SIZE = 102400;
@ -90,16 +86,9 @@ DetailsView.prototype = {
/**
* Initialization function, called when the network monitor is started.
*/
initialize: function (store) {
initialize: function () {
dumpn("Initializing the DetailsView");
this._timingsPanelNode = $("#react-timings-tabpanel-hook");
ReactDOM.render(Provider(
{ store },
TimingsPanel()
), this._timingsPanelNode);
this.widget = $("#event-details-pane");
this.sidebar = new ToolSidebar(this.widget, this, "netmonitor", {
disableTelemetry: true,
@ -145,7 +134,6 @@ DetailsView.prototype = {
*/
destroy: function () {
dumpn("Destroying the DetailsView");
ReactDOM.unmountComponentAtNode(this._timingsPanelNode);
this.sidebar.destroy();
$("tabpanels", this.widget).removeEventListener("select",
this._onTabSelect);
@ -255,6 +243,10 @@ DetailsView.prototype = {
case 3:
yield view._setResponseBody(src.url, src.responseContent);
break;
// "Timings"
case 4:
yield view._setTimingsInformation(src.eventTimings);
break;
// "Security"
case 5:
yield view._setSecurityInfo(src.securityInfo, src.url);
@ -693,6 +685,87 @@ DetailsView.prototype = {
window.emit(EVENTS.RESPONSE_BODY_DISPLAYED);
}),
/**
* Sets the timings information shown in this view.
*
* @param object response
* The message received from the server.
*/
_setTimingsInformation: function (response) {
if (!response) {
return;
}
let { blocked, dns, connect, send, wait, receive } = response.timings;
let tabboxWidth = $("#details-pane").getAttribute("width");
// Other nodes also take some space.
let availableWidth = tabboxWidth / 2;
let scale = (response.totalTime > 0 ?
Math.max(availableWidth / response.totalTime, 0) :
0);
$("#timings-summary-blocked .requests-menu-timings-box")
.setAttribute("width", blocked * scale);
$("#timings-summary-blocked .requests-menu-timings-total")
.setAttribute("value", L10N.getFormatStr("networkMenu.totalMS", blocked));
$("#timings-summary-dns .requests-menu-timings-box")
.setAttribute("width", dns * scale);
$("#timings-summary-dns .requests-menu-timings-total")
.setAttribute("value", L10N.getFormatStr("networkMenu.totalMS", dns));
$("#timings-summary-connect .requests-menu-timings-box")
.setAttribute("width", connect * scale);
$("#timings-summary-connect .requests-menu-timings-total")
.setAttribute("value", L10N.getFormatStr("networkMenu.totalMS", connect));
$("#timings-summary-send .requests-menu-timings-box")
.setAttribute("width", send * scale);
$("#timings-summary-send .requests-menu-timings-total")
.setAttribute("value", L10N.getFormatStr("networkMenu.totalMS", send));
$("#timings-summary-wait .requests-menu-timings-box")
.setAttribute("width", wait * scale);
$("#timings-summary-wait .requests-menu-timings-total")
.setAttribute("value", L10N.getFormatStr("networkMenu.totalMS", wait));
$("#timings-summary-receive .requests-menu-timings-box")
.setAttribute("width", receive * scale);
$("#timings-summary-receive .requests-menu-timings-total")
.setAttribute("value", L10N.getFormatStr("networkMenu.totalMS", receive));
$("#timings-summary-dns .requests-menu-timings-box")
.style.transform = "translateX(" + (scale * blocked) + "px)";
$("#timings-summary-connect .requests-menu-timings-box")
.style.transform = "translateX(" + (scale * (blocked + dns)) + "px)";
$("#timings-summary-send .requests-menu-timings-box")
.style.transform =
"translateX(" + (scale * (blocked + dns + connect)) + "px)";
$("#timings-summary-wait .requests-menu-timings-box")
.style.transform =
"translateX(" + (scale * (blocked + dns + connect + send)) + "px)";
$("#timings-summary-receive .requests-menu-timings-box")
.style.transform =
"translateX(" + (scale * (blocked + dns + connect + send + wait)) +
"px)";
$("#timings-summary-dns .requests-menu-timings-total")
.style.transform = "translateX(" + (scale * blocked) + "px)";
$("#timings-summary-connect .requests-menu-timings-total")
.style.transform = "translateX(" + (scale * (blocked + dns)) + "px)";
$("#timings-summary-send .requests-menu-timings-total")
.style.transform =
"translateX(" + (scale * (blocked + dns + connect)) + "px)";
$("#timings-summary-wait .requests-menu-timings-total")
.style.transform =
"translateX(" + (scale * (blocked + dns + connect + send)) + "px)";
$("#timings-summary-receive .requests-menu-timings-total")
.style.transform =
"translateX(" + (scale * (blocked + dns + connect + send + wait)) +
"px)";
},
/**
* Sets the preview for HTML responses shown in this view.
*

View File

@ -50,7 +50,7 @@ var NetMonitorView = {
this.Toolbar.initialize(gStore);
this.RequestsMenu.initialize(gStore);
this.NetworkDetails.initialize(gStore);
this.NetworkDetails.initialize();
this.CustomRequest.initialize();
this.PerformanceStatistics.initialize(gStore);
},

View File

@ -262,8 +262,56 @@
</tabpanel>
<tabpanel id="timings-tabpanel"
class="tabpanel-content">
<html:div xmlns="http://www.w3.org/1999/xhtml"
id="react-timings-tabpanel-hook"/>
<vbox flex="1">
<hbox id="timings-summary-blocked"
class="tabpanel-summary-container"
align="center">
<label class="plain tabpanel-summary-label"
data-localization="content=netmonitor.timings.blocked"/>
<hbox class="requests-menu-timings-box blocked"/>
<label class="plain requests-menu-timings-total"/>
</hbox>
<hbox id="timings-summary-dns"
class="tabpanel-summary-container"
align="center">
<label class="plain tabpanel-summary-label"
data-localization="content=netmonitor.timings.dns"/>
<hbox class="requests-menu-timings-box dns"/>
<label class="plain requests-menu-timings-total"/>
</hbox>
<hbox id="timings-summary-connect"
class="tabpanel-summary-container"
align="center">
<label class="plain tabpanel-summary-label"
data-localization="content=netmonitor.timings.connect"/>
<hbox class="requests-menu-timings-box connect"/>
<label class="plain requests-menu-timings-total"/>
</hbox>
<hbox id="timings-summary-send"
class="tabpanel-summary-container"
align="center">
<label class="plain tabpanel-summary-label"
data-localization="content=netmonitor.timings.send"/>
<hbox class="requests-menu-timings-box send"/>
<label class="plain requests-menu-timings-total"/>
</hbox>
<hbox id="timings-summary-wait"
class="tabpanel-summary-container"
align="center">
<label class="plain tabpanel-summary-label"
data-localization="content=netmonitor.timings.wait"/>
<hbox class="requests-menu-timings-box wait"/>
<label class="plain requests-menu-timings-total"/>
</hbox>
<hbox id="timings-summary-receive"
class="tabpanel-summary-container"
align="center">
<label class="plain tabpanel-summary-label"
data-localization="content=netmonitor.timings.receive"/>
<hbox class="requests-menu-timings-box receive"/>
<label class="plain requests-menu-timings-total"/>
</hbox>
</vbox>
</tabpanel>
<tabpanel id="security-tabpanel"
class="tabpanel-content">

View File

@ -547,7 +547,6 @@
}
.requests-menu-timings-total {
display: inline-block;
padding-inline-start: 4px;
font-size: 85%;
font-weight: 600;
@ -557,7 +556,6 @@
}
.requests-menu-timings-box {
display: inline-block;
height: 9px;
}
@ -682,7 +680,6 @@
}
.tabpanel-summary-label {
display: inline-block;
padding-inline-start: 4px;
padding-inline-end: 3px;
font-weight: 600;
@ -755,28 +752,18 @@
/* Timings tabpanel */
#timings-tabpanel .tabpanel-summary-container {
display: flex;
}
#timings-tabpanel .tabpanel-summary-label {
width: 10em;
}
#timings-tabpanel .requests-menu-timings-container {
display: flex;
flex: 1;
align-items: center;
}
#timings-tabpanel .requests-menu-timings-offset {
transition: width 0.2s ease-out;
}
#timings-tabpanel .requests-menu-timings-box {
transition: transform 0.2s ease-out;
border: none;
min-width: 1px;
transition: width 0.2s ease-out;
}
#timings-tabpanel .requests-menu-timings-total {
transition: transform 0.2s ease-out;
}
.theme-firebug #timings-tabpanel .requests-menu-timings-total {
@ -1081,13 +1068,3 @@
font-size: 85%;
}
}
/*
* FIXME: normal html block element cannot fill outer XUL element
* This workaround should be removed after sidebar is migrated to react
*/
#react-timings-tabpanel-hook {
display: -moz-box;
-moz-box-orient: vertical;
-moz-box-flex: 1;
}

View File

@ -124,7 +124,6 @@ skip-if = toolkit == 'android' #CRASH_DUMP, RANDOM
[test_bug946632.html]
skip-if = (e10s && os == "mac") # bug 1252273
[test_bug967796.html]
skip-if = e10s # bug 1251659
[test_bug985988.html]
[test_bug998809.html]
[test_bug1003432.html]

View File

@ -19,11 +19,15 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=967796
<script type="application/javascript">
/** Test for Bug 967796 **/
SpecialPowers.setBoolPref("dom.w3c_pointer_events.enabled", true); // Enable Pointer Events
SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(runTests);
SimpleTest.waitForFocus(() => {
// Enable Pointer Events
SpecialPowers.pushPrefEnv({
"set": [
["dom.w3c_pointer_events.enabled", true]
]
}, runTests);
});
var outer;
var middle;
var inner;
@ -54,7 +58,14 @@ function runTests() {
outside = document.getElementById("outside");
container = document.getElementById("container");
file = document.getElementById("file");
iframe = document.getElementById("iframe");
iframe = document.createElement('iframe');
iframe.width=50;
iframe.height=50;
container.appendChild(iframe);
iframe.addEventListener("pointerenter", penter, false);
iframe.addEventListener("pointerleave", pleave, false);
iframe.addEventListener("pointerout", pout, false);
iframe.addEventListener("pointerover", pover, false);
// Make sure ESM thinks pointer is outside the test elements.
sendPointerEvent("pointermove", outside);
@ -126,12 +137,16 @@ function runTests() {
// Move pointer inside the iframe.
synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height / 4, {type: "pointermove"},
iframe.contentWindow);
is(pointerentercount, 6, "Unexpected pointerenter event count!");
is(pointerleavecount, 4, "Unexpected pointerleave event count!");
synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height - (r.height / 4), {type: "pointermove"},
iframe.contentWindow);
is(pointerentercount, 7, "Unexpected pointerenter event count!");
is(pointerleavecount, 5, "Unexpected pointerleave event count!");
expectedRelatedEnter = iframe;
expectedRelatedLeave = outside;
sendPointerEvent("pointermove", outside);
is(pointerentercount, 7, "Unexpected pointerenter event count!");
is(pointerleavecount, 7, "Unexpected pointerleave event count!");
// pointerdown must produce pointerenter event
@ -161,8 +176,6 @@ function runTests() {
elt.onpointerenter = null;
elt.onpointerleave = null;
});
SpecialPowers.clearUserPref("dom.w3c_pointer_events.enabled"); // Disable Pointer Events
SimpleTest.finish();
}
@ -227,9 +240,6 @@ function pout(evt) {
onpointerenter="penter(event)" onpointerleave="pleave(event)"
onpointerout="pout(event)" onpointerover="pover(event)">
<br>
<iframe id="iframe" width="50px" height="50px"
onpointerenter="penter(event)" onpointerleave="pleave(event)"
onpointerout="pout(event)" onpointerover="pover(event)"></iframe>
</div>
</body>
</html>

View File

@ -664,14 +664,14 @@ FileReader::OnLoadEnd(nsresult aStatus)
}
void
FileReader::Abort(ErrorResult& aRv)
FileReader::Abort()
{
if (mReadyState != LOADING) {
// XXX The spec doesn't say this
aRv.Throw(NS_ERROR_DOM_FILE_ABORT_ERR);
if (mReadyState == EMPTY || mReadyState == DONE) {
return;
}
MOZ_ASSERT(mReadyState == LOADING);
ClearProgressEventTimer();
mReadyState = DONE;

View File

@ -79,7 +79,7 @@ public:
ReadFileContent(aBlob, EmptyString(), FILE_AS_DATAURL, aRv);
}
void Abort(ErrorResult& aRv);
void Abort();
uint16_t ReadyState() const
{

View File

@ -339,7 +339,7 @@ function onFilesOpened(message) {
} catch(e) {
abortThrew = true;
}
is(abortThrew, true, "abort() must throw if not loading");
is(abortThrew, false, "abort() doesn't throw");
is(abortHasRun, false, "abort() is a no-op unless loading");
r.readAsText(asciiFile);
r.abort();
@ -364,7 +364,7 @@ function onFilesOpened(message) {
} catch(e) {
abortThrew = true;
}
is(abortThrew, true, "abort() must throw if not loading");
is(abortThrew, false, "abort() should not throw");
is(reuseAbortHasRun, false, "abort() is a no-op unless loading");
r.readAsText(asciiFile);

View File

@ -310,6 +310,13 @@ FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample,
case AVCOL_SPC_BT470BG:
b.mYUVColorSpace = YUVColorSpace::BT601;
break;
case AVCOL_SPC_UNSPECIFIED:
#if LIBAVCODEC_VERSION_MAJOR >= 55
if (mCodecContext->codec_id == AV_CODEC_ID_VP9) {
b.mYUVColorSpace = YUVColorSpace::BT709;
}
#endif
break;
default:
break;
}

View File

@ -21,7 +21,6 @@ interface FileReader : EventTarget {
[Throws]
void readAsDataURL(Blob blob);
[Throws]
void abort();
// states

View File

@ -300,7 +300,7 @@ onmessage = function(message) {
} catch(e) {
abortThrew = true;
}
is(abortThrew, true, "abort() must throw if not loading");
is(abortThrew, false, "abort() never throws");
is(abortHasRun, false, "abort() is a no-op unless loading");
r.readAsText(asciiFile);
r.abort();
@ -318,7 +318,7 @@ onmessage = function(message) {
} catch(e) {
abortThrew = true;
}
is(abortThrew, true, "abort() must throw if not loading");
is(abortThrew, false, "abort() never throws");
is(reuseAbortHasRun, false, "abort() is a no-op unless loading");
r.readAsText(asciiFile);

View File

@ -36,9 +36,6 @@ nsButtonFrameRenderer::~nsButtonFrameRenderer()
if (mInnerFocusStyle) {
mInnerFocusStyle->FrameRelease();
}
if (mOuterFocusStyle) {
mOuterFocusStyle->FrameRelease();
}
#endif
}
@ -244,10 +241,9 @@ void nsDisplayButtonForeground::Paint(nsDisplayListBuilder* aBuilder,
!presContext->GetTheme()->ThemeDrawsFocusForWidget(disp->mAppearance)) {
nsRect r = nsRect(ToReferenceFrame(), mFrame->GetSize());
// Draw the focus and outline borders.
// Draw the -moz-focus-inner border
DrawResult result =
mBFR->PaintOutlineAndFocusBorders(aBuilder, presContext, *aCtx,
mVisibleRect, r);
mBFR->PaintInnerFocusBorder(aBuilder, presContext, *aCtx, mVisibleRect, r);
nsDisplayItemGenericImageGeometry::UpdateDrawResult(this, result);
}
@ -274,28 +270,36 @@ nsButtonFrameRenderer::DisplayButton(nsDisplayListBuilder* aBuilder,
// Only display focus rings if we actually have them. Since at most one
// button would normally display a focus ring, most buttons won't have them.
if ((mOuterFocusStyle && mOuterFocusStyle->StyleBorder()->HasBorder()) ||
(mInnerFocusStyle && mInnerFocusStyle->StyleBorder()->HasBorder())) {
if (mInnerFocusStyle && mInnerFocusStyle->StyleBorder()->HasBorder()) {
aForeground->AppendNewToTop(new (aBuilder)
nsDisplayButtonForeground(aBuilder, this));
}
return NS_OK;
}
void
nsButtonFrameRenderer::GetButtonInnerFocusRect(const nsRect& aRect, nsRect& aResult)
{
GetButtonRect(aRect, aResult);
aResult.Deflate(mFrame->GetUsedBorderAndPadding());
nsMargin innerFocusPadding(0,0,0,0);
if (mInnerFocusStyle) {
mInnerFocusStyle->StylePadding()->GetPadding(innerFocusPadding);
}
aResult.Inflate(innerFocusPadding);
}
DrawResult
nsButtonFrameRenderer::PaintOutlineAndFocusBorders(
nsButtonFrameRenderer::PaintInnerFocusBorder(
nsDisplayListBuilder* aBuilder,
nsPresContext* aPresContext,
nsRenderingContext& aRenderingContext,
const nsRect& aDirtyRect,
const nsRect& aRect)
{
// once we have all that we'll draw the focus if we have it. We will
// need to draw 2 focuses, the inner and the outer. This is so we
// can do any kind of look and feel. Some buttons have focus on the
// outside like mac and motif. While others like windows have it
// inside (dotted line). Usually only one will be specifed. But I
// guess you could have both if you wanted to.
// we draw the -moz-focus-inner border just inside the button's
// normal border and padding, to match Windows themes.
nsRect rect;
@ -305,19 +309,7 @@ nsButtonFrameRenderer::PaintOutlineAndFocusBorders(
DrawResult result = DrawResult::SUCCESS;
if (mOuterFocusStyle) {
// ---------- paint the outer focus border -------------
GetButtonOuterFocusRect(aRect, rect);
result &=
nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, mFrame,
aDirtyRect, rect, mOuterFocusStyle, flags);
}
if (mInnerFocusStyle) {
// ---------- paint the inner focus border -------------
GetButtonInnerFocusRect(aRect, rect);
result &=
@ -357,84 +349,13 @@ nsButtonFrameRenderer::PaintBorder(
}
void
nsButtonFrameRenderer::GetButtonOuterFocusRect(const nsRect& aRect, nsRect& focusRect)
{
focusRect = aRect;
}
void
nsButtonFrameRenderer::GetButtonRect(const nsRect& aRect, nsRect& r)
{
r = aRect;
r.Deflate(GetButtonOuterFocusBorderAndPadding());
}
void
nsButtonFrameRenderer::GetButtonInnerFocusRect(const nsRect& aRect, nsRect& focusRect)
{
GetButtonRect(aRect, focusRect);
focusRect.Deflate(GetButtonBorderAndPadding());
focusRect.Deflate(GetButtonInnerFocusMargin());
}
nsMargin
nsButtonFrameRenderer::GetButtonOuterFocusBorderAndPadding()
{
nsMargin result(0,0,0,0);
if (mOuterFocusStyle) {
mOuterFocusStyle->StylePadding()->GetPadding(result);
result += mOuterFocusStyle->StyleBorder()->GetComputedBorder();
}
return result;
}
nsMargin
nsButtonFrameRenderer::GetButtonBorderAndPadding()
{
return mFrame->GetUsedBorderAndPadding();
}
/**
* Gets the size of the buttons border this is the union of the normal and disabled borders.
*/
nsMargin
nsButtonFrameRenderer::GetButtonInnerFocusMargin()
{
nsMargin innerFocusMargin(0,0,0,0);
if (mInnerFocusStyle) {
const nsStyleMargin* margin = mInnerFocusStyle->StyleMargin();
margin->GetMargin(innerFocusMargin);
}
return innerFocusMargin;
}
nsMargin
nsButtonFrameRenderer::GetButtonInnerFocusBorderAndPadding()
{
nsMargin result(0,0,0,0);
if (mInnerFocusStyle) {
mInnerFocusStyle->StylePadding()->GetPadding(result);
result += mInnerFocusStyle->StyleBorder()->GetComputedBorder();
}
return result;
}
// gets all the focus borders and padding that will be added to the regular border
nsMargin
nsButtonFrameRenderer::GetAddedButtonBorderAndPadding()
{
return GetButtonOuterFocusBorderAndPadding() + GetButtonInnerFocusMargin() + GetButtonInnerFocusBorderAndPadding();
}
/**
* Call this when styles change
*/
@ -449,30 +370,18 @@ nsButtonFrameRenderer::ReResolveStyles(nsPresContext* aPresContext)
if (mInnerFocusStyle) {
mInnerFocusStyle->FrameRelease();
}
if (mOuterFocusStyle) {
mOuterFocusStyle->FrameRelease();
}
#endif
// style for the inner such as a dotted line (Windows)
// get styles assigned to -moz-inner-focus (ie dotted border on Windows)
mInnerFocusStyle =
styleSet->ProbePseudoElementStyle(mFrame->GetContent()->AsElement(),
CSSPseudoElementType::mozFocusInner,
context);
// style for outer focus like a ridged border (MAC).
mOuterFocusStyle =
styleSet->ProbePseudoElementStyle(mFrame->GetContent()->AsElement(),
CSSPseudoElementType::mozFocusOuter,
context);
#ifdef DEBUG
if (mInnerFocusStyle) {
mInnerFocusStyle->FrameAddRef();
}
if (mOuterFocusStyle) {
mOuterFocusStyle->FrameAddRef();
}
#endif
}
@ -482,8 +391,6 @@ nsButtonFrameRenderer::GetStyleContext(int32_t aIndex) const
switch (aIndex) {
case NS_BUTTON_RENDERER_FOCUS_INNER_CONTEXT_INDEX:
return mInnerFocusStyle;
case NS_BUTTON_RENDERER_FOCUS_OUTER_CONTEXT_INDEX:
return mOuterFocusStyle;
default:
return nullptr;
}
@ -501,14 +408,6 @@ nsButtonFrameRenderer::SetStyleContext(int32_t aIndex, nsStyleContext* aStyleCon
#endif
mInnerFocusStyle = aStyleContext;
break;
case NS_BUTTON_RENDERER_FOCUS_OUTER_CONTEXT_INDEX:
#ifdef DEBUG
if (mOuterFocusStyle) {
mOuterFocusStyle->FrameRelease();
}
#endif
mOuterFocusStyle = aStyleContext;
break;
}
#ifdef DEBUG
aStyleContext->FrameAddRef();

View File

@ -20,8 +20,7 @@ class nsStyleContext;
#define NS_BUTTON_RENDERER_FOCUS_INNER_CONTEXT_INDEX 0
#define NS_BUTTON_RENDERER_FOCUS_OUTER_CONTEXT_INDEX 1
#define NS_BUTTON_RENDERER_LAST_CONTEXT_INDEX NS_BUTTON_RENDERER_FOCUS_OUTER_CONTEXT_INDEX
#define NS_BUTTON_RENDERER_LAST_CONTEXT_INDEX NS_BUTTON_RENDERER_FOCUS_INNER_CONTEXT_INDEX
class nsButtonFrameRenderer {
typedef mozilla::image::DrawResult DrawResult;
@ -38,11 +37,11 @@ public:
nsDisplayList* aBackground, nsDisplayList* aForeground);
DrawResult PaintOutlineAndFocusBorders(nsDisplayListBuilder* aBuilder,
nsPresContext* aPresContext,
nsRenderingContext& aRenderingContext,
const nsRect& aDirtyRect,
const nsRect& aRect);
DrawResult PaintInnerFocusBorder(nsDisplayListBuilder* aBuilder,
nsPresContext* aPresContext,
nsRenderingContext& aRenderingContext,
const nsRect& aDirtyRect,
const nsRect& aRect);
DrawResult PaintBorder(nsDisplayListBuilder* aBuilder,
nsPresContext* aPresContext,
@ -57,14 +56,8 @@ public:
bool isActive();
bool isDisabled();
void GetButtonOuterFocusRect(const nsRect& aRect, nsRect& aResult);
void GetButtonRect(const nsRect& aRect, nsRect& aResult);
void GetButtonInnerFocusRect(const nsRect& aRect, nsRect& aResult);
nsMargin GetButtonOuterFocusBorderAndPadding();
nsMargin GetButtonBorderAndPadding();
nsMargin GetButtonInnerFocusMargin();
nsMargin GetButtonInnerFocusBorderAndPadding();
nsMargin GetAddedButtonBorderAndPadding();
nsStyleContext* GetStyleContext(int32_t aIndex) const;
void SetStyleContext(int32_t aIndex, nsStyleContext* aStyleContext);
@ -76,9 +69,8 @@ protected:
private:
// cached styles for focus and outline.
// cached style for optional inner focus outline (used on Windows).
RefPtr<nsStyleContext> mInnerFocusStyle;
RefPtr<nsStyleContext> mOuterFocusStyle;
nsFrame* mFrame;
};

View File

@ -157,10 +157,6 @@ nsHTMLButtonControlFrame::GetMinISize(nsRenderingContext* aRenderingContext)
kid,
nsLayoutUtils::MIN_ISIZE);
result += GetWritingMode().IsVertical()
? mRenderer.GetAddedButtonBorderAndPadding().TopBottom()
: mRenderer.GetAddedButtonBorderAndPadding().LeftRight();
return result;
}
@ -175,10 +171,6 @@ nsHTMLButtonControlFrame::GetPrefISize(nsRenderingContext* aRenderingContext)
kid,
nsLayoutUtils::PREF_ISIZE);
result += GetWritingMode().IsVertical()
? mRenderer.GetAddedButtonBorderAndPadding().TopBottom()
: mRenderer.GetAddedButtonBorderAndPadding().LeftRight();
return result;
}
@ -192,9 +184,6 @@ nsHTMLButtonControlFrame::Reflow(nsPresContext* aPresContext,
DO_GLOBAL_REFLOW_COUNT("nsHTMLButtonControlFrame");
DISPLAY_REFLOW(aPresContext, this, aReflowInput, aDesiredSize, aStatus);
NS_PRECONDITION(aReflowInput.ComputedISize() != NS_INTRINSICSIZE,
"Should have real computed inline-size by now");
if (mState & NS_FRAME_FIRST_REFLOW) {
nsFormControlFrame::RegUnRegAccessKey(static_cast<nsIFrame*>(this), true);
}
@ -237,35 +226,6 @@ nsHTMLButtonControlFrame::Reflow(nsPresContext* aPresContext,
NS_FRAME_SET_TRUNCATION(aStatus, aReflowInput, aDesiredSize);
}
// Helper-function that lets us clone the button's reflow state, but with its
// ComputedWidth and ComputedHeight reduced by the amount of renderer-specific
// focus border and padding that we're using. (This lets us provide a more
// appropriate content-box size for descendents' percent sizes to resolve
// against.)
static ReflowInput
CloneReflowInputWithReducedContentBox(
const ReflowInput& aButtonReflowInput,
const LogicalMargin& aFocusPadding)
{
auto wm = aButtonReflowInput.GetWritingMode();
nscoord adjustedISize = aButtonReflowInput.ComputedISize();
adjustedISize -= aFocusPadding.IStartEnd(wm);
adjustedISize = std::max(0, adjustedISize);
// (Only adjust the block-size if it's an actual length.)
nscoord adjustedBSize = aButtonReflowInput.ComputedBSize();
if (adjustedBSize != NS_INTRINSICSIZE) {
adjustedBSize -= aFocusPadding.BStartEnd(wm);
adjustedBSize = std::max(0, adjustedBSize);
}
ReflowInput clone(aButtonReflowInput);
clone.SetComputedISize(adjustedISize);
clone.SetComputedBSize(adjustedBSize);
return clone;
}
void
nsHTMLButtonControlFrame::ReflowButtonContents(nsPresContext* aPresContext,
ReflowOutput& aButtonDesiredSize,
@ -276,52 +236,15 @@ nsHTMLButtonControlFrame::ReflowButtonContents(nsPresContext* aPresContext,
LogicalSize availSize = aButtonReflowInput.ComputedSize(wm);
availSize.BSize(wm) = NS_INTRINSICSIZE;
// Buttons have some bonus renderer-determined border/padding,
// which occupies part of the button's content-box area:
LogicalMargin focusPadding =
LogicalMargin(wm, mRenderer.GetAddedButtonBorderAndPadding());
// See whether out availSize's inline-size is big enough. If it's
// smaller than our intrinsic min iSize, that means that the kid
// wouldn't really fit. In that case, we overflow into our internal
// focuspadding (which other browsers don't have) so that there's a
// little more space for it.
// Note that GetMinISize includes the focusPadding.
nscoord IOverflow = GetMinISize(aButtonReflowInput.mRenderingContext) -
aButtonReflowInput.ComputedISize();
nscoord IFocusPadding = focusPadding.IStartEnd(wm);
nscoord focusPaddingReduction = std::min(IFocusPadding,
std::max(IOverflow, 0));
if (focusPaddingReduction > 0) {
nscoord startReduction = focusPadding.IStart(wm);
if (focusPaddingReduction != IFocusPadding) {
startReduction = NSToCoordRound(startReduction *
(float(focusPaddingReduction) /
float(IFocusPadding)));
}
focusPadding.IStart(wm) -= startReduction;
focusPadding.IEnd(wm) -= focusPaddingReduction - startReduction;
}
// shorthand for a value we need to use in a bunch of places
const LogicalMargin& clbp = aButtonReflowInput.ComputedLogicalBorderPadding();
// Indent the child inside us by the focus border. We must do this separate
// from the regular border.
availSize.ISize(wm) -= focusPadding.IStartEnd(wm);
LogicalPoint childPos(wm);
childPos.I(wm) = focusPadding.IStart(wm) + clbp.IStart(wm);
childPos.I(wm) = clbp.IStart(wm);
availSize.ISize(wm) = std::max(availSize.ISize(wm), 0);
// Give child a clone of the button's reflow state, with height/width reduced
// by focusPadding, so that descendants with height:100% don't protrude.
ReflowInput adjustedButtonReflowInput =
CloneReflowInputWithReducedContentBox(aButtonReflowInput, focusPadding);
ReflowInput contentsReflowInput(aPresContext,
adjustedButtonReflowInput,
aFirstKid, availSize);
ReflowInput contentsReflowInput(aPresContext, aButtonReflowInput,
aFirstKid, availSize);
nsReflowStatus contentsReflowStatus;
ReflowOutput contentsDesiredSize(aButtonReflowInput);
@ -345,9 +268,8 @@ nsHTMLButtonControlFrame::ReflowButtonContents(nsPresContext* aPresContext,
buttonContentBox.BSize(wm) = aButtonReflowInput.ComputedBSize();
} else {
// Button is intrinsically sized -- it should shrinkwrap the
// button-contents' bSize, plus any focus-padding space:
buttonContentBox.BSize(wm) =
contentsDesiredSize.BSize(wm) + focusPadding.BStartEnd(wm);
// button-contents' bSize:
buttonContentBox.BSize(wm) = contentsDesiredSize.BSize(wm);
// Make sure we obey min/max-bSize in the case when we're doing intrinsic
// sizing (we get it for free when we have a non-intrinsic
@ -362,8 +284,7 @@ nsHTMLButtonControlFrame::ReflowButtonContents(nsPresContext* aPresContext,
if (aButtonReflowInput.ComputedISize() != NS_INTRINSICSIZE) {
buttonContentBox.ISize(wm) = aButtonReflowInput.ComputedISize();
} else {
buttonContentBox.ISize(wm) =
contentsDesiredSize.ISize(wm) + focusPadding.IStartEnd(wm);
buttonContentBox.ISize(wm) = contentsDesiredSize.ISize(wm);
buttonContentBox.ISize(wm) =
NS_CSS_MINMAX(buttonContentBox.ISize(wm),
aButtonReflowInput.ComputedMinISize(),
@ -372,15 +293,13 @@ nsHTMLButtonControlFrame::ReflowButtonContents(nsPresContext* aPresContext,
// Center child in the block-direction in the button
// (technically, inside of the button's focus-padding area)
nscoord extraSpace =
buttonContentBox.BSize(wm) - focusPadding.BStartEnd(wm) -
contentsDesiredSize.BSize(wm);
nscoord extraSpace = buttonContentBox.BSize(wm) -
contentsDesiredSize.BSize(wm);
childPos.B(wm) = std::max(0, extraSpace / 2);
// Adjust childPos.B() to be in terms of the button's frame-rect, instead of
// its focus-padding rect:
childPos.B(wm) += focusPadding.BStart(wm) + clbp.BStart(wm);
// Adjust childPos.B() to be in terms of the button's frame-rect:
childPos.B(wm) += clbp.BStart(wm);
nsSize containerSize =
(buttonContentBox + clbp.Size(wm)).GetPhysicalSize(wm);

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<div style="padding: 0; margin: 0; border: none; background: transparent; -moz-appearance: none; width: 0; height: 0; font: inherit; padding: 1px 0">
<div style="padding: 0; margin: 0; border: none; background: transparent; -moz-appearance: none; width: 0; height: 0; font: inherit; padding: 0">
Some text <div style="background: green; width: 100px; height: 100px"></div>
</div>

View File

@ -1,4 +1,4 @@
<!DOCTYPE html>
<html>
<div style="padding: 0; margin: 0; border: none; background: transparent; -moz-appearance: none; width: 20px; font: inherit; padding: 1px 0; white-space: pre; overflow: hidden">Some text</div>
<div style="padding: 0; margin: 0; border: none; background: transparent; -moz-appearance: none; width: 20px; font: inherit; padding: 0; white-space: pre; overflow: hidden">Some text</div>
</div>

View File

@ -147,79 +147,79 @@ button {
var buttonSizes =
[
['32px', '4px'],
['8px', '4px'],
['8px', '4px'],
['8px', '4px'],
['8px', '4px'],
['2px', '4px'],
['0px', '0px'],
['0px', '4px'],
['0px', '4px'],
['0px', '4px'],
['0px', '4px'],
['32px', '20px'],
['10px', '20px'],
['8px', '20px'],
['8px', '20px'],
['8px', '20px'],
['8px', '20px'],
['8px', '20px'],
['8px', '20px'],
['0px', '20px'],
['0px', '20px'],
['0px', '20px'],
['0px', '20px'],
['0px', '20px'],
['0px', '20px'],
['32px', '4px'],
['10px', '4px'],
['8px', '4px'],
['8px', '4px'],
['8px', '4px'],
['8px', '4px'],
['8px', '4px'],
['2px', '4px'],
['4px', '32px'],
['2px', '32px'],
['4px', '4px'],
['2px', '4px'],
['4px', '32px'],
['2px', '32px'],
['0px', '0px'],
['0px', '0px'],
['0px', '4px'],
['0px', '4px'],
['0px', '4px'],
['0px', '4px'],
['4px', '32px'],
['2px', '32px'],
['0px', '0px'],
['2px', '0px'],
['0px', '32px'],
['0px', '32px'],
['0px', '32px'],
['0px', '32px'],
['20px', '32px'],
['20px', '10px'],
['20px', '4px'],
['20px', '4px'],
['20px', '0px'],
['20px', '0px'],
['20px', '32px'],
['20px', '10px'],
['20px', '32px'],
['20px', '10px'],
['4px', '32px'],
['4px', '10px'],
['8px', '4px'],
['8px', '4px'],
['8px', '32px'],
['8px', '10px'],
['8px', '32px'],
['8px', '10px'],
['20px', '4px'],
['20px', '4px'],
['0px', '0px'],
['0px', '0px'],
['0px', '32px'],
['0px', '10px'],
['0px', '32px'],
['0px', '10px'],
['20px', '4px'],
['20px', '4px'],
['20px', '0px'],
['20px', '0px'],
['20px', '4px'],
['20px', '2px'],
['20px', '4px'],
['20px', '2px'],
['20px', '4px'],
['20px', '4px'],
['20px', '4px'],
['20px', '4px'],
['20px', '0px'],
['20px', '0px'],
['20px', '0px'],
['20px', '0px'],
['20px', '32px'],
['20px', '10px'],
['20px', '32px'],
['20px', '10px'],
['32px', '20px'],
['10px', '20px'],
['8px', '20px'],
['8px', '20px'],
['0px', '20px'],
['0px', '20px'],
['32px', '20px'],
['10px', '20px'],
['32px', '20px'],
['10px', '20px'],
['4px', '20px'],
['2px', '20px'],
['4px', '20px'],
['4px', '20px'],
['0px', '20px'],
['0px', '20px'],
['4px', '20px'],
['2px', '20px'],
['4px', '20px'],

View File

@ -89,14 +89,14 @@ canvas {
</tr></table>
<table><tr>
<!-- 2px border, 2px padding, 4px ::-moz-focus-inner padding, 2px ::-moz-focus-inner border -->
<td><div style="width: 10px"><input type="button" style="width: 5px"></div></td>
<!-- 2px border, 2px padding -->
<td><div style="width: 4px"><input type="button" style="width: 2px"></div></td>
<td>empty input type="button", width: 50%</td>
</tr></table>
<table><tr>
<!-- 2px border, 2px padding, 4px ::-moz-focus-inner padding, 2px ::-moz-focus-inner border -->
<td><div style="width: 10px"><input type="button" style="width: 5px"></div></td>
<!-- 2px border, 2px padding -->
<td><div style="width: 4px"><input type="button" style="width: 2px"></div></td>
<td>empty input type="button", max-width: 50%</td>
</tr></table>

View File

@ -1,52 +0,0 @@
<!DOCTYPE html>
<!-- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ -->
<html>
<head>
<title>Reference case for bug 1272983</title>
<style>
/* Set explicit font size so that em units are predictable: */
body, button { font: 10px sans-serif; }
/* Set margin to 0 for all cases. In the first 6, that's how we expect
the testcase to render; and in the 7th and 8th, our reference margin
will be applied via a child div instead of via the pseudo-element. */
button.mfi1::-moz-focus-inner,
button.mfi2::-moz-focus-inner,
button.mfi3::-moz-focus-inner,
button.mfi4::-moz-focus-inner,
button.mfi5::-moz-focus-inner,
button.mfi6::-moz-focus-inner,
button.mfi7::-moz-focus-inner,
button.mfi8::-moz-focus-inner { margin: 0; }
/* Use an explicit div instead of pseudo-element, for reference case's
version of margin values that we actually expect to take effect: */
button.mfi7 > div { margin: 10px; }
button.mfi8 > div { margin: 20px; /* = 2em * 20px/em */ }
</style>
</head>
<body>
<button class="mfi1">mfi1</button>
<button class="mfi2">mfi2</button>
<button class="mfi3">mfi3</button>
<button class="mfi4">mfi4</button>
<br>
<button class="mfi5">mfi5</button>
<button class="mfi6">mfi6</button>
<button class="mfi7"><div>mfi7</div></button>
<button class="mfi8"><div>mfi8</div></button>
<br>
<button class="mfo1">mfo1</button>
<button class="mfo2">mfo2</button>
<button class="mfo3">mfo3</button>
<button class="mfo4">mfo4</button>
<br>
<button class="mfo5">mfo5</button>
<button class="mfo6">mfo6</button>
<button class="mfo7">mfo7</button>
<button class="mfo8">mfo8</button>
<br>
</body>
</html>

View File

@ -1,62 +0,0 @@
<!DOCTYPE html>
<!-- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ -->
<html>
<!-- The ::-moz-focus-inner & ::-moz-focus-outer button pseudo-elements only
support CSS "margin" values that contain absolute lengths. Any percent or
"auto" margin values will simply make the margin collapse to zero.
This test verifies that this is indeed what happens (not anything worse).
-->
<head>
<title>Testcase for bug 1272983</title>
<style>
/* Set explicit font size so that em units are predictable: */
body, button { font: 10px sans-serif; }
/* Testing percent and auto margin values on "-moz-focus-inner": */
button.mfi1::-moz-focus-inner { margin: 50%; }
button.mfi2::-moz-focus-inner { margin: 50% 10px; }
button.mfi3::-moz-focus-inner { margin: 10px 50%; }
button.mfi4::-moz-focus-inner { margin: auto; }
button.mfi5::-moz-focus-inner { margin: auto 10px; }
button.mfi6::-moz-focus-inner { margin: 10px auto; }
button.mfi7::-moz-focus-inner { margin: 10px; }
button.mfi8::-moz-focus-inner { margin: 2em; }
/* Testing percent and auto margin values on "-moz-focus-outer":
(just for completeness -- really, 'margin' has no effect on
the behavior of -moz-focus-outer) */
button.mfo1::-moz-focus-outer { margin: 50%; }
button.mfo2::-moz-focus-outer { margin: 50% 10px; }
button.mfo3::-moz-focus-outer { margin: 10px 50%; }
button.mfo4::-moz-focus-outer { margin: auto; }
button.mfo5::-moz-focus-outer { margin: auto 10px; }
button.mfo6::-moz-focus-outer { margin: 10px auto; }
button.mfo7::-moz-focus-outer { margin: 10px; }
button.mfo8::-moz-focus-outer { margin: 2em; }
</style>
</head>
<body>
<button class="mfi1">mfi1</button>
<button class="mfi2">mfi2</button>
<button class="mfi3">mfi3</button>
<button class="mfi4">mfi4</button>
<br>
<button class="mfi5">mfi5</button>
<button class="mfi6">mfi6</button>
<button class="mfi7">mfi7</button>
<button class="mfi8">mfi8</button>
<br>
<button class="mfo1">mfo1</button>
<button class="mfo2">mfo2</button>
<button class="mfo3">mfo3</button>
<button class="mfo4">mfo4</button>
<br>
<button class="mfo5">mfo5</button>
<button class="mfo6">mfo6</button>
<button class="mfo7">mfo7</button>
<button class="mfo8">mfo8</button>
<br>
</body>
</html>

View File

@ -1,68 +0,0 @@
<!DOCTYPE html>
<!-- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ -->
<html>
<head>
<title>Reference case for bug 1272983</title>
<style>
/* Set explicit font size so that em units are predictable: */
body, button { font: 10px sans-serif; }
/* Add outline to help visualize the padding outside of buttons: */
button { outline: 1px solid black; }
/* Set padding to 0 for all cases. In the first 3, that's how we expect
the testcase to render; and in the 4th and 5th, our reference padding
will be applied via a child div instead of via the pseudo-element. */
button.mfi1::-moz-focus-inner,
button.mfi2::-moz-focus-inner,
button.mfi3::-moz-focus-inner,
button.mfi4::-moz-focus-inner,
button.mfi5::-moz-focus-inner { padding: 0; }
/* Use an explicit div instead of pseudo-element, for reference case's
version of padding values that we actually expect to take effect: */
button.mfi4 > div { padding: 10px; }
button.mfi5 > div { padding: 2em; }
/* As above, set padding to 0 for all cases: */
button.mfo1::-moz-focus-outer,
button.mfo2::-moz-focus-outer,
button.mfo3::-moz-focus-outer,
button.mfo4::-moz-focus-outer,
button.mfo5::-moz-focus-outer { padding: 0; }
/* To make reference for -moz-focus-outer padding that we expect to
take effect, we'll put the padding on a wrapper-div (and bump the
button's outline to that div). */
div.mfo4-wrapper { padding: 10px; }
div.mfo5-wrapper { padding: 20px; /* = 2em * 10px/em */ }
button.mfo4,
button.mfo5 { outline: none; }
div.mfo4-wrapper,
div.mfo5-wrapper { display: inline-block; outline: 1px solid black; }
</style>
</head>
<body>
<button class="mfi1">mfi1</button>
<button class="mfi2">mfi2</button>
<button class="mfi3">mfi3</button>
<br>
<button class="mfi4"><div>mfi4</div></button>
<button class="mfi5"><div>mfi5</div></button>
<br>
<button class="mfo1">mfo1</button>
<button class="mfo2">mfo2</button>
<button class="mfo3">mfo3</button>
<br>
<div class="mfo4-wrapper">
<button class="mfo4">mfo4</button>
</div>
<div class="mfo5-wrapper">
<button class="mfo5">mfo5</button>
</div>
<br>
</body>
</html>

View File

@ -1,51 +0,0 @@
<!DOCTYPE html>
<!-- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ -->
<html>
<!-- The ::-moz-focus-inner & ::-moz-focus-outer button pseudo-elements only
support CSS "padding" values that contain absolute lengths. Any percent
padding values will simply make the padding collapse to zero.
This test verifies that this is indeed what happens (not anything worse).
-->
<head>
<title>Testcase for bug 1272983</title>
<style>
/* Set explicit font size so that em units are predictable: */
body, button { font: 10px sans-serif; }
/* Add outline to help visualize the padding outside of buttons: */
button { outline: 1px solid black; }
/* Testing percent and auto padding values on "-moz-focus-inner": */
button.mfi1::-moz-focus-inner { padding: 50%; }
button.mfi2::-moz-focus-inner { padding: 50% 10px; }
button.mfi3::-moz-focus-inner { padding: 10px 50%; }
button.mfi4::-moz-focus-inner { padding: 10px; }
button.mfi5::-moz-focus-inner { padding: 2em; }
/* Testing percent and auto padding values on "-moz-focus-outer": */
button.mfo1::-moz-focus-outer { padding: 50%; }
button.mfo2::-moz-focus-outer { padding: 50% 10px; }
button.mfo3::-moz-focus-outer { padding: 10px 50%; }
button.mfo4::-moz-focus-outer { padding: 10px; }
button.mfo5::-moz-focus-outer { padding: 2em; }
</style>
</head>
<body>
<button class="mfi1">mfi1</button>
<button class="mfi2">mfi2</button>
<button class="mfi3">mfi3</button>
<br>
<button class="mfi4">mfi4</button>
<button class="mfi5">mfi5</button>
<br>
<button class="mfo1">mfo1</button>
<button class="mfo2">mfo2</button>
<button class="mfo3">mfo3</button>
<br>
<button class="mfo4">mfo4</button>
<button class="mfo5">mfo5</button>
<br>
</body>
</html>

View File

@ -1,54 +0,0 @@
<!DOCTYPE html>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html>
<head>
<style>
div.button {
display: inline-block;
width: 78px;
border: 0;
/* Padding to match the -moz-focus-inner border/padding in testcase: */
padding: 7px 1px 3px;
font: 10px sans-serif;
text-align: center;
vertical-align: top;
color: black;
background: gray;
}
div.p80 {
background: pink;
}
div.p100 {
background: yellow;
}
</style>
</head>
<body>
<!--Button has explicit height for us to resolve against: -->
<div class="button" style="height: 100px">
<div class="p80" style="margin-top: 10px; height: 80px">abc</div>
</div>
<div class="button" style="height: 100px">
<div class="p100" style="height: 100px">abc</div>
</div>
<!--Button is using intrinsic height: -->
<div class="button">
<div class="p80">abc</div>
</div>
<div class="button">
<div class="p100">abc</div>
</div>
</body>
</html>

View File

@ -1,63 +0,0 @@
<!DOCTYPE html>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<!-- This test verifies that we honor percent heights on content inside of
a <button> element (resolving the percent against the <button>).
(In this testcase, the button has some focus-border/padding, which
occupies part of the button's content-box and which we'll have to
subtract out from the button's size before using it to resolve
percentages sizes.) -->
<html>
<head>
<style>
button {
width: 80px;
border: 0;
padding: 0;
font: 10px sans-serif;
vertical-align: top;
color: black;
background: gray;
-moz-appearance: none;
}
button::-moz-focus-inner {
padding: 6px 0 2px;
border: 1px dotted transparent;
}
div.p80 {
height: 80%;
background: pink;
}
div.p100 {
height: 100%;
background: yellow;
}
</style>
</head>
<body>
<!--Button has explicit height for us to resolve against: -->
<button style="height: 110px">
<div class="p80">abc</div>
</button>
<button style="height: 110px">
<div class="p100">abc</div>
</button>
<!--Button is using intrinsic height: -->
<button>
<div class="p80">abc</div>
</button>
<button>
<div class="p100">abc</div>
</button>
</body>
</html>

View File

@ -1,55 +0,0 @@
<!DOCTYPE html>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html>
<head>
<style>
div.button {
display: inline-block;
border: 0;
/* Padding to match the -moz-focus-inner border/padding in testcase: */
padding: 1px 7px 1px 3px;
font: 10px sans-serif;
text-align: center;
vertical-align: top;
color: black;
background: gray;
}
div.p80 {
width: 80%;
background: pink;
}
div.p100 {
width: 100%;
background: yellow;
}
</style>
</head>
<body>
<!--Button has explicit width for us to resolve against: -->
<div class="button" style="width: 100px">
<div class="p80">abc</div>
</div>
<div class="button" style="width: 100px">
<div class="p100">abc</div>
</div>
<!--Button is using intrinsic width: -->
<div class="button">
<div class="p80">abc</div>
</div>
<div class="button">
<div class="p100">abc</div>
</div>
</body>
</html>

View File

@ -1,62 +0,0 @@
<!DOCTYPE html>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<!-- This test verifies that we honor percent widths on content inside of
a <button> element (resolving the percent against the <button>).
(In this testcase, the button has some focus-border/padding, which
occupies part of the button's content-box and which we'll have to
subtract out from the button's size before using it to resolve
percentages sizes.) -->
<html>
<head>
<style>
button {
border: 0;
padding: 0;
font: 10px sans-serif;
vertical-align: top;
color: black;
background: gray;
-moz-appearance: none;
}
button::-moz-focus-inner {
padding: 0 6px 0 2px;
border: 1px dotted transparent;
}
div.p80 {
width: 80%;
background: pink;
}
div.p100 {
width: 100%;
background: yellow;
}
</style>
</head>
<body>
<!--Button has explicit width for us to resolve against: -->
<button style="width: 110px">
<div class="p80">abc</div>
</button>
<button style="width: 110px">
<div class="p100">abc</div>
</button>
<!--Button is using intrinsic width: -->
<button>
<div class="p80">abc</div>
</button>
<button>
<div class="p100">abc</div>
</button>
</body>
</html>

View File

@ -2,9 +2,6 @@
== first-letter-1.html first-letter-1.html
== first-letter-1.html first-letter-1.html
== focus-area-percent-units-1.html focus-area-percent-units-1.html
== focus-area-percent-units-2.html focus-area-percent-units-2.html
== max-height.html max-height.html
== min-height.html min-height.html
== overflow-areas-1.html overflow-areas-1.html
@ -12,13 +9,9 @@
# The buttons in these tests have some fancy shading applied to their corners
# on B2G, despite their "-moz-appearance: none; background: gray", so they
# don't quite match the reference case's normal <div>. That's why they're fuzzy.
fuzzy-if(B2G||Mulet||Android,125,20) == percent-height-child-1.html percent-height-child-1.html
fuzzy-if(B2G||Mulet||Android,125,20) == percent-height-child.html percent-height-child.html
# Initial mulet triage: parity with B2G/B2G Desktop
pref(browser.display.focus_ring_width,1) fuzzy-if(B2G||Mulet||Android,125,80) == percent-height-child-2.html percent-height-child-2.html
# Initial mulet triage: parity with B2G/B2G Desktop
fuzzy-if(B2G||Mulet||Android,125,20) == percent-width-child-1.html percent-width-child-1.html
# Initial mulet triage: parity with B2G/B2G Desktop
pref(browser.display.focus_ring_width,1) fuzzy-if(B2G||Mulet||Android,125,80) == percent-width-child-2.html percent-width-child-2.html
fuzzy-if(B2G||Mulet||Android,125,20) == percent-width-child.html percent-width-child.html
# Initial mulet triage: parity with B2G/B2G Desktop
== vertical-centering.html vertical-centering.html
@ -46,9 +39,6 @@ fails-if(B2G||Mulet) == width-auto-size-ltr.html width-auto-size-ltr.html
# Bug 1145672
# Bug 1150486
== width-exact-fit-ltr.html width-exact-fit-ltr.html
== width-erode-part-focuspadding-ltr.html width-erode-part-focuspadding-ltr.html
== width-erode-all-focuspadding-ltr.html width-erode-all-focuspadding-ltr.html
== width-erode-overflow-focuspadding-ltr.html width-erode-overflow-focuspadding-ltr.html
fails-if(B2G||Mulet) == width-auto-size-em-rtl.html width-auto-size-em-rtl.html
# Bug 1145672
# Bug 1150486
@ -56,6 +46,3 @@ fails-if(B2G||Mulet) == width-auto-size-rtl.html width-auto-size-rtl.html
# Bug 1145672
# Bug 1150486
== width-exact-fit-rtl.html width-exact-fit-rtl.html
== width-erode-part-focuspadding-rtl.html width-erode-part-focuspadding-rtl.html
== width-erode-all-focuspadding-rtl.html width-erode-all-focuspadding-rtl.html
== width-erode-overflow-focuspadding-rtl.html width-erode-overflow-focuspadding-rtl.html

View File

@ -1,20 +1,18 @@
== first-letter-1.html first-letter-1-ref.html
!= first-letter-1.html first-letter-1-noref.html
== focus-area-percent-units-1.html focus-area-percent-units-1-ref.html
== focus-area-percent-units-2.html focus-area-percent-units-2-ref.html
== max-height.html max-height-ref.html
== min-height.html min-height-ref.html
== overflow-areas-1.html overflow-areas-1-ref.html
# Android is off ever-so-slightly on the points where the text
# runs into the border on this text, so a little fuzz is needed.
fuzzy-if(Android,1,16) == overflow-areas-1.html overflow-areas-1-ref.html
# The buttons in these tests have some fancy shading applied to their corners
# on Android, despite their "-moz-appearance: none; background: gray", so they
# don't quite match the reference case's normal <div>. That's why they're fuzzy.
fuzzy-if(Android,125,20) == percent-height-child-1.html percent-height-child-1-ref.html
pref(browser.display.focus_ring_width,1) fuzzy-if(Android,125,80) == percent-height-child-2.html percent-height-child-2-ref.html
fuzzy-if(Android,125,20) == percent-width-child-1.html percent-width-child-1-ref.html
pref(browser.display.focus_ring_width,1) fuzzy-if(Android,125,80) == percent-width-child-2.html percent-width-child-2-ref.html
fuzzy-if(Android,125,20) == percent-height-child.html percent-height-child-ref.html
fuzzy-if(Android,125,20) == percent-width-child.html percent-width-child-ref.html
== vertical-centering.html vertical-centering-ref.html
@ -36,14 +34,8 @@ fails-if(Android) == disabled-1.html disabled-1-ref.html
== width-auto-size-em-ltr.html width-auto-size-em-ltr-ref.html
== width-auto-size-ltr.html width-auto-size-ltr-ref.html
== width-exact-fit-ltr.html width-auto-size-ltr-ref.html
== width-erode-part-focuspadding-ltr.html width-erode-part-focuspadding-ltr-ref.html
== width-erode-all-focuspadding-ltr.html width-erode-all-focuspadding-ltr-ref.html
== width-erode-overflow-focuspadding-ltr.html width-erode-overflow-focuspadding-ltr-ref.html
== width-auto-size-em-rtl.html width-auto-size-em-rtl-ref.html
== width-auto-size-rtl.html width-auto-size-rtl-ref.html
== width-exact-fit-rtl.html width-auto-size-rtl-ref.html
== width-erode-part-focuspadding-rtl.html width-erode-part-focuspadding-rtl-ref.html
== width-erode-all-focuspadding-rtl.html width-erode-all-focuspadding-rtl-ref.html
== width-erode-overflow-focuspadding-rtl.html width-erode-overflow-focuspadding-rtl-ref.html
== display-grid-flex-columnset.html display-grid-flex-columnset-ref.html
== 1317351.html 1317351-ref.html

View File

@ -11,7 +11,6 @@ div.button {
span {
display: inline-block; vertical-align: middle;
height: 2em; width: 5em; border: 2px solid blue;
margin: 1px 3px; /* for implicit focuspadding */
}
</style>

View File

@ -12,7 +12,6 @@ div.button {
span {
display: inline-block; vertical-align: middle;
height: 2em; width: 5em; border: 2px solid blue;
margin: 1px 3px; /* for implicit focuspadding */
}
</style>

View File

@ -12,7 +12,6 @@ div.button {
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
margin: 1px 3px; /* for implicit focuspadding */
}
</style>

View File

@ -13,7 +13,6 @@ div.button {
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
margin: 1px 3px; /* for implicit focuspadding */
}
</style>

View File

@ -1,20 +0,0 @@
<!DOCTYPE HTML>
<style>
div.button {
display: inline-block;
background: yellow;
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
}
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
margin: 1px 0px; /* for implicit focuspadding, fully eroded */
}
</style>
<div class=button><span></span></div>

View File

@ -1,21 +0,0 @@
<!DOCTYPE HTML>
<style>
button {
-moz-appearance: none;
background: yellow;
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
width: 62px;
border-radius: 0; /* override mobile/android/themes/core/content.css */
}
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
}
</style>
<button><span></span></button>

View File

@ -1,20 +0,0 @@
<!DOCTYPE HTML>
<style>
div.button {
display: inline-block;
background: yellow;
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
}
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
margin: 1px -2px 1px 0; /* for implicit focuspadding, fully eroded and overflowed */
}
</style>
<div class=button><span></span></div>

View File

@ -1,21 +0,0 @@
<!DOCTYPE HTML>
<style>
button {
-moz-appearance: none;
background: yellow;
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
width: 60px;
border-radius: 0; /* override mobile/android/themes/core/content.css */
}
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
}
</style>
<button><span></span></button>

View File

@ -1,21 +0,0 @@
<!DOCTYPE HTML>
<html dir=rtl>
<style>
div.button {
display: inline-block;
background: yellow;
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
}
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
margin: 1px 0 1px -2px; /* for implicit focuspadding, fully eroded and overflowed */
}
</style>
<div class=button><span></span></div>

View File

@ -1,22 +0,0 @@
<!DOCTYPE HTML>
<html dir=rtl>
<style>
button {
-moz-appearance: none;
background: yellow;
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
width: 60px;
border-radius: 0; /* override mobile/android/themes/core/content.css */
}
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
}
</style>
<button><span></span></button>

View File

@ -1,20 +0,0 @@
<!DOCTYPE HTML>
<style>
div.button {
display: inline-block;
background: yellow;
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
}
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
margin: 1px 2px; /* for implicit focuspadding, partly eroded */
}
</style>
<div class=button><span></span></div>

View File

@ -1,21 +0,0 @@
<!DOCTYPE HTML>
<style>
button {
-moz-appearance: none;
background: yellow;
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
width: 66px;
border-radius: 0; /* override mobile/android/themes/core/content.css */
}
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
}
</style>
<button><span></span></button>

View File

@ -1,21 +0,0 @@
<!DOCTYPE HTML>
<html dir=rtl>
<style>
div.button {
display: inline-block;
background: yellow;
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
}
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
margin: 1px 2px; /* for implicit focuspadding, partly eroded */
}
</style>
<div class=button><span></span></div>

View File

@ -1,22 +0,0 @@
<!DOCTYPE HTML>
<html dir=rtl>
<style>
button {
-moz-appearance: none;
background: yellow;
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
width: 66px;
border-radius: 0; /* override mobile/android/themes/core/content.css */
}
span {
display: inline-block; vertical-align: middle;
height: 20px; width: 50px; border: 2px solid blue;
}
</style>
<button><span></span></button>

View File

@ -7,7 +7,7 @@ button {
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
width: 68px;
width: 62px;
border-radius: 0; /* override mobile/android/themes/core/content.css */
}

View File

@ -8,7 +8,7 @@ button {
border: 2px solid fuchsia;
padding: 2px;
font-size: 10px;
width: 68px;
width: 62px;
border-radius: 0; /* override mobile/android/themes/core/content.css */
}

View File

@ -10,12 +10,12 @@
.rtl button,
.ltr input[type="button"],
.rtl input[type="button"] {
padding: 0px 6px;
padding: 0px 8px;
}
.v-rl button,
.v-rl input[type="button"] {
padding: 6px 0px;
padding: 8px 0px;
}
</style>
<div class=ltr>

View File

@ -10,13 +10,13 @@
.rtl input[type="color"]:-moz-system-metric(color-picker-available) {
width: 64px;
height: 23px;
padding: 0px 6px;
padding: 0px 8px;
}
.v-rl input[type="color"]:-moz-system-metric(color-picker-available) {
height: 64px;
width: 23px;
padding: 6px 0px;
padding: 8px 0px;
}
</style>
<div class=ltr>

View File

@ -914,7 +914,6 @@ nsLayoutStylesheetCache::BuildPreferenceSheet(RefPtr<StyleSheet>* aSheet,
"button::-moz-focus-inner, input[type=\"reset\"]::-moz-focus-inner, "
"input[type=\"button\"]::-moz-focus-inner, "
"input[type=\"submit\"]::-moz-focus-inner { "
"padding: 1px 2px 1px 2px; "
"border: %dpx %s transparent !important; }\n",
focusRingWidth,
focusRingStyle == 0 ? "solid" : "dotted");

View File

@ -660,12 +660,12 @@ input[type="button"],
input[type="submit"] {
-moz-appearance: button;
/* The sum of border and padding on block-start and block-end
must be the same here, for text inputs, and for <select>. For
buttons, make sure to include the -moz-focus-inner border/padding. */
must be the same here, for text inputs, and for <select>.
Note -moz-focus-inner padding does not affect button size. */
padding-block-start: 0px;
padding-inline-end: 6px;
padding-inline-end: 8px;
padding-block-end: 0px;
padding-inline-start: 6px;
padding-inline-start: 8px;
border: 2px outset ThreeDLightShadow;
background-color: ButtonFace;
cursor: default;
@ -758,9 +758,9 @@ input[type="button"]:active:hover,
input[type="submit"]:active:hover {
%ifndef XP_MACOSX
padding-block-start: 0px;
padding-inline-end: 5px;
padding-inline-end: 7px;
padding-block-end: 0px;
padding-inline-start: 7px;
padding-inline-start: 9px;
%endif
border-style: inset;
background-color: ButtonFace;
@ -779,6 +779,7 @@ input[type="reset"]::-moz-focus-inner,
input[type="button"]::-moz-focus-inner,
input[type="submit"]::-moz-focus-inner,
input[type="file"] > button[type="button"]::-moz-focus-inner {
/* Note this padding only affects the -moz-focus-inner ring, not the button itself */
padding-block-start: 0px;
padding-inline-end: 2px;
padding-block-end: 0px;
@ -809,9 +810,9 @@ input[type="submit"]:disabled {
/* The sum of border and padding on block-start and block-end
must be the same here and for text inputs */
padding-block-start: 0px;
padding-inline-end: 6px;
padding-inline-end: 8px;
padding-block-end: 0px;
padding-inline-start: 6px;
padding-inline-start: 8px;
border: 2px outset ThreeDLightShadow;
cursor: inherit;
}

View File

@ -1148,4 +1148,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
static const int32_t kUnknownId = -1;
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1489069889099000);
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1489156478567000);

View File

@ -1,5 +1,6 @@
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
0x.cx: could not connect to host
0x.sk: could not connect to host
0x1337.eu: could not connect to host
0x44.net: did not receive HSTS header
@ -68,6 +69,7 @@ acisonline.net: could not connect to host
acorns.com: did not receive HSTS header
acr.im: could not connect to host
acslimited.co.uk: did not receive HSTS header
activateplay.com: did not receive HSTS header
activeweb.top: could not connect to host
activiti.alfresco.com: did not receive HSTS header
acuve.jp: could not connect to host
@ -109,6 +111,7 @@ agalaxyfarfaraway.co.uk: could not connect to host
agbremen.de: did not receive HSTS header
agevio.com: could not connect to host
agilebits.net: could not connect to host
agowa338.de: could not connect to host
agrimap.com: did not receive HSTS header
agrios.de: did not receive HSTS header
agro-id.gov.ua: could not connect to host
@ -144,10 +147,6 @@ alethearose.com: did not receive HSTS header
alexandre.sh: did not receive HSTS header
alexhaydock.co.uk: [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]
alexisabarca.com: did not receive HSTS header
alexismeza.com: could not connect to host
alexismeza.com.mx: could not connect to host
alexismeza.dk: could not connect to host
alexyang.me: could not connect to host
alfredxing.com: did not receive HSTS header
alittlebitcheeky.com: did not receive HSTS header
alkami.com: did not receive HSTS header
@ -160,14 +159,12 @@ alpha.irccloud.com: could not connect to host
alphabit-secure.com: could not connect to host
alphabuild.io: did not receive HSTS header
alphalabs.xyz: could not connect to host
alterbaum.net: did not receive HSTS header
altfire.ca: could not connect to host
altmv.com: max-age too low: 7776000
amaforums.org: could not connect to host
american-truck-simulator.de: could not connect to host
american-truck-simulator.net: could not connect to host
americanworkwear.nl: did not receive HSTS header
ameza.co.uk: could not connect to host
amigogeek.net: could not connect to host
amihub.com: could not connect to host
amilx.com: could not connect to host
@ -203,6 +200,7 @@ ankaraprofesyonelnakliyat.com: did not receive HSTS header
annabellaw.com: max-age too low: 0
anomaly.ws: did not receive HSTS header
anonboards.com: did not receive HSTS header
anonymousstatecollegelulzsec.com: could not connect to host
anook.com: max-age too low: 0
ant.land: could not connect to host
anthenor.co.uk: could not connect to host
@ -225,7 +223,6 @@ aponkral.net: did not receive HSTS header
aponkralsunucu.com: did not receive HSTS header
app.lookout.com: could not connect to host
app.manilla.com: could not connect to host
appart.ninja: could not connect to host
appengine.google.com: did not receive HSTS header (error ignored - included regardless)
applez.xyz: could not connect to host
applic8.com: did not receive HSTS header
@ -255,7 +252,6 @@ asasuou.pw: could not connect to host
asc16.com: could not connect to host
asdpress.cn: could not connect to host
aserver.co: could not connect to host
asianodor.com: could not connect to host
askfit.cz: did not receive HSTS header
asmui.ga: could not connect to host
asmui.ml: could not connect to host
@ -289,7 +285,6 @@ ausoptic.com.au: max-age too low: 2592000
auszeit.bio: did not receive HSTS header
auth.mail.ru: did not receive HSTS header
authentication.io: could not connect to host
autimatisering.nl: could not connect to host
auto-serwis.zgorzelec.pl: did not receive HSTS header
auto4trade.nl: could not connect to host
autojuhos.sk: did not receive HSTS header
@ -322,6 +317,7 @@ bakkerdesignandbuild.com: did not receive HSTS header
balcan-underground.net: could not connect to host
baldwinkoo.com: could not connect to host
bandb.xyz: could not connect to host
bangzafran.com: did not receive HSTS header
bannisbierblog.de: could not connect to host
banqingdiao.com: could not connect to host
barbaros.info: could not connect to host
@ -373,9 +369,9 @@ bettween.com: could not connect to host
betz.ro: did not receive HSTS header
beulahtabernacle.com: could not connect to host
bevapehappy.com: did not receive HSTS header
beyuna.co.uk: could not connect to host
beyuna.eu: could not connect to host
beyuna.nl: could not connect to host
beyuna.co.uk: did not receive HSTS header
beyuna.eu: did not receive HSTS header
beyuna.nl: did not receive HSTS header
bezorg.ninja: did not receive HSTS header
bf.am: max-age too low: 0
bgcparkstad.nl: did not receive HSTS header
@ -532,6 +528,7 @@ cajapopcorn.com: did not receive HSTS header
cake.care: could not connect to host
calgaryconstructionjobs.com: could not connect to host
calix.com: max-age too low: 0
call.me: did not receive HSTS header
calltrackingreports.com: could not connect to host
calvin.me: max-age too low: 2592000
calvinallen.net: could not connect to host
@ -591,7 +588,6 @@ cfcproperties.com: did not receive HSTS header
cfetengineering.com: could not connect to host
cg.search.yahoo.com: did not receive HSTS header
chainmonitor.com: could not connect to host
chamathellawala.com: could not connect to host
championsofregnum.com: did not receive HSTS header
chandlerredding.com: did not receive HSTS header
changelab.cc: [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]
@ -619,13 +615,13 @@ childcaresolutionscny.org: did not receive HSTS header
chirgui.eu: could not connect to host
chm.vn: did not receive HSTS header
chontalpa.pw: could not connect to host
chosenplaintext.org: could not connect to host
chotu.net: could not connect to host
chris-web.info: could not connect to host
chrisandsarahinasia.com: did not receive HSTS header
chriskyrouac.com: could not connect to host
christiaandruif.nl: could not connect to host
christianbro.gq: could not connect to host
christina-quast.de: could not connect to host
christophheich.me: could not connect to host
chrisupjohn.com: could not connect to host
chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless)
@ -677,13 +673,14 @@ cn.search.yahoo.com: did not receive HSTS header
co50.com: did not receive HSTS header
coam.co: did not receive HSTS header
cocaine-import.agency: could not connect to host
cocoaheads.at: could not connect to host
codabix.com: did not receive HSTS header
codabix.de: could not connect to host
codabix.net: could not connect to host
code.google.com: did not receive HSTS header (error ignored - included regardless)
codeco.pw: could not connect to host
codeforce.io: did not receive HSTS header
codepult.com: could not connect to host
codepref.com: could not connect to host
codepx.com: did not receive HSTS header
codiva.io: max-age too low: 2592000
coffeeetc.co.uk: did not receive HSTS header
@ -704,6 +701,7 @@ comicspines.com: could not connect to host
compalytics.com: could not connect to host
comparejewelleryprices.co.uk: could not connect to host
completionist.audio: could not connect to host
complexart.ro: did not receive HSTS header
computeremergency.com.au: did not receive HSTS header
concord-group.co.jp: did not receive HSTS header
condesaelectronics.com: max-age too low: 0
@ -713,11 +711,13 @@ conrad-kostecki.de: did not receive HSTS header
consciousandglamorous.com: could not connect to host
console.python.org: did not receive HSTS header
constructionjobs.com: did not receive HSTS header
contactbig.com: could not connect to host
content-api-dev.azurewebsites.net: could not connect to host
continuumgaming.com: could not connect to host
controlcenter.gigahost.dk: did not receive HSTS header
coolchevy.org.ua: could not connect to host
coralproject.net: did not receive HSTS header
coralrosado.com.br: could not connect to host
cordial-restaurant.com: did not receive HSTS header
core.mx: could not connect to host
core4system.de: did not receive HSTS header
@ -729,7 +729,6 @@ correctpaardbatterijnietje.nl: did not receive HSTS header
corruption-mc.net: could not connect to host
corruption-rsps.net: could not connect to host
corruption-server.net: could not connect to host
corzntin.fr: could not connect to host
count.sh: could not connect to host
couragewhispers.ca: did not receive HSTS header
coursdeprogrammation.com: could not connect to host
@ -743,12 +742,13 @@ craftedge.xyz: could not connect to host
craftmine.cz: did not receive HSTS header
crate.io: did not receive HSTS header
cravelyrics.com: did not receive HSTS header
crazifyngers.com: could not connect to host
crazycen.com: did not receive HSTS header
crazyhotseeds.com: did not receive HSTS header
create-test-publish.co.uk: could not connect to host
creativephysics.ml: could not connect to host
creativeplayuk.com: did not receive HSTS header
crendontech.com: could not connect to host
crestasantos.com: could not connect to host
crestoncottage.com: could not connect to host
criena.net: could not connect to host
critical.today: could not connect to host
@ -803,6 +803,7 @@ daniel-steuer.de: did not receive HSTS header
danieldk.eu: did not receive HSTS header
danielworthy.com: did not receive HSTS header
danijobs.com: could not connect to host
dannyrohde.de: could not connect to host
danpiel.net: could not connect to host
danrl.de: did not receive HSTS header
daolerp.xyz: could not connect to host
@ -871,13 +872,11 @@ depijl-mz.nl: did not receive HSTS header
depixion.agency: could not connect to host
dequehablamos.es: could not connect to host
derevtsov.com: did not receive HSTS header
derhil.de: did not receive HSTS header
derwolfe.net: did not receive HSTS header
desiccantpackets.com: did not receive HSTS header
destinationbijoux.fr: could not connect to host
detector.exposed: could not connect to host
deux.solutions: could not connect to host
deuxsol.com: could not connect to host
deuxsolutions.com: could not connect to host
devcu.net: did not receive HSTS header
devh.de: did not receive HSTS header
devincrow.me: could not connect to host
@ -889,7 +888,6 @@ diablotine.rocks: could not connect to host
diarbag.us: did not receive HSTS header
diasp.cz: [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]
diedrich.co: could not connect to host
dietrich.cx: could not connect to host
digitaldaddy.net: could not connect to host
digitalriver.tk: could not connect to host
digitalskillswap.com: could not connect to host
@ -943,6 +941,7 @@ dprd-wonogirikab.go.id: did not receive HSTS header
dragonisles.net: could not connect to host
dragons-of-highlands.cz: could not connect to host
dragontrainingmobilezoo.com.au: max-age too low: 0
dranek.com: could not connect to host
draw.uy: could not connect to host
drbethanybarnes.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]
drdevil.ru: could not connect to host
@ -1045,7 +1044,6 @@ encoder.pw: could not connect to host
encrypted.google.com: did not receive HSTS header (error ignored - included regardless)
endzeit-architekten.com: 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]
engg.ca: could not connect to host
englishforums.com: could not connect to host
enigmacpt.com: did not receive HSTS header
enigmail.net: did not receive HSTS header
@ -1069,8 +1067,7 @@ equatetechnologies.com.au: max-age too low: 3600
equilibre-yoga-jennifer-will.com: could not connect to host
erawanarifnugroho.com: did not receive HSTS header
eressea.xyz: did not receive HSTS header
ericbond.net: could not connect to host
ericyl.com: did not receive HSTS header
ericyl.com: could not connect to host
ernesto.at: could not connect to host
eromixx.com: did not receive HSTS header
erotalia.es: could not connect to host
@ -1155,6 +1152,7 @@ fayolle.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERR
fbox.li: could not connect to host
fdj.im: could not connect to host
feard.space: could not connect to host
feastr.de: did not receive HSTS header
fedux.com.ar: could not connect to host
feezmodo.com: max-age too low: 0
felisslovakia.sk: [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]
@ -1205,6 +1203,7 @@ 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
flyaces.com: did not receive HSTS header
flyss.net: did not receive HSTS header
@ -1296,8 +1295,9 @@ gamepiece.com: could not connect to host
gamers-life.fr: could not connect to host
gamerslair.org: did not receive HSTS header
gamesdepartment.co.uk: did not receive HSTS header
gamingmedia.eu: did not receive HSTS header
gamingmedia.eu: could not connect to host
gampenhof.de: did not receive HSTS header
gancedo.com.es: [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]
gaptek.id: did not receive HSTS header
garciamartin.me: could not connect to host
gatilagata.com.br: did not receive HSTS header
@ -1306,14 +1306,13 @@ gdpventure.com: max-age too low: 0
gedankenbude.info: did not receive HSTS header
geekbundle.org: did not receive HSTS header
geekcast.co.uk: did not receive HSTS header
geeky.software: could not connect to host
geli-graphics.com: did not receive HSTS header
gem-indonesia.net: 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
gerardozamudio.mx: could not connect to host
gerencianet.com.br: did not receive HSTS header
gernert-server.de: could not connect to host
get.zenpayroll.com: did not receive HSTS header
getable.com: did not receive HSTS header
getblys.com.au: did not receive HSTS header
@ -1334,6 +1333,7 @@ gfwsb.ml: could not connect to host
gh16.com.ar: could not connect to host
gheorghesarcov.ga: could not connect to host
gheorghesarcov.tk: could not connect to host
ghostblog.info: 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
@ -1351,7 +1351,6 @@ gjspunk.de: did not receive HSTS header
gl.search.yahoo.com: did not receive HSTS header
glass.google.com: did not receive HSTS header (error ignored - included regardless)
glentakahashi.com: max-age too low: 0
glitchsys.com: could not connect to host
glitzmirror.com: could not connect to host
globalexpert.co.nz: could not connect to host
globalittech.com: could not connect to host
@ -1368,7 +1367,7 @@ goabonga.com: could not connect to host
goaltree.ch: did not receive HSTS header
goarmy.eu: [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]
goat.chat: did not receive HSTS header
goat.xyz: could not connect to host
goat.xyz: did not receive HSTS header
goben.ch: could not connect to host
goerner.me: did not receive HSTS header
goge.site: could not connect to host
@ -1387,11 +1386,13 @@ googlemail.com: did not receive HSTS header (error ignored - included regardless
googleplex.com: did not receive HSTS header (error ignored - included regardless)
goolok.com: did not receive HSTS header
gorilla-gym.site: could not connect to host
gorschenin.com: could not connect to host
goto.google.com: did not receive HSTS header (error ignored - included regardless)
gottcode.org: did not receive HSTS header
govillemo.ca: did not receive HSTS header
gowe.wang: could not connect to host
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
@ -1404,7 +1405,6 @@ greenvines.com.tw: did not receive HSTS header
gregorytlee.me: did not receive HSTS header
gremots.com: did not receive HSTS header
greplin.com: could not connect to host
grey.house: could not connect to host
gribani.com: could not connect to host
grigalanzsoftware.com: could not connect to host
grossmann.gr: could not connect to host
@ -1418,6 +1418,7 @@ gtanda.tk: could not connect to host
gtlfsonlinepay.com: did not receive HSTS header
gtraxapp.com: could not connect to host
guava.studio: did not receive HSTS header
guhenry3.tk: could not connect to host
guilde-vindicta.fr: did not receive HSTS header
gulenet.com: could not connect to host
gurusupe.com: could not connect to host
@ -1460,6 +1461,7 @@ haozi.me: could not connect to host
happyfabric.me: did not receive HSTS header
happygadget.me: could not connect to host
harabuhouse.com: did not receive HSTS header
hardfalcon.net: could not connect to host
harmonycosmetic.com: max-age too low: 300
harristony.com: could not connect to host
hartmancpa.com: did not receive HSTS header
@ -1495,9 +1497,8 @@ helpmebuild.com: did not receive HSTS header
hemdal.se: could not connect to host
hencagon.com: could not connect to host
henriknoerr.com: could not connect to host
heritagedentistry.ca: could not connect to host
hermes-net.de: did not receive HSTS header
herpaderp.net: did not receive HSTS header
herpaderp.net: could not connect to host
herzbotschaft.de: did not receive HSTS header
heyguevara.com: could not connect to host
hibilog.com: could not connect to host
@ -1544,7 +1545,6 @@ housemaadiah.org: did not receive HSTS header
housingstudents.org.uk: could not connect to host
howbigismybuilding.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]
howrandom.org: could not connect to host
howtocuremysciatica.com: did not receive HSTS header
hr-intranet.com: did not receive HSTS header
hsir.me: could not connect to host
hsts.date: could not connect to host
@ -1624,6 +1624,7 @@ imu.li: did not receive HSTS header
imusic.dk: did not receive HSTS header
inb4.us: could not connect to host
inbox.li: did not receive HSTS header
inche-ali.com: could not connect to host
inchomatic.com: did not receive HSTS header
indoorskiassen.nl: did not receive HSTS header
indust.me: did not receive HSTS header
@ -1633,6 +1634,7 @@ 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
infosec.rip: could not connect to host
infotics.es: did not receive HSTS header
injigo.com: did not receive HSTS header
inkable.com.au: did not receive HSTS header
@ -1681,7 +1683,6 @@ iraqidinar.org: did not receive HSTS header
irazimina.ru: did not receive HSTS header
irccloud.com: did not receive HSTS header
ircmett.de: 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
isdown.cz: did not receive HSTS header
@ -1729,6 +1730,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
janoberst.com: 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
@ -1746,7 +1748,6 @@ jayscoaching.com: could not connect to host
jayshao.com: did not receive HSTS header
jazzinutrecht.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]
jbbd.fr: could not connect to host
jbfp.dk: could not connect to host
jbn.mx: could not connect to host
jbradaric.me: could not connect to host
jcch.de: could not connect to host
@ -1793,7 +1794,6 @@ jonasgroth.se: max-age too low: 2592000
jonathan.ir: could not connect to host
jonathancarter.org: [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]
jonn.me: could not connect to host
jonnichols.info: could not connect to host
joostbovee.nl: did not receive HSTS header
jordanhamilton.me: could not connect to host
joretapo.fr: could not connect to host
@ -1825,6 +1825,7 @@ k-dev.de: could not connect to host
ka-clan.com: could not connect to host
kab-s.de: did not receive HSTS header
kabuabc.com: did not receive HSTS header
kabus.org: could not connect to host
kadioglumakina.com.tr: did not receive HSTS header
kahopoon.net: could not connect to host
kaisers.de: did not receive HSTS header
@ -1861,9 +1862,11 @@ kgxtech.com: max-age too low: 2592000
kickass.al: could not connect to host
kid-dachau.de: did not receive HSTS header
kiel-media.de: did not receive HSTS header
kienlen.org: could not connect to host
kimpost.org: could not connect to host
kinderwagen-test24.de: could not connect to host
kingmanhall.org: could not connect to host
kinniyaonlus.com: did not receive HSTS header
kinnon.enterprises: could not connect to host
kinogb.net: max-age too low: 0
kionetworks.com: did not receive HSTS header
@ -1894,7 +1897,6 @@ kmartin.io: did not receive HSTS header
knccloud.com: could not connect to host
kodokushi.fr: could not connect to host
kollabria.com: max-age too low: 0
komget.net: did not receive HSTS header
komikito.com: could not connect to host
kompetenzwerft.de: did not receive HSTS header
kongar.org: could not connect to host
@ -1922,7 +1924,6 @@ kstan.me: could not connect to host
kucom.it: did not receive HSTS header
kueulangtahunanak.net: could not connect to host
kummerlaender.eu: did not receive HSTS header
kuoruan.com: did not receive HSTS header
kuppingercole.com: did not receive HSTS header
kura.io: could not connect to host
kurehun.org: could not connect to host
@ -1949,6 +1950,7 @@ lampl.info: did not receive HSTS header
landscape.canonical.com: max-age too low: 2592000
langenbach.rocks: could not connect to host
langhun.me: did not receive HSTS header
laobox.fr: could not connect to host
laozhu.me: did not receive HSTS header
laserfuchs.de: did not receive HSTS header
lashstuff.com: did not receive HSTS header
@ -1957,12 +1959,11 @@ latus.xyz: could not connect to host
lauftrainer-ausbildung.com: did not receive HSTS header
lavabit.no: could not connect to host
lavval.com: could not connect to host
lawformt.com: could not connect to host
lawformt.com: did not receive HSTS header
lawly.org: did not receive HSTS header
laxatus.com: did not receive HSTS header
laxiongames.es: could not connect to host
lbrt.xyz: could not connect to host
ld-begunjscica.si: did not receive HSTS header
ldarby.me.uk: could not connect to host
leadership9.com: could not connect to host
leardev.de: did not receive HSTS header
@ -1991,7 +1992,6 @@ lesdouceursdeliyana.com: could not connect to host
letras.mus.br: did not receive HSTS header
letsmultiplayerplay.com: did not receive HSTS header
letustravel.tk: could not connect to host
levinus.de: could not connect to host
lfullerdesign.com: did not receive HSTS header
lgiswa.com.au: did not receive HSTS header
lgrs.com.au: did not receive HSTS header
@ -2010,6 +2010,7 @@ liaoshuma.com: could not connect to host
libertyrp.org: could not connect to host
library.linode.com: did not receive HSTS header
librechan.net: could not connect to host
libscode.com: did not receive HSTS header
liduan.com: could not connect to host
liduan.net: could not connect to host
lifeguard.aecom.com: did not receive HSTS header
@ -2035,8 +2036,6 @@ linuxgeek.ro: could not connect to host
liquorsanthe.in: could not connect to host
listafirmelor.com: could not connect to host
litespeed.io: could not connect to host
litz.ca: could not connect to host
litzenberger.ca: could not connect to host
livedemo.io: could not connect to host
livej.am: could not connect to host
livi.co: did not receive HSTS header
@ -2077,6 +2076,7 @@ lsky.cn: did not receive HSTS header
lsp-sports.de: did not receive HSTS header
lt.search.yahoo.com: did not receive HSTS header
ltbytes.com: could not connect to host
ltn-tom-morel.fr: could not connect to host
lu.search.yahoo.com: did not receive HSTS header
luine.xyz: could not connect to host
luis-checa.com: could not connect to host
@ -2111,11 +2111,13 @@ macchaberrycream.com: could not connect to host
macchedil.com: did not receive HSTS header
macgeneral.de: did not receive HSTS header
machon.biz: could not connect to host
macker.io: could not connect to host
macosxfilerecovery.com: did not receive HSTS header
madars.org: did not receive HSTS header
maddin.ga: could not connect to host
madebymagnitude.com: did not receive HSTS header
maderwin.com: could not connect to host
madreacqua.org: could not connect to host
madusecurity.com: could not connect to host
mafamane.com: could not connect to host
mafiareturns.com: max-age too low: 2592000
@ -2123,7 +2125,7 @@ magenx.com: did not receive HSTS header
mahamed91.pw: could not connect to host
mail-settings.google.com: did not receive HSTS header (error ignored - included regardless)
mail.google.com: did not receive HSTS header (error ignored - included regardless)
maildragon.com: did not receive HSTS header
maildragon.com: 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
@ -2176,6 +2178,7 @@ mca2017.org: did not receive HSTS header
mcc.re: could not connect to host
mcdonalds.ru: did not receive HSTS header
mclab.su: could not connect to host
md5hashing.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]
mdewendt.de: could not connect to host
mdfnet.se: did not receive HSTS header
mdscomp.net: did not receive HSTS header
@ -2196,6 +2199,7 @@ megaxchange.com: did not receive HSTS header
meghudson.com: could not connect to host
mein-gesundheitsmanager.com: did not receive HSTS header
meincenter-meinemeinung.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]
meincloudspeicher.de: could not connect to host
meinebo.it: could not connect to host
meizufans.eu: [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]
melted.pw: could not connect to host
@ -2220,11 +2224,13 @@ mexbt.com: could not connect to host
mfcatalin.com: could not connect to host
mfiles.pl: [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]
mhealthdemocamp.com: could not connect to host
mheistermann.de: could not connect to host
mhict.nl: max-age too low: 0
mia.to: could not connect to host
michaelfitzpatrickruth.com: could not connect to host
michal-kral.cz: could not connect to host
michalborka.cz: could not connect to host
michelchouinard.ca: did not receive HSTS header
micro-dv.ru: could not connect to host
micro-rain-systems.com: could not connect to host
microme.ga: could not connect to host
@ -2274,6 +2280,7 @@ mobilethreat.net: could not connect to host
mobilethreatnetwork.net: could not connect to host
mobilpass.no: could not connect to host
mocloud.eu: could not connect to host
moddedark.com: could not connect to host
modemagazines.co.uk: could not connect to host
modydev.club: could not connect to host
moebel-nagel.de: did not receive HSTS header
@ -2294,7 +2301,6 @@ moparscape.org: did not receive HSTS header
mor.gl: could not connect to host
morbitzer.de: did not receive HSTS header
morethanadream.lv: could not connect to host
morganino.eu: could not connect to host
moriz.net: could not connect to host
morningcalculation.com: could not connect to host
morotech.com.br: max-age too low: 2592000
@ -2373,6 +2379,7 @@ nametaken-cloud.duckdns.org: could not connect to host
nanogeneinc.com: could not connect to host
nansay.cn: 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
natalia.io: could not connect to host
natalt.org: did not receive HSTS header
@ -2395,6 +2402,7 @@ near.st: did not receive HSTS header
neel.ch: could not connect to host
neftaly.com: did not receive HSTS header
negai.moe: could not connect to host
negativecurvature.net: could not connect to host
neilgreen.net: did not receive HSTS header
neko-life.com: did not receive HSTS header
neko-system.com: did not receive HSTS header
@ -2421,6 +2429,7 @@ netztest.at: did not receive HSTS header
neueonlinecasino2016.com: could not connect to host
neuralgic.net: could not connect to host
neutralox.com: max-age too low: 3600
never-afk.de: could not connect to host
neveta.com: could not connect to host
newcitygas.ca: max-age too low: 0
newlooknow.com: did not receive HSTS header
@ -2459,6 +2468,7 @@ nocallaghan.com: could not connect to host
nocs.cn: did not receive HSTS header
noctinus.tk: could not connect to host
nodebrewery.com: could not connect to host
nodecompat.com: could not connect to host
nodetemple.com: could not connect to host
noexpect.org: could not connect to host
noima.com: did not receive HSTS header
@ -2576,6 +2586,7 @@ openshift.redhat.com: did not receive HSTS header
opensrd.com: could not connect to host
openxmpp.com: could not connect to host
opim.ca: did not receive HSTS header
opium.io: did not receive HSTS header
oprbox.com: could not connect to host
opsbears.com: did not receive HSTS header
optenhoefel.de: could not connect to host
@ -2589,15 +2600,17 @@ orionfcu.com: did not receive HSTS header
orleika.ml: could not connect to host
osaiyuwu.com: could not connect to host
oslfoundation.org: could not connect to host
oslinux.net: could not connect to host
osp.cx: could not connect to host
ossan-kobe-gourmet.com: did not receive HSTS header
ossbinaries.com: could not connect to host
osteammate.com: did not receive HSTS header
osticketawesome.com: did not receive HSTS header
ostr.io: [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]
otakuworld.de: could not connect to host
othercode.nl: could not connect to host
othermedia.cc: [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]
otherstuff.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]
oticasvisao.net.br: could not connect to host
otichi.com: did not receive HSTS header
ottospora.nl: could not connect to host
ourbank.com: did not receive HSTS header
@ -2638,7 +2651,6 @@ parodybit.net: [Exception... "Component returned failure code: 0x80004005 (NS_ER
parpaing-paillette.net: could not connect to host
particonpsplus.it: could not connect to host
partijtjevoordevrijheid.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]
partirkyoto.jp: did not receive HSTS header
partyvan.it: could not connect to host
partyvan.moe: could not connect to host
partyvan.nl: could not connect to host
@ -2652,7 +2664,6 @@ paste.linode.com: could not connect to host
pastebin.linode.com: could not connect to host
pastenib.com: could not connect to host
paster.li: did not receive HSTS header
pastie.se: did not receive HSTS header
patientinsight.net: could not connect to host
patt.us: did not receive HSTS header
patterson.mp: could not connect to host
@ -2664,7 +2675,7 @@ payments.google.com: did not receive HSTS header (error ignored - included regar
payroll.ch: did not receive HSTS header
pbapp.net: did not receive HSTS header
pbprint.ru: max-age too low: 0
pc-nf.de: could not connect to host
pc-nf.de: did not receive HSTS header
pcfun.net: did not receive HSTS header
pchax.net: did not receive HSTS header
peissen.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]
@ -2673,7 +2684,7 @@ pekkarik.ru: could not connect to host
penguinclientsystem.com: did not receive HSTS header
pensacolawinterfest.org: could not connect to host
pepchid.com: did not receive HSTS header
pepperhead.com: could not connect to host
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
@ -2735,6 +2746,7 @@ plixer.com: did not receive HSTS header
plogable.co: could not connect to host
plothost.com: did not receive HSTS header
ploup.net: could not connect to host
pluff.nl: could not connect to host
pmnts.io: could not connect to host
po.gl: did not receive HSTS header
poiema.com.sg: did not receive HSTS header
@ -2752,12 +2764,11 @@ poolsandstuff.com: did not receive HSTS header
poon.tech: could not connect to host
poris.web.id: did not receive HSTS header
portalplatform.net: did not receive HSTS header
portalzine.de: 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
potatofrom.space: could not connect to host
potpourrifestival.de: could not connect to host
poussinooz.fr: could not connect to host
povitria.net: could not connect to host
power-of-interest.com: did not receive HSTS header
@ -2767,6 +2778,7 @@ powerxequality.com: could not connect to host
ppr-truby.ru: could not connect to host
ppy3.com: did not receive HSTS header
pr.search.yahoo.com: did not receive HSTS header
prattpokemon.com: could not connect to host
prefontaine.name: could not connect to host
prego-shop.de: did not receive HSTS header
preissler.co.uk: could not connect to host
@ -2782,7 +2794,6 @@ privacyrup.net: could not connect to host
prnt.li: did not receive HSTS header
pro-zone.com: could not connect to host
prodpad.com: did not receive HSTS header
production.vn: did not receive HSTS header
professionalboundaries.com: did not receive HSTS header
profi-durchgangsmelder.de: did not receive HSTS header
profundr.com: could not connect to host
@ -2798,7 +2809,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
psw.academy: did not receive HSTS header
psw.consulting: did not receive HSTS header
@ -2826,6 +2837,7 @@ qinxi1992.com: did not receive HSTS header
qorm.co.uk: did not receive HSTS header
qrara.net: did not receive HSTS header
qrlending.com: did not receive HSTS header
qtxh.net: could not connect to host
quail.solutions: could not connect to host
quantacloud.ch: could not connect to host
quantenteranik.eu: could not connect to host
@ -2843,7 +2855,6 @@ r3bl.me: did not receive HSTS header
raajheshkannaa.com: could not connect to host
radicaleducation.net: could not connect to host
radiormi.com: did not receive HSTS header
radtke.bayern: could not connect to host
rafaelcz.de: could not connect to host
rainbowbarracuda.com: could not connect to host
ramonj.nl: could not connect to host
@ -2882,7 +2893,6 @@ regenbogenwald.de: did not receive HSTS header
regenerescence.com: did not receive HSTS header
reggae-cdmx.com: did not receive HSTS header
reic.me: could not connect to host
reisyukaku.org: did not receive HSTS header
rejo.in: could not connect to host
relisten.nl: did not receive HSTS header
remitatm.com: could not connect to host
@ -2939,6 +2949,7 @@ roddis.net: did not receive HSTS header
rodney.id.au: did not receive HSTS header
rodosto.com: did not receive HSTS header
roeper.party: could not connect to host
roesemann.email: could not connect to host
romans-place.me.uk: did not receive HSTS header
ronvandordt.info: did not receive HSTS header
ronwo.de: max-age too low: 1
@ -3023,6 +3034,7 @@ 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]
schreiber-netzwerk.eu: did not receive HSTS header
schrodinger.io: could not connect to host
schwarzkopfforyou.de: could not connect to host
scienceathome.org: did not receive HSTS header
scooshonline.co.uk: did not receive HSTS header
scotbirchfield.com: did not receive HSTS header
@ -3083,6 +3095,7 @@ serverdensity.io: did not receive HSTS header
servergno.me: did not receive HSTS header
serverstuff.info: could not connect to host
seryo.moe: could not connect to host
sethcaplan.com: could not connect to host
setphaserstostun.org: could not connect to host
setuid.de: could not connect to host
setuid.io: did not receive HSTS header
@ -3169,7 +3182,6 @@ smartrak.co.nz: did not receive HSTS header
smet.us: could not connect to host
smimea.com: could not connect to host
smirkingwhorefromhighgarden.pro: could not connect to host
smith.is: could not connect to host
smkn1lengkong.sch.id: did not receive HSTS header
smksi2.com: max-age too low: 0
sms1.ro: could not connect to host
@ -3190,7 +3202,7 @@ sobotkama.eu: did not receive HSTS header
soccergif.com: could not connect to host
soci.ml: did not receive HSTS header
socialbillboard.com: could not connect to host
socialdevelop.biz: could not connect to host
socialdevelop.biz: did not receive HSTS header
socialhams.net: did not receive HSTS header
socialhead.io: could not connect to host
socialspirit.com.br: did not receive HSTS header
@ -3241,6 +3253,7 @@ spiegels.nl: could not connect to host
spikeykc.me: did not receive HSTS header
spilsbury.io: could not connect to host
spitefultowel.com: could not connect to host
sponc.de: could not connect to host
sportwette.eu: did not receive HSTS header
spot-events.com: could not connect to host
spotlightsrule.ddns.net: could not connect to host
@ -3252,10 +3265,10 @@ square.gs: could not connect to host
squatldf.org: [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]
sqzryang.com: did not receive HSTS header
srevilak.net: did not receive HSTS header
sritest.io: did not receive HSTS header
srna.sk: could not connect to host
srrr.ca: could not connect to host
ss.wtf: did not receive HSTS header
sscd.no: could not connect to host
ssersay.com: max-age too low: 0
ssl.panoramio.com: did not receive HSTS header
ssl.rip: could not connect to host
@ -3297,12 +3310,12 @@ stormhub.org: could not connect to host
stqry.com: did not receive HSTS header
str0.at: did not receive HSTS header
strasweb.fr: did not receive HSTS header
straubis.org: could not connect to host
streamingmagazin.de: could not connect to host
streams.dyndns.org: could not connect to host
strictlysudo.com: could not connect to host
stroeercrm.de: could not connect to host
strongest-privacy.com: could not connect to host
strugee.net: could not connect to host
stuartbaxter.co: could not connect to host
student-scientist.org: did not receive HSTS header
studentresearcher.org: did not receive HSTS header
@ -3324,9 +3337,11 @@ suksit.com: could not connect to host
sumoatm.com: did not receive HSTS header
sumoscout.de: did not receive HSTS header
suncountrymarine.com: did not receive HSTS header
sunflyer.cn: did not receive HSTS header
sunnyfruit.ru: did not receive HSTS header
sunshinepress.org: could not connect to host
superbabysitting.ch: could not connect to host
superbike.tw: could not connect to host
supereight.net: did not receive HSTS header
superiorfloridavacation.com: did not receive HSTS header
supersalescontest.nl: did not receive HSTS header
@ -3391,7 +3406,6 @@ tcdw.net: could not connect to host
tcl.ath.cx: did not receive HSTS header
tcomms.org: max-age too low: 0
teachforcanada.ca: did not receive HSTS header
team-one.racing: could not connect to host
team-pancake.eu: could not connect to host
teamblueridge.org: could not connect to host
teamsocial.co: did not receive HSTS header
@ -3404,6 +3418,7 @@ technosavvyport.com: did not receive HSTS header
techpointed.com: could not connect to host
techvalue.gr: did not receive HSTS header
tegelsensanitaironline.nl: did not receive HSTS header
teknologi.or.id: did not receive HSTS header
tekshrek.com: max-age too low: 0
telefonnummer.online: could not connect to host
telefoonnummerinfo.nl: could not connect to host
@ -3447,6 +3462,7 @@ themarble.co: could not connect to host
themerchandiser.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]
themicrocapital.com: could not connect to host
themillerslive.com: could not connect to host
themusthaves.nl: did not receive HSTS header
theodorejones.info: could not connect to host
thepartywarehouse.co.uk: did not receive HSTS header
thepiratebay.al: could not connect to host
@ -3456,6 +3472,7 @@ therewill.be: could not connect to host
thestack.xyz: could not connect to host
thestagchorleywood.co.uk: did not receive HSTS header
thetomharling.com: max-age too low: 86400
thetradinghall.com: could not connect to host
theurbanyoga.com: did not receive HSTS header
thevintagenews.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]
thezonders.com: did not receive HSTS header
@ -3505,7 +3522,6 @@ todo.is: did not receive HSTS header
todobazar.es: could not connect to host
tokyopopline.com: did not receive HSTS header
tollmanz.com: did not receive HSTS header
tomatenaufdenaugen.de: could not connect to host
tomberek.info: could not connect to host
tomeara.net: could not connect to host
tomharling.co.uk: max-age too low: 86400
@ -3589,7 +3605,7 @@ ublox.com: did not receive HSTS header
ubuntuhot.com: did not receive HSTS header
uega.net: did not receive HSTS header
ufgaming.com: did not receive HSTS header
ufotable.uk: could not connect to host
ufotable.uk: max-age too low: 0
ui8.net: max-age too low: 86400
ukas.com: did not receive HSTS header
ukdropshipment.co.uk: did not receive HSTS header
@ -3624,7 +3640,6 @@ up1.ca: could not connect to host
upaknship.com: did not receive HSTS header
upani.net: did not receive HSTS header
upldr.pw: could not connect to host
upr.com.ua: could not connect to host
uprotect.it: could not connect to host
upstats.eu: could not connect to host
urandom.eu.org: did not receive HSTS header
@ -3655,9 +3670,9 @@ valshamar.is: could not connect to host
vanderkley.it: could not connect to host
vanestack.com: could not connect to host
vanetv.com: could not connect to host
vangeluwedeberlaere.be: could not connect to host
vanitas.xyz: could not connect to host
vanitynailworkz.com: could not connect to host
vanmalland.com: could not connect to host
vansieleghem.com: could not connect to host
vasanth.org: could not connect to host
vbh2o.com: did not receive HSTS header
@ -3677,7 +3692,6 @@ vetmgmt.com: could not connect to host
vfree.org: could not connect to host
vglimg.com: could not connect to host
vhost.co.id: could not connect to host
viadeux.com: could not connect to host
videnskabsklubben.dk: did not receive HSTS header
videomuz.com: did not receive HSTS header
vidz.ga: could not connect to host
@ -3737,6 +3751,7 @@ warped.com: did not receive HSTS header
warsentech.com: could not connect to host
waschpark-hantschel.de: did not receive HSTS header
watchium.com: did not receive HSTS header
watertrails.io: could not connect to host
watsonhall.uk: could not connect to host
wave.is: could not connect to host
wavefrontsystemstech.com: could not connect to host
@ -3749,6 +3764,7 @@ web4pro.fr: could not connect to host
webassadors.com: could not connect to host
webdesign-kronberg.de: did not receive HSTS header
webdev.mobi: could not connect to host
webduck.nl: could not connect to host
weberjulia.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]
webhosting4.net: did not receive HSTS header
webm.to: could not connect to host
@ -3799,7 +3815,6 @@ whyworldhot.com: could not connect to host
wienholding.at: max-age too low: 0
wieninternational.at: could not connect to host
wiire.me: could not connect to host
wikileaks.com: could not connect to host
wilf1rst.com: could not connect to host
william.si: did not receive HSTS header
willosagiede.com: did not receive HSTS header
@ -3829,6 +3844,7 @@ wodice.com: could not connect to host
wohnungsbau-ludwigsburg.de: did not receive HSTS header
woima.fi: max-age too low: 604800
wolfesden.com: could not connect to host
womf.org: could not connect to host
womosale.de: could not connect to host
wonderfall.xyz: could not connect to host
wonderhost.info: could not connect to host
@ -3836,6 +3852,8 @@ woording.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
wow-foederation.de: 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
@ -3886,6 +3904,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
xn--3lqp21gwna.xn--fiqs8s: could not connect to host
@ -3951,7 +3970,6 @@ youcontrol.ru: could not connect to host
youngandunited.nl: did not receive HSTS header
yourstrongbox.com: could not connect to host
yout.com: max-age too low: 60000
ys-shop.biz: could not connect to host
yu.gg: did not receive HSTS header
yuan.ga: did not receive HSTS header
yuhen.ru: did not receive HSTS header
@ -3986,6 +4004,7 @@ zera.com.au: could not connect to host
zett4.me: could not connect to host
zeytin.pro: could not connect to host
zh.search.yahoo.com: did not receive HSTS header
zhangruilin.com: could not connect to host
zhaojin97.cn: did not receive HSTS header
zhendingresources.com: max-age too low: 0
zigcore.com.br: could not connect to host

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
0ce009e2303a
5f2db99c258f

View File

@ -279,7 +279,7 @@ async function scheduleFuzzing() {
"/bin/bash",
"-c",
"bin/checkout.sh && " +
"nss/automation/taskcluster/scripts/build_gyp.sh -g -v --fuzz"
"nss/automation/taskcluster/scripts/build_gyp.sh -g -v --fuzz --ubsan"
],
artifacts: {
public: {

View File

@ -13,7 +13,7 @@ show_help() {
cat << EOF
Usage: ${0##*/} [-hcgv] [-j <n>] [--test] [--fuzz] [--scan-build[=output]]
[-m32] [--opt|-o] [--asan] [--ubsan] [--sancov[=edge|bb|func]]
[-m32] [--opt|-o] [--asan] [--ubsan] [--sancov[=edge|bb|func|...]]
[--pprof] [--msan]
This script builds NSS with gyp and ninja.
@ -54,6 +54,7 @@ rebuild_gyp=0
target=Debug
verbose=0
fuzz=0
sancov_default=edge,indirect-calls,8bit-counters
# parse parameters to store in config
params=$(echo "$*" | perl -pe 's/-c|-v|-g|-j [0-9]*|-h//g' | perl -pe 's/^\s*(.*?)\s*$/\1/')
@ -77,11 +78,9 @@ enable_fuzz()
{
fuzz=1
nspr_sanitizer asan
nspr_sanitizer ubsan
nspr_sanitizer sancov edge
nspr_sanitizer sancov $sancov_default
gyp_params+=(-Duse_asan=1)
gyp_params+=(-Duse_ubsan=1)
gyp_params+=(-Duse_sancov=edge)
gyp_params+=(-Duse_sancov=$sancov_default)
# Adding debug symbols even for opt builds.
nspr_opt+=(--enable-debug-symbols)
@ -102,7 +101,7 @@ while [ $# -gt 0 ]; do
-m32|--m32) build_64=0 ;;
--asan) gyp_params+=(-Duse_asan=1); nspr_sanitizer asan ;;
--ubsan) gyp_params+=(-Duse_ubsan=1); nspr_sanitizer ubsan ;;
--sancov) gyp_params+=(-Duse_sancov=edge); nspr_sanitizer sancov edge ;;
--sancov) gyp_params+=(-Duse_sancov=$sancov_default); nspr_sanitizer sancov $sancov_default ;;
--sancov=?*) gyp_params+=(-Duse_sancov="${1#*=}"); nspr_sanitizer sancov "${1#*=}" ;;
--pprof) gyp_params+=(-Duse_pprof=1) ;;
--msan) gyp_params+=(-Duse_msan=1); nspr_sanitizer msan ;;
@ -121,7 +120,6 @@ if [ "$build_64" == "1" ]; then
nspr_opt+=(--enable-64bit)
else
gyp_params+=(-Dtarget_arch=ia32)
nspr_opt+=(--enable-x32)
fi
# clone fuzzing stuff

View File

@ -169,20 +169,6 @@ printSecurityInfo(PRFileDesc *fd)
}
}
void
handshakeCallback(PRFileDesc *fd, void *client_data)
{
const char *secondHandshakeName = (char *)client_data;
if (secondHandshakeName) {
SSL_SetURL(fd, secondHandshakeName);
}
printSecurityInfo(fd);
if (renegotiationsDone < renegotiationsToDo) {
SSL_ReHandshake(fd, (renegotiationsToDo < 2));
++renegotiationsDone;
}
}
static void
PrintUsageHeader(const char *progName)
{
@ -923,13 +909,19 @@ PRUint16 portno = 443;
int override = 0;
char *requestString = NULL;
PRInt32 requestStringLen = 0;
PRBool requestSent = PR_FALSE;
PRBool enableZeroRtt = PR_FALSE;
static int
writeBytesToServer(PRFileDesc *s, PRPollDesc *pollset, const char *buf, int nb)
writeBytesToServer(PRFileDesc *s, const char *buf, int nb)
{
SECStatus rv;
const char *bufp = buf;
PRPollDesc pollDesc;
pollDesc.in_flags = PR_POLL_WRITE | PR_POLL_EXCEPT;
pollDesc.out_flags = 0;
pollDesc.fd = s;
FPRINTF(stderr, "%s: Writing %d bytes to server\n",
progName, nb);
@ -956,12 +948,12 @@ writeBytesToServer(PRFileDesc *s, PRPollDesc *pollset, const char *buf, int nb)
return EXIT_CODE_HANDSHAKE_FAILED;
}
pollset[SSOCK_FD].in_flags = PR_POLL_WRITE | PR_POLL_EXCEPT;
pollset[SSOCK_FD].out_flags = 0;
pollDesc.in_flags = PR_POLL_WRITE | PR_POLL_EXCEPT;
pollDesc.out_flags = 0;
FPRINTF(stderr,
"%s: about to call PR_Poll on writable socket !\n",
progName);
cc = PR_Poll(pollset, 1, PR_INTERVAL_NO_TIMEOUT);
cc = PR_Poll(&pollDesc, 1, PR_INTERVAL_NO_TIMEOUT);
if (cc < 0) {
SECU_PrintError(progName,
"PR_Poll failed");
@ -975,6 +967,36 @@ writeBytesToServer(PRFileDesc *s, PRPollDesc *pollset, const char *buf, int nb)
return 0;
}
void
handshakeCallback(PRFileDesc *fd, void *client_data)
{
const char *secondHandshakeName = (char *)client_data;
if (secondHandshakeName) {
SSL_SetURL(fd, secondHandshakeName);
}
printSecurityInfo(fd);
if (renegotiationsDone < renegotiationsToDo) {
SSL_ReHandshake(fd, (renegotiationsToDo < 2));
++renegotiationsDone;
}
if (requestString && requestSent) {
/* This data was sent in 0-RTT. */
SSLChannelInfo info;
SECStatus rv;
rv = SSL_GetChannelInfo(fd, &info, sizeof(info));
if (rv != SECSuccess)
return;
if (!info.earlyDataAccepted) {
FPRINTF(stderr, "Early data rejected. Re-sending\n");
writeBytesToServer(fd, requestString, requestStringLen);
}
}
}
#define REQUEST_WAITING (requestString && !requestSent)
static int
run_client(void)
{
@ -988,7 +1010,8 @@ run_client(void)
PRFileDesc *std_out;
PRPollDesc pollset[2];
PRBool wrStarted = PR_FALSE;
char *requestStringInt = requestString;
requestSent = PR_FALSE;
/* Create socket */
s = PR_OpenTCPSocket(addr.raw.family);
@ -1245,7 +1268,7 @@ run_client(void)
pollset[SSOCK_FD].in_flags = PR_POLL_EXCEPT |
(clientSpeaksFirst ? 0 : PR_POLL_READ);
pollset[STDIN_FD].fd = PR_GetSpecialFD(PR_StandardInput);
if (!requestStringInt) {
if (!REQUEST_WAITING) {
pollset[STDIN_FD].in_flags = PR_POLL_READ;
npds = 2;
} else {
@ -1295,7 +1318,7 @@ run_client(void)
*/
FPRINTF(stderr, "%s: ready...\n", progName);
while ((pollset[SSOCK_FD].in_flags | pollset[STDIN_FD].in_flags) ||
requestStringInt) {
REQUEST_WAITING) {
char buf[4000]; /* buffer for stdin */
int nb; /* num bytes read from stdin. */
@ -1333,13 +1356,12 @@ run_client(void)
"%s: PR_Poll returned 0x%02x for socket out_flags.\n",
progName, pollset[SSOCK_FD].out_flags);
}
if (requestStringInt) {
error = writeBytesToServer(s, pollset,
requestStringInt, requestStringLen);
if (REQUEST_WAITING) {
error = writeBytesToServer(s, requestString, requestStringLen);
if (error) {
goto done;
}
requestStringInt = NULL;
requestSent = PR_TRUE;
pollset[SSOCK_FD].in_flags = PR_POLL_READ;
}
if (pollset[STDIN_FD].out_flags & PR_POLL_READ) {
@ -1356,7 +1378,7 @@ run_client(void)
/* EOF on stdin, stop polling stdin for read. */
pollset[STDIN_FD].in_flags = 0;
} else {
error = writeBytesToServer(s, pollset, buf, nb);
error = writeBytesToServer(s, buf, nb);
if (error) {
goto done;
}

View File

@ -273,9 +273,17 @@
'cflags': ['-m64'],
'ldflags': ['-m64'],
}],
[ 'use_pprof==1' , {
'ldflags': [ '-lprofiler' ],
}],
],
}],
[ 'use_pprof==1 and OS=="linux"', {
'ldflags': [ '-lprofiler' ],
}],
[ 'use_pprof==1 and OS=="mac"', {
'xcode_settings': {
'OTHER_LDFLAGS': [ '-lprofiler' ],
},
'library_dirs': [
'/usr/local/lib/',
],
}],
[ 'disable_werror==0 and (OS=="linux" or OS=="mac")', {
@ -288,7 +296,7 @@
'-Wno-unused-function',
]
}],
[ 'use_asan==1 or use_ubsan==1', {
[ 'fuzz==1 or use_asan==1 or use_ubsan==1', {
'cflags': ['-O1'],
'xcode_settings': {
'GCC_OPTIMIZATION_LEVEL': '1', # -O1

View File

@ -10,4 +10,3 @@
*/
#error "Do not include this header file."

View File

@ -14,7 +14,7 @@ def main():
if host_arch in ('amd64', 'x86_64'):
host_arch = 'x64'
elif fnmatch.fnmatch(host_arch, 'i?86') or host_arch == 'i86pc':
host_arch = 'x64'
host_arch = 'ia32'
elif host_arch.startswith('arm'):
host_arch = 'arm'
elif host_arch.startswith('mips'):

View File

@ -25,6 +25,7 @@ def main():
try:
v = subprocess.check_output([cc, '-dumpversion'], stderr=sink)
v = v.strip(' \r\n').split('.')
v = list(map(int, v))
if v[0] < 4 or (v[0] == 4 and v[1] < 8):
# gcc 4.8 minimum
return False

View File

@ -0,0 +1,117 @@
/* 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/. */
#include <assert.h>
#include <string.h>
#include <tuple>
#include "FuzzerRandom.h"
#include "asn1_mutators.h"
using namespace std;
static tuple<uint8_t *, size_t> ParseItem(uint8_t *Data, size_t MaxLength) {
// Short form. Bit 8 has value "0" and bits 7-1 give the length.
if ((Data[1] & 0x80) == 0) {
size_t length = min(static_cast<size_t>(Data[1]), MaxLength - 2);
return make_tuple(&Data[2], length);
}
// Constructed, indefinite length. Read until {0x00, 0x00}.
if (Data[1] == 0x80) {
void *offset = memmem(&Data[2], MaxLength - 2, "\0", 2);
size_t length = offset ? (static_cast<uint8_t *>(offset) - &Data[2]) + 2
: MaxLength - 2;
return make_tuple(&Data[2], length);
}
// Long form. Two to 127 octets. Bit 8 of first octet has value "1"
// and bits 7-1 give the number of additional length octets.
size_t octets = min(static_cast<size_t>(Data[1] & 0x7f), MaxLength - 2);
// Handle lengths bigger than 32 bits.
if (octets > 4) {
// Ignore any further children, assign remaining length.
return make_tuple(&Data[2] + octets, MaxLength - 2 - octets);
}
// Parse the length.
size_t length = 0;
for (size_t j = 0; j < octets; j++) {
length = (length << 8) | Data[2 + j];
}
length = min(length, MaxLength - 2 - octets);
return make_tuple(&Data[2] + octets, length);
}
static vector<uint8_t *> ParseItems(uint8_t *Data, size_t Size) {
vector<uint8_t *> items;
vector<size_t> lengths;
// The first item is always the whole corpus.
items.push_back(Data);
lengths.push_back(Size);
// Can't use iterators here because the `items` vector is modified inside the
// loop. That's safe as long as we always check `items.size()` before every
// iteration, and only call `.push_back()` to append new items we found.
// Items are accessed through `items.at()`, we hold no references.
for (size_t i = 0; i < items.size(); i++) {
uint8_t *item = items.at(i);
size_t remaining = lengths.at(i);
// Empty or primitive items have no children.
if (remaining == 0 || (0x20 & item[0]) == 0) {
continue;
}
while (remaining > 2) {
uint8_t *content;
size_t length;
tie(content, length) = ParseItem(item, remaining);
if (length > 0) {
// Record the item.
items.push_back(content);
// Record the length for further parsing.
lengths.push_back(length);
}
// Reduce number of bytes left in current item.
remaining -= length + (content - item);
// Skip the item we just parsed.
item = content + length;
}
}
return items;
}
size_t ASN1MutatorFlipConstructed(uint8_t *Data, size_t Size, size_t MaxSize,
unsigned int Seed) {
fuzzer::Random R(Seed);
auto items = ParseItems(Data, Size);
uint8_t *item = items.at(R(items.size()));
// Flip "constructed" type bit.
item[0] ^= 0x20;
return Size;
}
size_t ASN1MutatorChangeType(uint8_t *Data, size_t Size, size_t MaxSize,
unsigned int Seed) {
fuzzer::Random R(Seed);
auto items = ParseItems(Data, Size);
uint8_t *item = items.at(R(items.size()));
// Change type to a random int [0, 31).
item[0] = R(31);
return Size;
}

View File

@ -0,0 +1,16 @@
/* 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 asn1_mutators_h__
#define asn1_mutators_h__
#include <stdint.h>
#include <cstddef>
size_t ASN1MutatorFlipConstructed(uint8_t *Data, size_t Size, size_t MaxSize,
unsigned int Seed);
size_t ASN1MutatorChangeType(uint8_t *Data, size_t Size, size_t MaxSize,
unsigned int Seed);
#endif // asn1_mutators_h__

View File

@ -1,11 +1,4 @@
#!/bin/sh
cd $(dirname $0)
mkdir tmp/
git clone --no-checkout --depth 1 https://github.com/mozilla/nss-fuzzing-corpus tmp/
(cd tmp && git reset --hard master)
mkdir -p corpus
cp -r tmp/* corpus
rm -Rf tmp/
d=$(dirname $0)
$d/git-copy.sh https://github.com/mozilla/nss-fuzzing-corpus master $d/corpus

View File

@ -1,11 +1,22 @@
#!/bin/sh
cd $(dirname $0)
d=$(dirname $0)
$d/git-copy.sh https://chromium.googlesource.com/chromium/llvm-project/llvm/lib/Fuzzer 1b543d6e5073b56be214394890c9193979a3d7e1 $d/libFuzzer
mkdir tmp/
git clone --no-checkout --depth 1 https://chromium.googlesource.com/chromium/llvm-project/llvm/lib/Fuzzer tmp/
(cd tmp && git reset --hard 1b543d6e5073b56be214394890c9193979a3d7e1)
cat <<EOF | patch -p0 -d $d
diff --git libFuzzer/FuzzerMutate.cpp libFuzzer/FuzzerMutate.cpp
--- libFuzzer/FuzzerMutate.cpp
+++ libFuzzer/FuzzerMutate.cpp
@@ -53,10 +53,9 @@
DefaultMutators.push_back(
{&MutationDispatcher::Mutate_AddWordFromTORC, "CMP"});
mkdir -p libFuzzer
cp tmp/*.cpp tmp/*.h tmp/*.def libFuzzer
rm -Rf tmp/
+ Mutators = DefaultMutators;
if (EF->LLVMFuzzerCustomMutator)
Mutators.push_back({&MutationDispatcher::Mutate_Custom, "Custom"});
- else
- Mutators = DefaultMutators;
if (EF->LLVMFuzzerCustomCrossOver)
Mutators.push_back(
EOF

View File

@ -7,18 +7,68 @@
'../cmd/platlibs.gypi'
],
'targets': [
{
'target_name': 'libFuzzer',
'type': 'static_library',
'sources': [
'libFuzzer/FuzzerCrossOver.cpp',
'libFuzzer/FuzzerDriver.cpp',
'libFuzzer/FuzzerExtFunctionsDlsym.cpp',
'libFuzzer/FuzzerExtFunctionsWeak.cpp',
'libFuzzer/FuzzerIO.cpp',
'libFuzzer/FuzzerLoop.cpp',
'libFuzzer/FuzzerMutate.cpp',
'libFuzzer/FuzzerSHA1.cpp',
'libFuzzer/FuzzerTracePC.cpp',
'libFuzzer/FuzzerTraceState.cpp',
'libFuzzer/FuzzerUtil.cpp',
'libFuzzer/FuzzerUtilDarwin.cpp',
'libFuzzer/FuzzerUtilLinux.cpp',
],
'cflags': [
'-O2',
],
'cflags!': [
'-O1',
],
'cflags/': [
['exclude', '-fsanitize'],
],
'xcode_settings': {
'GCC_OPTIMIZATION_LEVEL': '2', # -O2
'OTHER_CFLAGS/': [
['exclude', '-fsanitize'],
],
},
},
{
'target_name': 'nssfuzz',
'type': 'executable',
'sources': [
'asn1_mutators.cc',
'nssfuzz.cc',
'pkcs8_target.cc',
'quickder_targets.cc',
],
'dependencies': [
'<(DEPTH)/exports.gyp:nss_exports',
'<(DEPTH)/fuzz/libFuzzer/libFuzzer.gyp:libFuzzer'
]
'libFuzzer',
],
'cflags': [
'-O2',
],
'cflags!': [
'-O1',
],
'cflags/': [
['exclude', '-fsanitize-coverage'],
],
'xcode_settings': {
'GCC_OPTIMIZATION_LEVEL': '2', # -O2
'OTHER_CFLAGS/': [
['exclude', '-fsanitize-coverage'],
],
},
}
],
'target_defaults': {

32
security/nss/fuzz/git-copy.sh Executable file
View File

@ -0,0 +1,32 @@
#!/bin/sh
set -e
if [ $# -lt 3 ]; then
echo "Usage: $0 <repo> <branch> <directory>" 1>&2
exit 2
fi
REPO=$1
COMMIT=$2
DIR=$3
echo "Copy '$COMMIT' from '$REPO' to '$DIR'"
if [ -f $DIR/.git-copy ]; then
CURRENT=$(cat $DIR/.git-copy)
if [ $(echo -n $COMMIT | wc -c) != "40" ]; then
ACTUAL=$(git ls-remote $REPO $COMMIT | cut -c 1-40 -)
else
ACTUAL=$COMMIT
fi
if [ CURRENT = ACTUAL ]; then
echo "Up to date."
fi
fi
mkdir -p $DIR
git -C $DIR init -q
git -C $DIR fetch -q --depth=1 $REPO $COMMIT:git-copy-tmp
git -C $DIR reset --hard git-copy-tmp
git -C $DIR show-ref HEAD | cut -c 1-40 - > $DIR/.git-copy
rm -rf $DIR/.git

View File

@ -1,43 +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/.
{
'includes': [
'../../coreconf/config.gypi'
],
'targets': [
{
'target_name': 'libFuzzer',
'type': 'static_library',
'sources': [
'FuzzerCrossOver.cpp',
'FuzzerDriver.cpp',
'FuzzerExtFunctionsDlsym.cpp',
'FuzzerExtFunctionsWeak.cpp',
'FuzzerIO.cpp',
'FuzzerLoop.cpp',
'FuzzerMutate.cpp',
'FuzzerSHA1.cpp',
'FuzzerTracePC.cpp',
'FuzzerTraceState.cpp',
'FuzzerUtil.cpp',
'FuzzerUtilDarwin.cpp',
'FuzzerUtilLinux.cpp',
],
'cflags': [
'-O2',
],
'cflags/': [
['exclude', '-fsanitize='],
['exclude', '-fsanitize-'],
],
'xcode_settings': {
'GCC_OPTIMIZATION_LEVEL': '2', # -O2
'OTHER_CFLAGS/': [
['exclude', '-fsanitize='],
['exclude', '-fsanitize-'],
],
},
}
],
}

View File

@ -6,17 +6,17 @@
#include <iomanip>
#include <iostream>
#include <memory>
#include "keyhi.h"
#include "pk11pub.h"
#include "FuzzerInternal.h"
#include "FuzzerMutate.h"
#include "FuzzerRandom.h"
#include "registry.h"
#include "shared.h"
using namespace std;
static vector<Mutator> gMutators;
class Args {
public:
Args(int argc, char **argv) : args_(argv, argv + argc) {}
@ -127,6 +127,10 @@ int main(int argc, char **argv) {
string targetName(args[1]);
// Add target mutators.
auto mutators = Registry::Mutators(targetName);
gMutators.insert(gMutators.end(), mutators.begin(), mutators.end());
// Remove the target argument when -workers=x or -jobs=y is NOT given.
// If both are given, libFuzzer will spawn multiple processes for the target.
if (!args.Has("-workers=") || !args.Has("-jobs=")) {
@ -146,3 +150,14 @@ int main(int argc, char **argv) {
return fuzzer::FuzzerDriver(&argc, &argv, Registry::Func(targetName));
}
extern "C" size_t LLVMFuzzerCustomMutator(uint8_t *Data, size_t Size,
size_t MaxSize, unsigned int Seed) {
if (gMutators.empty()) {
return 0;
}
// Forward to a pseudorandom mutator.
fuzzer::Random R(Seed);
return gMutators.at(R(gMutators.size()))(Data, Size, MaxSize, Seed);
}

View File

@ -34,4 +34,5 @@ extern "C" int pkcs8_fuzzing_target(const uint8_t *Data, size_t Size) {
return 0;
}
REGISTER_FUZZING_TARGET("pkcs8", pkcs8_fuzzing_target, 2048, "PKCS#8 Import")
REGISTER_FUZZING_TARGET("pkcs8", pkcs8_fuzzing_target, 2048, "PKCS#8 Import",
{})

View File

@ -4,8 +4,8 @@
#include <stdint.h>
#include "asn1_mutators.h"
#include "cert.h"
#include "registry.h"
void QuickDERDecode(void *dst, const SEC_ASN1Template *tpl, const uint8_t *buf,
@ -25,7 +25,8 @@ extern "C" int cert_fuzzing_target(const uint8_t *Data, size_t Size) {
return 0;
}
REGISTER_FUZZING_TARGET("cert", cert_fuzzing_target, 3072, "Certificate Import")
REGISTER_FUZZING_TARGET("cert", cert_fuzzing_target, 3072, "Certificate Import",
{&ASN1MutatorFlipConstructed, &ASN1MutatorChangeType})
extern "C" int spki_fuzzing_target(const uint8_t *Data, size_t Size) {
CERTSubjectPublicKeyInfo spki;
@ -33,4 +34,5 @@ extern "C" int spki_fuzzing_target(const uint8_t *Data, size_t Size) {
return 0;
}
REGISTER_FUZZING_TARGET("spki", spki_fuzzing_target, 1024, "SPKI Import")
REGISTER_FUZZING_TARGET("spki", spki_fuzzing_target, 1024, "SPKI Import",
{&ASN1MutatorFlipConstructed, &ASN1MutatorChangeType})

View File

@ -11,35 +11,45 @@
#include "FuzzerInternal.h"
#include "nss.h"
using namespace fuzzer;
using namespace std;
typedef decltype(LLVMFuzzerCustomMutator)* Mutator;
class Registry {
public:
static void Add(std::string name, fuzzer::UserCallback func, uint16_t max_len,
std::string desc) {
static void Add(string name, UserCallback func, uint16_t max_len, string desc,
vector<Mutator> mutators = {}) {
assert(!Has(name));
GetInstance().targets_[name] = TargetData(func, max_len, desc);
GetInstance().targets_[name] = TargetData(func, max_len, desc, mutators);
}
static bool Has(std::string name) {
static bool Has(string name) {
return GetInstance().targets_.count(name) > 0;
}
static fuzzer::UserCallback Func(std::string name) {
static UserCallback Func(string name) {
assert(Has(name));
return std::get<0>(Get(name));
return get<0>(Get(name));
}
static uint16_t MaxLen(std::string name) {
static uint16_t MaxLen(string name) {
assert(Has(name));
return std::get<1>(Get(name));
return get<1>(Get(name));
}
static std::string& Desc(std::string name) {
static string& Desc(string name) {
assert(Has(name));
return std::get<2>(Get(name));
return get<2>(Get(name));
}
static std::vector<std::string> Names() {
std::vector<std::string> names;
static vector<Mutator>& Mutators(string name) {
assert(Has(name));
return get<3>(Get(name));
}
static vector<string> Names() {
vector<string> names;
for (auto& it : GetInstance().targets_) {
names.push_back(it.first);
}
@ -47,25 +57,23 @@ class Registry {
}
private:
typedef std::tuple<fuzzer::UserCallback, uint16_t, std::string> TargetData;
typedef tuple<UserCallback, uint16_t, string, vector<Mutator>> TargetData;
static Registry& GetInstance() {
static Registry registry;
return registry;
}
static TargetData& Get(std::string name) {
return GetInstance().targets_[name];
}
static TargetData& Get(string name) { return GetInstance().targets_[name]; }
Registry() {}
std::map<std::string, TargetData> targets_;
map<string, TargetData> targets_;
};
#define REGISTER_FUZZING_TARGET(name, func, max_len, desc) \
static void __attribute__((constructor)) Register_##func() { \
Registry::Add(name, func, max_len, desc); \
#define REGISTER_FUZZING_TARGET(name, func, max_len, desc, ...) \
static void __attribute__((constructor)) Register_##func() { \
Registry::Add(name, func, max_len, desc, __VA_ARGS__); \
}
#endif // registry_h__

View File

@ -15,6 +15,7 @@
#include "ssl.h"
#include "sslerr.h"
#include "sslproto.h"
#include "ssl3prot.h"
#include "nsskeys.h"
@ -152,33 +153,66 @@ class TestAgent {
return true;
}
static bool ConvertFromWireVersion(SSLProtocolVariant variant,
int wire_version,
uint16_t* lib_version) {
// These default values are used when {min,max}-version isn't given.
if (wire_version == 0 || wire_version == 0xffff) {
*lib_version = static_cast<uint16_t>(wire_version);
return true;
}
#ifdef TLS_1_3_DRAFT_VERSION
if (wire_version == (0x7f00 | TLS_1_3_DRAFT_VERSION)) {
// N.B. SSL_LIBRARY_VERSION_DTLS_1_3_WIRE == SSL_LIBRARY_VERSION_TLS_1_3
wire_version = SSL_LIBRARY_VERSION_TLS_1_3;
}
#endif
if (variant == ssl_variant_datagram) {
switch (wire_version) {
case SSL_LIBRARY_VERSION_DTLS_1_0_WIRE:
*lib_version = SSL_LIBRARY_VERSION_DTLS_1_0;
break;
case SSL_LIBRARY_VERSION_DTLS_1_2_WIRE:
*lib_version = SSL_LIBRARY_VERSION_DTLS_1_2;
break;
case SSL_LIBRARY_VERSION_DTLS_1_3_WIRE:
*lib_version = SSL_LIBRARY_VERSION_DTLS_1_3;
break;
default:
std::cerr << "Unrecognized DTLS version " << wire_version << ".\n";
return false;
}
} else {
if (wire_version < SSL_LIBRARY_VERSION_3_0 ||
wire_version > SSL_LIBRARY_VERSION_TLS_1_3) {
std::cerr << "Unrecognized TLS version " << wire_version << ".\n";
return false;
}
*lib_version = static_cast<uint16_t>(wire_version);
}
return true;
}
bool GetVersionRange(SSLVersionRange* range_out, SSLProtocolVariant variant) {
SSLVersionRange supported;
if (SSL_VersionRangeGetSupported(variant, &supported) != SECSuccess) {
return false;
}
auto max_allowed = static_cast<uint16_t>(cfg_.get<int>("max-version"));
if (variant == ssl_variant_datagram) {
// For DTLS this is the wire version; adjust if needed.
switch (max_allowed) {
case SSL_LIBRARY_VERSION_DTLS_1_0_WIRE:
max_allowed = SSL_LIBRARY_VERSION_DTLS_1_0;
break;
case SSL_LIBRARY_VERSION_DTLS_1_2_WIRE:
max_allowed = SSL_LIBRARY_VERSION_DTLS_1_2;
break;
case SSL_LIBRARY_VERSION_DTLS_1_3_WIRE:
max_allowed = SSL_LIBRARY_VERSION_DTLS_1_3;
break;
case 0xffff: // No maximum specified.
break;
default:
// Unrecognized DTLS version.
return false;
}
uint16_t min_allowed;
uint16_t max_allowed;
if (!ConvertFromWireVersion(variant, cfg_.get<int>("min-version"),
&min_allowed)) {
return false;
}
if (!ConvertFromWireVersion(variant, cfg_.get<int>("max-version"),
&max_allowed)) {
return false;
}
min_allowed = std::max(min_allowed, supported.min);
max_allowed = std::min(max_allowed, supported.max);
bool found_min = false;
@ -199,7 +233,7 @@ class TestAgent {
}
}
if (version < supported.min) {
if (version < min_allowed) {
continue;
}
if (version > max_allowed) {
@ -220,12 +254,14 @@ class TestAgent {
}
}
if (found_max && allowed) {
// Discontiguous range.
std::cerr << "Discontiguous version range.\n";
return false;
}
}
// Iff found_min is still false, no usable version was found.
if (!found_min) {
std::cerr << "All versions disabled.\n";
}
return found_min;
}
@ -354,6 +390,7 @@ std::unique_ptr<const Config> ReadConfig(int argc, char** argv) {
cfg->AddEntry<int>("resume-count", 0);
cfg->AddEntry<std::string>("key-file", "");
cfg->AddEntry<std::string>("cert-file", "");
cfg->AddEntry<int>("min-version", 0);
cfg->AddEntry<int>("max-version", 0xffff);
for (auto flag : kVersionDisableFlags) {
cfg->AddEntry<bool>(flag, false);

View File

@ -10,8 +10,6 @@
#include "nss.h"
#include "pk11pub.h"
#include "seccomon.h"
#include "ssl.h"
#include "sslimpl.h"
SECStatus SSLInt_IncrementClientHandshakeVersion(PRFileDesc *fd) {
sslSocket *ss = ssl_FindSocket(fd);
@ -313,3 +311,37 @@ SSLKEAType SSLInt_GetKEAType(SSLNamedGroup group) {
return groupDef->keaType;
}
SECStatus SSLInt_SetCipherSpecChangeFunc(PRFileDesc *fd,
sslCipherSpecChangedFunc func,
void *arg) {
sslSocket *ss;
ss = ssl_FindSocket(fd);
if (!ss) {
return SECFailure;
}
ss->ssl3.changedCipherSpecFunc = func;
ss->ssl3.changedCipherSpecArg = arg;
return SECSuccess;
}
static ssl3KeyMaterial *GetKeyingMaterial(PRBool isServer,
ssl3CipherSpec *spec) {
return isServer ? &spec->server : &spec->client;
}
PK11SymKey *SSLInt_CipherSpecToKey(PRBool isServer, ssl3CipherSpec *spec) {
return GetKeyingMaterial(isServer, spec)->write_key;
}
SSLCipherAlgorithm SSLInt_CipherSpecToAlgorithm(PRBool isServer,
ssl3CipherSpec *spec) {
return spec->cipher_def->calg;
}
unsigned char *SSLInt_CipherSpecToIv(PRBool isServer, ssl3CipherSpec *spec) {
return GetKeyingMaterial(isServer, spec)->write_iv;
}

View File

@ -11,6 +11,8 @@
#include "prio.h"
#include "seccomon.h"
#include "ssl.h"
#include "sslimpl.h"
#include "sslt.h"
SECStatus SSLInt_IncrementClientHandshakeVersion(PRFileDesc *fd);
@ -38,4 +40,12 @@ SECStatus SSLInt_AdvanceReadSeqNum(PRFileDesc *fd, PRUint64 to);
SECStatus SSLInt_AdvanceWriteSeqByAWindow(PRFileDesc *fd, PRInt32 extra);
SSLKEAType SSLInt_GetKEAType(SSLNamedGroup group);
SECStatus SSLInt_SetCipherSpecChangeFunc(PRFileDesc *fd,
sslCipherSpecChangedFunc func,
void *arg);
PK11SymKey *SSLInt_CipherSpecToKey(PRBool isServer, ssl3CipherSpec *spec);
SSLCipherAlgorithm SSLInt_CipherSpecToAlgorithm(PRBool isServer,
ssl3CipherSpec *spec);
unsigned char *SSLInt_CipherSpecToIv(PRBool isServer, ssl3CipherSpec *spec);
#endif // ndef libssl_internals_h_

View File

@ -24,6 +24,7 @@ CPPSRCS = \
ssl_ems_unittest.cc \
ssl_exporter_unittest.cc \
ssl_extension_unittest.cc \
ssl_fragment_unittest.cc \
ssl_fuzz_unittest.cc \
ssl_gtest.cc \
ssl_hrr_unittest.cc \
@ -40,6 +41,7 @@ CPPSRCS = \
tls_hkdf_unittest.cc \
tls_filter.cc \
tls_parser.cc \
tls_protect.cc \
$(NULL)
INCLUDES += -I$(CORE_DEPTH)/gtests/google_test/gtest/include \

View File

@ -200,4 +200,82 @@ TEST_P(TlsConnectTls13, TestTls13ZeroRttAlpnChangeBoth) {
CheckAlpn("b");
}
// The client should abort the connection when sending a 0-rtt handshake but
// the servers responds with a TLS 1.2 ServerHello. (no app data sent)
TEST_P(TlsConnectTls13, TestTls13ZeroRttDowngrade) {
ConfigureSessionCache(RESUME_BOTH, RESUME_TICKET);
server_->Set0RttEnabled(true); // set ticket_allow_early_data
Connect();
SendReceive(); // Need to read so that we absorb the session tickets.
CheckKeys();
Reset();
ConfigureSessionCache(RESUME_BOTH, RESUME_TICKET);
client_->SetVersionRange(SSL_LIBRARY_VERSION_TLS_1_2,
SSL_LIBRARY_VERSION_TLS_1_3);
server_->SetVersionRange(SSL_LIBRARY_VERSION_TLS_1_2,
SSL_LIBRARY_VERSION_TLS_1_2);
client_->StartConnect();
server_->StartConnect();
// We will send the early data xtn without sending actual early data. Thus
// a 1.2 server shouldn't fail until the client sends an alert because the
// client sends end_of_early_data only after reading the server's flight.
client_->Set0RttEnabled(true);
client_->Handshake();
server_->Handshake();
ASSERT_TRUE_WAIT(
(client_->error_code() == SSL_ERROR_RX_MALFORMED_SERVER_HELLO), 2000);
// DTLS will timeout as we bump the epoch when installing the early app data
// cipher suite. Thus the encrypted alert will be ignored.
if (mode_ == STREAM) {
// The client sends an encrypted alert message.
ASSERT_TRUE_WAIT(
(server_->error_code() == SSL_ERROR_RX_UNEXPECTED_APPLICATION_DATA),
2000);
}
}
// The client should abort the connection when sending a 0-rtt handshake but
// the servers responds with a TLS 1.2 ServerHello. (with app data)
TEST_P(TlsConnectTls13, TestTls13ZeroRttDowngradeEarlyData) {
ConfigureSessionCache(RESUME_BOTH, RESUME_TICKET);
server_->Set0RttEnabled(true); // set ticket_allow_early_data
Connect();
SendReceive(); // Need to read so that we absorb the session tickets.
CheckKeys();
Reset();
ConfigureSessionCache(RESUME_BOTH, RESUME_TICKET);
client_->SetVersionRange(SSL_LIBRARY_VERSION_TLS_1_2,
SSL_LIBRARY_VERSION_TLS_1_3);
server_->SetVersionRange(SSL_LIBRARY_VERSION_TLS_1_2,
SSL_LIBRARY_VERSION_TLS_1_2);
client_->StartConnect();
server_->StartConnect();
// Send the early data xtn in the CH, followed by early app data. The server
// will fail right after sending its flight, when receiving the early data.
client_->Set0RttEnabled(true);
ZeroRttSendReceive(true, false);
client_->Handshake();
server_->Handshake();
ASSERT_TRUE_WAIT(
(client_->error_code() == SSL_ERROR_RX_MALFORMED_SERVER_HELLO), 2000);
// DTLS will timeout as we bump the epoch when installing the early app data
// cipher suite. Thus the encrypted alert will be ignored.
if (mode_ == STREAM) {
// The server sends an alert when receiving the early app data record.
ASSERT_TRUE_WAIT(
(server_->error_code() == SSL_ERROR_RX_UNEXPECTED_APPLICATION_DATA),
2000);
}
}
} // namespace nss_test

View File

@ -289,7 +289,7 @@ class BeforeFinished : public TlsRecordFilter {
state_(BEFORE_CCS) {}
protected:
virtual PacketFilter::Action FilterRecord(const RecordHeader& header,
virtual PacketFilter::Action FilterRecord(const TlsRecordHeader& header,
const DataBuffer& body,
DataBuffer* out) {
switch (state_) {
@ -507,7 +507,7 @@ TEST_P(TlsConnectGenericPre13, AuthCompleteDelayed) {
EXPECT_EQ(TlsAgent::STATE_CONNECTED, server_->state());
// Remove this before closing or the close_notify alert will trigger it.
client_->SetPacketFilter(nullptr);
client_->DeletePacketFilter();
}
// TLS 1.3 handles a delayed AuthComplete callback differently since the
@ -528,7 +528,7 @@ TEST_P(TlsConnectTls13, AuthCompleteDelayed) {
EXPECT_EQ(TlsAgent::STATE_CONNECTING, client_->state());
// This should allow the handshake to complete now.
client_->SetPacketFilter(nullptr);
client_->DeletePacketFilter();
EXPECT_EQ(SECSuccess, SSL_AuthCertificateComplete(client_->ssl_fd(), 0));
client_->Handshake(); // Send Finished
server_->Handshake(); // Transition to connected and send NewSessionTicket

View File

@ -0,0 +1,157 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "secerr.h"
#include "ssl.h"
#include "sslerr.h"
#include "sslproto.h"
#include "gtest_utils.h"
#include "scoped_ptrs.h"
#include "tls_connect.h"
#include "tls_filter.h"
#include "tls_parser.h"
namespace nss_test {
// This class cuts every unencrypted handshake record into two parts.
class RecordFragmenter : public PacketFilter {
public:
RecordFragmenter() : sequence_number_(0), splitting_(true) {}
private:
class HandshakeSplitter {
public:
HandshakeSplitter(const DataBuffer& input, DataBuffer* output,
uint64_t* sequence_number)
: input_(input),
output_(output),
cursor_(0),
sequence_number_(sequence_number) {}
private:
void WriteRecord(TlsRecordHeader& record_header,
DataBuffer& record_fragment) {
TlsRecordHeader fragment_header(record_header.version(),
record_header.content_type(),
*sequence_number_);
++*sequence_number_;
if (::g_ssl_gtest_verbose) {
std::cerr << "Fragment: " << fragment_header << ' ' << record_fragment
<< std::endl;
}
cursor_ = fragment_header.Write(output_, cursor_, record_fragment);
}
bool SplitRecord(TlsRecordHeader& record_header, DataBuffer& record) {
TlsParser parser(record);
while (parser.remaining()) {
TlsHandshakeFilter::HandshakeHeader handshake_header;
DataBuffer handshake_body;
if (!handshake_header.Parse(&parser, record_header, &handshake_body)) {
ADD_FAILURE() << "couldn't parse handshake header";
return false;
}
DataBuffer record_fragment;
// We can't fragment handshake records that are too small.
if (handshake_body.len() < 2) {
handshake_header.Write(&record_fragment, 0U, handshake_body);
WriteRecord(record_header, record_fragment);
continue;
}
size_t cut = handshake_body.len() / 2;
handshake_header.WriteFragment(&record_fragment, 0U, handshake_body, 0U,
cut);
WriteRecord(record_header, record_fragment);
handshake_header.WriteFragment(&record_fragment, 0U, handshake_body,
cut, handshake_body.len() - cut);
WriteRecord(record_header, record_fragment);
}
return true;
}
public:
bool Split() {
TlsParser parser(input_);
while (parser.remaining()) {
TlsRecordHeader header;
DataBuffer record;
if (!header.Parse(&parser, &record)) {
ADD_FAILURE() << "bad record header";
return false;
}
if (::g_ssl_gtest_verbose) {
std::cerr << "Record: " << header << ' ' << record << std::endl;
}
// Don't touch packets from a non-zero epoch. Leave these unmodified.
if ((header.sequence_number() >> 48) != 0ULL) {
cursor_ = header.Write(output_, cursor_, record);
continue;
}
// Just rewrite the sequence number (CCS only).
if (header.content_type() != kTlsHandshakeType) {
EXPECT_EQ(kTlsChangeCipherSpecType, header.content_type());
WriteRecord(header, record);
continue;
}
if (!SplitRecord(header, record)) {
return false;
}
}
return true;
}
private:
const DataBuffer& input_;
DataBuffer* output_;
size_t cursor_;
uint64_t* sequence_number_;
};
protected:
virtual PacketFilter::Action Filter(const DataBuffer& input,
DataBuffer* output) override {
if (!splitting_) {
return KEEP;
}
output->Allocate(input.len());
HandshakeSplitter splitter(input, output, &sequence_number_);
if (!splitter.Split()) {
// If splitting fails, we obviously reached encrypted packets.
// Stop splitting from that point onward.
splitting_ = false;
return KEEP;
}
return CHANGE;
}
private:
uint64_t sequence_number_;
bool splitting_;
};
TEST_P(TlsConnectDatagram, FragmentClientPackets) {
client_->SetPacketFilter(new RecordFragmenter());
Connect();
SendReceive();
}
TEST_P(TlsConnectDatagram, FragmentServerPackets) {
server_->SetPacketFilter(new RecordFragmenter());
Connect();
SendReceive();
}
} // namespace nss_test

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