mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 11:25:00 +00:00
Merge m-c to autoland, a=merge
This commit is contained in:
commit
1dd5ea0353
File diff suppressed because it is too large
Load Diff
@ -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");
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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.");
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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():
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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}}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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',
|
||||
|
@ -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',
|
||||
)
|
@ -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);
|
@ -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.
|
||||
*
|
||||
|
@ -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);
|
||||
},
|
||||
|
@ -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">
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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]
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
|
@ -79,7 +79,7 @@ public:
|
||||
ReadFileContent(aBlob, EmptyString(), FILE_AS_DATAURL, aRv);
|
||||
}
|
||||
|
||||
void Abort(ErrorResult& aRv);
|
||||
void Abort();
|
||||
|
||||
uint16_t ReadyState() const
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -21,7 +21,6 @@ interface FileReader : EventTarget {
|
||||
[Throws]
|
||||
void readAsDataURL(Blob blob);
|
||||
|
||||
[Throws]
|
||||
void abort();
|
||||
|
||||
// states
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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'],
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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 */
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
}
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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
@ -1 +1 @@
|
||||
0ce009e2303a
|
||||
5f2db99c258f
|
||||
|
@ -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: {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -10,4 +10,3 @@
|
||||
*/
|
||||
|
||||
#error "Do not include this header 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'):
|
||||
|
@ -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
|
||||
|
117
security/nss/fuzz/asn1_mutators.cc
Normal file
117
security/nss/fuzz/asn1_mutators.cc
Normal 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;
|
||||
}
|
16
security/nss/fuzz/asn1_mutators.h
Normal file
16
security/nss/fuzz/asn1_mutators.h
Normal 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__
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
32
security/nss/fuzz/git-copy.sh
Executable 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
|
@ -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-'],
|
||||
],
|
||||
},
|
||||
}
|
||||
],
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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",
|
||||
{})
|
||||
|
@ -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})
|
||||
|
@ -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__
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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_
|
||||
|
@ -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 \
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
157
security/nss/gtests/ssl_gtest/ssl_fragment_unittest.cc
Normal file
157
security/nss/gtests/ssl_gtest/ssl_fragment_unittest.cc
Normal 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
Loading…
Reference in New Issue
Block a user