Merge m-c to autoland, a=merge

MozReview-Commit-ID: CtdOO1SeODv
This commit is contained in:
Wes Kocher 2017-03-16 14:07:44 -07:00
commit 1b3ffba4d5
89 changed files with 18157 additions and 17132 deletions

View File

@ -151,30 +151,48 @@ button {
flex-direction: row;
}
.addons-install-error {
background-color: #f3b0b0;
.addons-install-error,
.service-worker-multi-process {
padding: 5px 10px;
margin-top: 5px;
margin-inline-end: 4px;
}
.service-worker-disabled .warning,
.addons-install-error .warning {
.addons-install-error {
background-color: #f3b0b0;
}
.service-worker-multi-process {
background-color: #ffeebb;
line-height: 1.5em;
}
.service-worker-multi-process .update-button {
margin: 5px 0;
}
.warning {
background-image: url(chrome://devtools/skin/images/alerticon-warning.png);
background-size: 13px 12px;
margin-inline-end: 10px;
display: inline-block;
width: 13px;
height: 12px;
margin-inline-end: 10px;
}
@media (min-resolution: 1.1dppx) {
.service-worker-disabled .warning,
.addons-install-error .warning {
.warning {
background-image: url(chrome://devtools/skin/images/alerticon-warning@2x.png);
}
}
.addons-install-error .warning,
.service-worker-multi-process .warning {
/* The warning icon can be hard to see on red / yellow backgrounds, this turns the icon
to a black icon. */
filter: brightness(0%);
}
.addons-options {
flex: 1;
}

View File

@ -3,6 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
DevToolsModules(
'multi-e10s-warning.js',
'panel.js',
'service-worker-target.js',
'target.js',

View File

@ -0,0 +1,60 @@
/* 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/. */
/* eslint-env browser */
"use strict";
loader.lazyImporter(this, "PrivateBrowsingUtils",
"resource://gre/modules/PrivateBrowsingUtils.jsm");
const { createClass, DOM: dom } =
require("devtools/client/shared/vendor/react");
const Services = require("Services");
const { Ci } = require("chrome");
loader.lazyImporter(this, "PrivateBrowsingUtils",
"resource://gre/modules/PrivateBrowsingUtils.jsm");
loader.lazyRequireGetter(this, "DebuggerClient",
"devtools/shared/client/main", true);
const Strings = Services.strings.createBundle("chrome://devtools/locale/aboutdebugging.properties");
const PROCESS_COUNT_PREF = "dom.ipc.processCount";
module.exports = createClass({
displayName: "multiE10SWarning",
onUpdatePreferenceClick() {
let message = Strings.GetStringFromName("multiProcessWarningConfirmUpdate");
if (window.confirm(message)) {
Services.prefs.setIntPref(PROCESS_COUNT_PREF, 1);
// Restart the browser.
Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart);
}
},
render() {
return dom.div(
{
className: "service-worker-multi-process"
},
dom.div(
{},
dom.div({ className: "warning" }),
dom.b({}, Strings.GetStringFromName("multiProcessWarningTitle"))
),
dom.div(
{},
Strings.GetStringFromName("multiProcessWarningMessage")
),
dom.button(
{
className: "update-button",
onClick: this.onUpdatePreferenceClick,
},
Strings.GetStringFromName("multiProcessWarningUpdateLink")
)
);
},
});

View File

@ -16,6 +16,7 @@ const Services = require("Services");
const PanelHeader = createFactory(require("../panel-header"));
const TargetList = createFactory(require("../target-list"));
const WorkerTarget = createFactory(require("./target"));
const MultiE10SWarning = createFactory(require("./multi-e10s-warning"));
const ServiceWorkerTarget = createFactory(require("./service-worker-target"));
loader.lazyImporter(this, "PrivateBrowsingUtils",
@ -29,6 +30,7 @@ const Strings = Services.strings.createBundle(
const WorkerIcon = "chrome://devtools/skin/images/debugging-workers.svg";
const MORE_INFO_URL = "https://developer.mozilla.org/en-US/docs/Tools/about%3Adebugging";
const PROCESS_COUNT_PREF = "dom.ipc.processCount";
module.exports = createClass({
displayName: "WorkersPanel",
@ -44,29 +46,40 @@ module.exports = createClass({
service: [],
shared: [],
other: []
}
},
processCount: 1,
};
},
componentDidMount() {
let client = this.props.client;
client.addListener("workerListChanged", this.update);
client.addListener("serviceWorkerRegistrationListChanged", this.update);
client.addListener("processListChanged", this.update);
client.addListener("registration-changed", this.update);
client.addListener("workerListChanged", this.updateWorkers);
client.addListener("serviceWorkerRegistrationListChanged", this.updateWorkers);
client.addListener("processListChanged", this.updateWorkers);
client.addListener("registration-changed", this.updateWorkers);
this.update();
Services.prefs.addObserver(PROCESS_COUNT_PREF, this.updateMultiE10S, false);
this.updateMultiE10S();
this.updateWorkers();
},
componentWillUnmount() {
let client = this.props.client;
client.removeListener("processListChanged", this.update);
client.removeListener("serviceWorkerRegistrationListChanged", this.update);
client.removeListener("workerListChanged", this.update);
client.removeListener("registration-changed", this.update);
client.removeListener("processListChanged", this.updateWorkers);
client.removeListener("serviceWorkerRegistrationListChanged", this.updateWorkers);
client.removeListener("workerListChanged", this.updateWorkers);
client.removeListener("registration-changed", this.updateWorkers);
Services.prefs.removeObserver(PROCESS_COUNT_PREF, this.updateMultiE10S);
},
update() {
updateMultiE10S() {
let processCount = Services.prefs.getIntPref(PROCESS_COUNT_PREF);
this.setState({ processCount });
},
updateWorkers() {
let workers = this.getInitialState().workers;
getWorkerForms(this.props.client).then(forms => {
@ -136,61 +149,89 @@ module.exports = createClass({
return null;
},
render() {
let { client, id } = this.props;
let { workers } = this.state;
isE10S() {
return Services.appinfo.browserTabsRemoteAutostart;
},
renderServiceWorkersError() {
let isWindowPrivate = PrivateBrowsingUtils.isContentWindowPrivate(window);
let isPrivateBrowsingMode = PrivateBrowsingUtils.permanentPrivateBrowsing;
let isServiceWorkerDisabled = !Services.prefs
.getBoolPref("dom.serviceWorkers.enabled");
let errorMsg = isWindowPrivate || isPrivateBrowsingMode ||
isServiceWorkerDisabled ?
dom.p({ className: "service-worker-disabled" },
dom.div({ className: "warning" }),
Strings.GetStringFromName("configurationIsNotCompatible"),
" (",
dom.a({ href: MORE_INFO_URL, target: "_blank" },
Strings.GetStringFromName("moreInfo")),
")"
) : "";
return dom.div({
id: id + "-panel",
className: "panel",
role: "tabpanel",
"aria-labelledby": id + "-header"
},
PanelHeader({
id: id + "-header",
name: Strings.GetStringFromName("workers")
}),
dom.div({ id: "workers", className: "inverted-icons" },
TargetList({
client,
error: errorMsg,
id: "service-workers",
name: Strings.GetStringFromName("serviceWorkers"),
sort: true,
targetClass: ServiceWorkerTarget,
targets: workers.service
let isDisabled = isWindowPrivate || isPrivateBrowsingMode || isServiceWorkerDisabled;
if (!isDisabled) {
return "";
}
return dom.p(
{
className: "service-worker-disabled"
},
dom.div({ className: "warning" }),
Strings.GetStringFromName("configurationIsNotCompatible"),
" (",
dom.a(
{
href: MORE_INFO_URL,
target: "_blank"
},
Strings.GetStringFromName("moreInfo")
),
")"
);
},
render() {
let { client, id } = this.props;
let { workers, processCount } = this.state;
let isE10S = Services.appinfo.browserTabsRemoteAutostart;
let isMultiE10S = isE10S && processCount > 1;
return dom.div(
{
id: id + "-panel",
className: "panel",
role: "tabpanel",
"aria-labelledby": id + "-header"
},
PanelHeader({
id: id + "-header",
name: Strings.GetStringFromName("workers")
}),
TargetList({
client,
id: "shared-workers",
name: Strings.GetStringFromName("sharedWorkers"),
sort: true,
targetClass: WorkerTarget,
targets: workers.shared
}),
TargetList({
client,
id: "other-workers",
name: Strings.GetStringFromName("otherWorkers"),
sort: true,
targetClass: WorkerTarget,
targets: workers.other
})
));
isMultiE10S ? MultiE10SWarning() : "",
dom.div(
{
id: "workers",
className: "inverted-icons"
},
TargetList({
client,
debugDisabled: isMultiE10S,
error: this.renderServiceWorkersError(),
id: "service-workers",
name: Strings.GetStringFromName("serviceWorkers"),
sort: true,
targetClass: ServiceWorkerTarget,
targets: workers.service
}),
TargetList({
client,
id: "shared-workers",
name: Strings.GetStringFromName("sharedWorkers"),
sort: true,
targetClass: WorkerTarget,
targets: workers.shared
}),
TargetList({
client,
id: "other-workers",
name: Strings.GetStringFromName("otherWorkers"),
sort: true,
targetClass: WorkerTarget,
targets: workers.other
})
)
);
}
});

View File

@ -155,7 +155,8 @@ module.exports = createClass({
renderButtons() {
let pushButton = dom.button({
className: "push-button",
onClick: this.push
onClick: this.push,
disabled: this.props.debugDisabled
}, Strings.GetStringFromName("push"));
let debugButton = dom.button({
@ -167,6 +168,7 @@ module.exports = createClass({
let startButton = dom.button({
className: "start-button",
onClick: this.start,
disabled: this.props.debugDisabled
}, Strings.GetStringFromName("start"));
if (this.isRunning()) {
@ -187,7 +189,7 @@ module.exports = createClass({
return dom.a({
onClick: this.unregister,
className: "unregister-link"
className: "unregister-link",
}, Strings.GetStringFromName("unregister"));
},

View File

@ -35,6 +35,8 @@ tags = webextensions
[browser_page_not_found.js]
[browser_service_workers.js]
[browser_service_workers_fetch_flag.js]
[browser_service_workers_multi_content_process.js]
skip-if = !e10s # This test is only valid in e10s
[browser_service_workers_not_compatible.js]
[browser_service_workers_push.js]
[browser_service_workers_push_service.js]

View File

@ -9,13 +9,7 @@ const SERVICE_WORKER = URL_ROOT + "service-workers/empty-sw.js";
const TAB_URL = URL_ROOT + "service-workers/empty-sw.html";
add_task(function* () {
yield new Promise(done => {
let options = {"set": [
["dom.serviceWorkers.enabled", true],
["dom.serviceWorkers.testing.enabled", true],
]};
SpecialPowers.pushPrefEnv(options, done);
});
yield enableServiceWorkerDebugging();
let { tab, document } = yield openAboutDebugging("workers");

View File

@ -9,14 +9,7 @@ const EMPTY_SW_TAB_URL = URL_ROOT + "service-workers/empty-sw.html";
const FETCH_SW_TAB_URL = URL_ROOT + "service-workers/fetch-sw.html";
function* testBody(url, expecting) {
yield new Promise(done => {
let options = {"set": [
["dom.serviceWorkers.enabled", true],
["dom.serviceWorkers.testing.enabled", true],
]};
SpecialPowers.pushPrefEnv(options, done);
});
yield enableServiceWorkerDebugging();
let { tab, document } = yield openAboutDebugging("workers");
let swTab = yield addTab(url);

View File

@ -0,0 +1,61 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Service worker debugging is unavailable when multi-e10s is enabled.
// Check that the appropriate warning panel is displayed when there are more than 1
// content process available.
const SERVICE_WORKER = URL_ROOT + "service-workers/empty-sw.js";
const TAB_URL = URL_ROOT + "service-workers/empty-sw.html";
add_task(function* () {
yield enableServiceWorkerDebugging();
info("Force two content processes");
yield pushPref("dom.ipc.processCount", 2);
let { tab, document } = yield openAboutDebugging("workers");
let warningSection = document.querySelector(".service-worker-multi-process");
let img = warningSection.querySelector(".warning");
ok(img, "warning message is rendered");
let swTab = yield addTab(TAB_URL, { background: true });
let serviceWorkersElement = getServiceWorkerList(document);
yield waitForMutation(serviceWorkersElement, { childList: true });
info("Check that service worker buttons are disabled.");
// Check that the service worker appears in the UI
let serviceWorkerContainer = getServiceWorkerContainer(SERVICE_WORKER, document);
let debugButton = serviceWorkerContainer.querySelector(".debug-button");
ok(debugButton.disabled, "Start/Debug button is disabled");
info("Update the preference to 1");
let onWarningCleared = waitUntil(() => {
return document.querySelector(".service-worker-multi-process");
});
yield pushPref("dom.ipc.processCount", 1);
yield onWarningCleared;
ok(!debugButton.disabled, "Debug button is enabled.");
info("Update the preference back to 2");
let onWarningRestored = waitUntil(() => {
return document.querySelector(".service-worker-multi-process");
});
yield pushPref("dom.ipc.processCount", 2);
yield onWarningRestored;
ok(debugButton.disabled, "Debug button is disabled again.");
info("Unregister service worker");
try {
yield unregisterServiceWorker(swTab, serviceWorkersElement);
ok(true, "Service worker registration unregistered");
} catch (e) {
ok(false, "SW not unregistered; " + e);
}
yield removeTab(swTab);
yield closeAboutDebugging(tab);
});

View File

@ -15,15 +15,7 @@ const SERVICE_WORKER = URL_ROOT + "service-workers/push-sw.js";
const TAB_URL = URL_ROOT + "service-workers/push-sw.html";
add_task(function* () {
info("Turn on workers via mochitest http.");
yield new Promise(done => {
let options = { "set": [
// Accept workers from mochitest's http.
["dom.serviceWorkers.testing.enabled", true],
]};
SpecialPowers.pushPrefEnv(options, done);
});
yield enableServiceWorkerDebugging();
let { tab, document } = yield openAboutDebugging("workers");
// Listen for mutations in the service-workers list.

View File

@ -18,14 +18,9 @@ const PushService = Cc["@mozilla.org/push/Service;1"]
add_task(function* () {
info("Turn on workers via mochitest http.");
yield SpecialPowers.pushPrefEnv({
"set": [
// Accept workers from mochitest's http.
["dom.serviceWorkers.testing.enabled", true],
// Enable the push service.
["dom.push.connection.enabled", true],
]
});
yield enableServiceWorkerDebugging();
// Enable the push service.
yield pushPref("dom.push.connection.enabled", true);
info("Mock the push service");
PushService.service = {

View File

@ -15,17 +15,9 @@ const TAB_URL = URL_ROOT + "service-workers/empty-sw.html";
const SW_TIMEOUT = 1000;
add_task(function* () {
info("Turn on workers via mochitest http.");
yield new Promise(done => {
let options = { "set": [
// Accept workers from mochitest's http.
["dom.serviceWorkers.testing.enabled", true],
// Reduce the timeout to accelerate service worker freezing
["dom.serviceWorkers.idle_timeout", SW_TIMEOUT],
["dom.serviceWorkers.idle_extended_timeout", SW_TIMEOUT],
]};
SpecialPowers.pushPrefEnv(options, done);
});
yield enableServiceWorkerDebugging();
yield pushPref("dom.serviceWorkers.idle_timeout", SW_TIMEOUT);
yield pushPref("dom.serviceWorkers.idle_extended_timeout", SW_TIMEOUT);
let { tab, document } = yield openAboutDebugging("workers");

View File

@ -12,15 +12,9 @@ const SW_TIMEOUT = 2000;
requestLongerTimeout(2);
add_task(function* () {
yield SpecialPowers.pushPrefEnv({
"set": [
// Accept workers from mochitest's http.
["dom.serviceWorkers.testing.enabled", true],
["dom.serviceWorkers.idle_timeout", SW_TIMEOUT],
["dom.serviceWorkers.idle_extended_timeout", SW_TIMEOUT],
["dom.ipc.processCount", 1],
]
});
yield enableServiceWorkerDebugging();
yield pushPref("dom.serviceWorkers.idle_timeout", SW_TIMEOUT);
yield pushPref("dom.serviceWorkers.idle_extended_timeout", SW_TIMEOUT);
let { tab, document } = yield openAboutDebugging("workers");

View File

@ -11,17 +11,9 @@ const TAB_URL = URL_ROOT + "service-workers/empty-sw.html";
const SW_TIMEOUT = 1000;
add_task(function* () {
yield new Promise(done => {
let options = {"set": [
// Accept workers from mochitest's http
["dom.serviceWorkers.testing.enabled", true],
// Reduce the timeout to expose issues when service worker
// freezing is broken
["dom.serviceWorkers.idle_timeout", SW_TIMEOUT],
["dom.serviceWorkers.idle_extended_timeout", SW_TIMEOUT],
]};
SpecialPowers.pushPrefEnv(options, done);
});
yield enableServiceWorkerDebugging();
yield pushPref("dom.serviceWorkers.idle_timeout", SW_TIMEOUT);
yield pushPref("dom.serviceWorkers.idle_extended_timeout", SW_TIMEOUT);
let { tab, document } = yield openAboutDebugging("workers");

View File

@ -15,15 +15,7 @@ const SERVICE_WORKER = SCOPE + "empty-sw.js";
const TAB_URL = SCOPE + "empty-sw.html";
add_task(function* () {
info("Turn on workers via mochitest http.");
yield new Promise(done => {
let options = { "set": [
// Accept workers from mochitest's http.
["dom.serviceWorkers.testing.enabled", true],
["dom.ipc.processCount", 1],
]};
SpecialPowers.pushPrefEnv(options, done);
});
yield enableServiceWorkerDebugging();
let { tab, document } = yield openAboutDebugging("workers");

View File

@ -7,7 +7,8 @@
getServiceWorkerList, getTabList, openPanel, waitForInitialAddonList,
waitForServiceWorkerRegistered, unregisterServiceWorker,
waitForDelayedStartupFinished, setupTestAboutDebuggingWebExtension,
waitForServiceWorkerActivation */
waitForServiceWorkerActivation, enableServiceWorkerDebugging,
getServiceWorkerContainer */
/* import-globals-from ../../framework/test/shared-head.js */
"use strict";
@ -131,6 +132,26 @@ function getServiceWorkerList(document) {
document.querySelector("#service-workers.targets");
}
/**
* Retrieve the container element for the service worker corresponding to the provided
* name.
*
* @param {String} name
* expected service worker name
* @param {DOMDocument} document
* #service-workers section container document
* @return {DOMNode} container element
*/
function getServiceWorkerContainer(name, document) {
let nameElements = [...document.querySelectorAll("#service-workers .target-name")];
let nameElement = nameElements.filter(element => element.textContent === name)[0];
if (nameElement) {
return nameElement.closest(".target-container");
}
return null;
}
/**
* Depending on whether there are tabs opened, return either a
* target list element or its container.
@ -397,3 +418,20 @@ function* waitForServiceWorkerActivation(swUrl, document) {
yield waitForMutation(serviceWorkersElement, { childList: true, subtree: true });
}
}
/**
* Set all preferences needed to enable service worker debugging and testing.
*/
function enableServiceWorkerDebugging() {
return new Promise(done => {
let options = { "set": [
// Enable service workers.
["dom.serviceWorkers.enabled", true],
// Accept workers from mochitest's http.
["dom.serviceWorkers.testing.enabled", true],
// Force single content process.
["dom.ipc.processCount", 1],
]};
SpecialPowers.pushPrefEnv(options, done);
});
}

View File

@ -119,3 +119,23 @@ doesNotExist = #%S does not exist!
nothing = Nothing yet.
configurationIsNotCompatible = Your browser configuration is not compatible with Service Workers
# LOCALIZATION NOTE (multiProcessWarningTitle):
# This string is displayed as a warning message on top of the about:debugging#workers
# page when multi-e10s is enabled
multiProcessWarningTitle = Service Worker debugging is not compatible with multiple content processes at the moment.
# LOCALIZATION NOTE (multiProcessWarningMessage):
# This string is displayed in the warning section for multi-e10s in
# about:debugging#workers
multiProcessWarningMessage = The preference “dom.ipc.processCount” can be set to 1 to force a single content process.
# LOCALIZATION NOTE (multiProcessWarningLink):
# This string is the text content of a link in the warning section for multi-e10s in
# about:debugging#workers. The link updates the pref and restarts the browser.
multiProcessWarningUpdateLink = Set dom.ipc.processCount to 1
# LOCALIZATION NOTE (multiProcessWarningConfirmUpdate):
# This string is displayed as a confirmation message when the user clicks on
# the multiProcessWarningUpdateLink in about:debugging#workers
multiProcessWarningConfirmUpdate = Set “dom.ipc.processCount” to 1 and restart the browser?

View File

@ -42,6 +42,7 @@
#include "mozilla/dom/DocumentFragment.h"
#include "mozilla/dom/DOMTypes.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/FileSystemSecurity.h"
#include "mozilla/dom/FileBlobImpl.h"
#include "mozilla/dom/HTMLMediaElement.h"
#include "mozilla/dom/HTMLTemplateElement.h"
@ -7885,6 +7886,19 @@ nsContentUtils::TransferableToIPCTransferable(nsITransferable* aTransferable,
continue;
}
if (aParent) {
bool isDir = false;
if (NS_SUCCEEDED(file->IsDirectory(&isDir)) && isDir) {
nsAutoString path;
if (NS_WARN_IF(NS_FAILED(file->GetPath(path)))) {
continue;
}
RefPtr<FileSystemSecurity> fss = FileSystemSecurity::GetOrCreate();
fss->GrantAccessToContentProcess(aParent->ChildID(), path);
}
}
blobImpl = new FileBlobImpl(file);
IgnoredErrorResult rv;

View File

@ -10,8 +10,12 @@
#include "GetDirectoryListingTask.h"
#include "GetFileOrDirectoryTask.h"
#include "mozilla/dom/ContentParent.h"
#include "mozilla/dom/FileSystemBase.h"
#include "mozilla/dom/FileSystemSecurity.h"
#include "mozilla/ipc/BackgroundParent.h"
#include "mozilla/Unused.h"
#include "nsProxyRelease.h"
using namespace mozilla::ipc;
@ -69,14 +73,104 @@ FileSystemRequestParent::Initialize(const FileSystemParams& aParams)
return true;
}
namespace {
class CheckPermissionRunnable final : public Runnable
{
public:
CheckPermissionRunnable(already_AddRefed<ContentParent> aParent,
FileSystemRequestParent* aActor,
FileSystemTaskParentBase* aTask,
const nsAString& aPath)
: mContentParent(aParent)
, mActor(aActor)
, mTask(aTask)
, mPath(aPath)
, mBackgroundEventTarget(NS_GetCurrentThread())
{
AssertIsInMainProcess();
AssertIsOnBackgroundThread();
MOZ_ASSERT(mContentParent);
MOZ_ASSERT(mActor);
MOZ_ASSERT(mTask);
MOZ_ASSERT(mBackgroundEventTarget);
}
NS_IMETHOD
Run() override
{
if (NS_IsMainThread()) {
auto raii = mozilla::MakeScopeExit([&] { mContentParent = nullptr; });
if (!mozilla::Preferences::GetBool("dom.filesystem.pathcheck.disabled", false)) {
RefPtr<FileSystemSecurity> fss = FileSystemSecurity::Get();
if (NS_WARN_IF(!fss ||
!fss->ContentProcessHasAccessTo(mContentParent->ChildID(),
mPath))) {
mContentParent->KillHard("This path is not allowed.");
return NS_OK;
}
}
return mBackgroundEventTarget->Dispatch(this, NS_DISPATCH_NORMAL);
}
AssertIsOnBackgroundThread();
// It can happen that this actor has been destroyed in the meantime we were
// on the main-thread.
if (!mActor->Destroyed()) {
mTask->Start();
}
return NS_OK;
}
private:
~CheckPermissionRunnable()
{
NS_ProxyRelease(mBackgroundEventTarget, mActor.forget());
}
RefPtr<ContentParent> mContentParent;
RefPtr<FileSystemRequestParent> mActor;
RefPtr<FileSystemTaskParentBase> mTask;
const nsString mPath;
nsCOMPtr<nsIEventTarget> mBackgroundEventTarget;
};
} // anonymous
void
FileSystemRequestParent::Start()
{
AssertIsInMainProcess();
AssertIsOnBackgroundThread();
MOZ_ASSERT(!mDestroyed);
MOZ_ASSERT(mFileSystem);
MOZ_ASSERT(mTask);
mTask->Start();
nsAutoString path;
if (NS_WARN_IF(NS_FAILED(mTask->GetTargetPath(path)))) {
Unused << Send__delete__(this, FileSystemErrorResponse(NS_ERROR_DOM_SECURITY_ERR));
return;
}
RefPtr<ContentParent> parent = BackgroundParent::GetContentParent(Manager());
// If the ContentParent is null we are dealing with a same-process actor.
if (!parent) {
mTask->Start();
return;
}
RefPtr<Runnable> runnable =
new CheckPermissionRunnable(parent.forget(), this, mTask, path);
NS_DispatchToMainThread(runnable);
}
void

View File

@ -0,0 +1,107 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=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 "FileSystemSecurity.h"
#include "FileSystemUtils.h"
#include "mozilla/ClearOnShutdown.h"
#include "mozilla/StaticPtr.h"
namespace mozilla {
namespace dom {
namespace {
StaticRefPtr<FileSystemSecurity> gFileSystemSecurity;
} // anonymous
/* static */ already_AddRefed<FileSystemSecurity>
FileSystemSecurity::Get()
{
MOZ_ASSERT(NS_IsMainThread());
AssertIsInMainProcess();
RefPtr<FileSystemSecurity> service = gFileSystemSecurity.get();
return service.forget();
}
/* static */ already_AddRefed<FileSystemSecurity>
FileSystemSecurity::GetOrCreate()
{
MOZ_ASSERT(NS_IsMainThread());
AssertIsInMainProcess();
if (!gFileSystemSecurity) {
gFileSystemSecurity = new FileSystemSecurity();
ClearOnShutdown(&gFileSystemSecurity);
}
RefPtr<FileSystemSecurity> service = gFileSystemSecurity.get();
return service.forget();
}
FileSystemSecurity::FileSystemSecurity()
{
MOZ_ASSERT(NS_IsMainThread());
AssertIsInMainProcess();
}
FileSystemSecurity::~FileSystemSecurity()
{
MOZ_ASSERT(NS_IsMainThread());
AssertIsInMainProcess();
}
void
FileSystemSecurity::GrantAccessToContentProcess(ContentParentId aId,
const nsAString& aDirectoryPath)
{
MOZ_ASSERT(NS_IsMainThread());
AssertIsInMainProcess();
nsTArray<nsString>* paths;
if (!mPaths.Get(aId, &paths)) {
paths = new nsTArray<nsString>();
mPaths.Put(aId, paths);
} else if (paths->Contains(aDirectoryPath)) {
return;
}
paths->AppendElement(aDirectoryPath);
}
void
FileSystemSecurity::Forget(ContentParentId aId)
{
MOZ_ASSERT(NS_IsMainThread());
AssertIsInMainProcess();
mPaths.Remove(aId);
}
bool
FileSystemSecurity::ContentProcessHasAccessTo(ContentParentId aId,
const nsAString& aPath)
{
MOZ_ASSERT(NS_IsMainThread());
AssertIsInMainProcess();
nsTArray<nsString>* paths;
if (!mPaths.Get(aId, &paths)) {
return false;
}
for (uint32_t i = 0, len = paths->Length(); i < len; ++i) {
if (FileSystemUtils::IsDescendantPath(paths->ElementAt(i), aPath)) {
return true;
}
}
return false;
}
} // dom namespace
} // mozilla namespace

View File

@ -0,0 +1,48 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=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/. */
#ifndef mozilla_dom_FileSystemSecurity_h
#define mozilla_dom_FileSystemSecurity_h
#include "mozilla/dom/ipc/IdType.h"
#include "nsClassHashtable.h"
#include "nsISupportsImpl.h"
namespace mozilla {
namespace dom {
class FileSystemSecurity final
{
public:
NS_INLINE_DECL_REFCOUNTING(FileSystemSecurity)
static already_AddRefed<FileSystemSecurity>
Get();
static already_AddRefed<FileSystemSecurity>
GetOrCreate();
void
GrantAccessToContentProcess(ContentParentId aId,
const nsAString& aDirectoryPath);
void
Forget(ContentParentId aId);
bool
ContentProcessHasAccessTo(ContentParentId aId, const nsAString& aPath);
private:
FileSystemSecurity();
~FileSystemSecurity();
nsClassHashtable<nsUint64HashKey, nsTArray<nsString>> mPaths;
};
} // dom namespace
} // mozilla namespace
#endif // mozilla_dom_FileSystemSecurity_h

View File

@ -231,6 +231,9 @@ public:
NS_IMETHOD
Run() override;
virtual nsresult
GetTargetPath(nsAString& aPath) const = 0;
private:
/*
* Wrap the task result to FileSystemResponseValue for sending it through IPC.

View File

@ -20,24 +20,12 @@ TokenizerIgnoreNothing(char16_t /* aChar */)
} // anonymous namespace
/* static */ bool
FileSystemUtils::IsDescendantPath(nsIFile* aFile,
nsIFile* aDescendantFile)
FileSystemUtils::IsDescendantPath(const nsAString& aPath,
const nsAString& aDescendantPath)
{
nsAutoString path;
nsresult rv = aFile->GetPath(path);
if (NS_WARN_IF(NS_FAILED(rv))) {
return false;
}
nsAutoString descendantPath;
rv = aDescendantFile->GetPath(descendantPath);
if (NS_WARN_IF(NS_FAILED(rv))) {
return false;
}
// Check the sub-directory path to see if it has the parent path as prefix.
if (descendantPath.Length() <= path.Length() ||
!StringBeginsWith(descendantPath, path)) {
if (!aDescendantPath.Equals(aPath) &&
!StringBeginsWith(aDescendantPath, aPath)) {
return false;
}

View File

@ -26,7 +26,8 @@ public:
* Return true if aDescendantPath is a descendant of aPath.
*/
static bool
IsDescendantPath(nsIFile* aPath, nsIFile* aDescendantPath);
IsDescendantPath(const nsAString& aPath,
const nsAString& aDescendantPath);
/**
* Return true if this is valid DOMPath. It also splits the path in

View File

@ -380,5 +380,11 @@ GetDirectoryListingTaskParent::IOWork()
return NS_OK;
}
nsresult
GetDirectoryListingTaskParent::GetTargetPath(nsAString& aPath) const
{
return mTargetPath->GetPath(aPath);
}
} // namespace dom
} // namespace mozilla

View File

@ -69,6 +69,9 @@ public:
FileSystemRequestParent* aParent,
ErrorResult& aRv);
nsresult
GetTargetPath(nsAString& aPath) const override;
private:
GetDirectoryListingTaskParent(FileSystemBase* aFileSystem,
const FileSystemGetDirectoryListingParams& aParam,

View File

@ -270,5 +270,11 @@ GetFileOrDirectoryTaskParent::IOWork()
return NS_OK;
}
nsresult
GetFileOrDirectoryTaskParent::GetTargetPath(nsAString& aPath) const
{
return mTargetPath->GetPath(aPath);
}
} // namespace dom
} // namespace mozilla

View File

@ -62,6 +62,9 @@ public:
FileSystemRequestParent* aParent,
ErrorResult& aRv);
nsresult
GetTargetPath(nsAString& aPath) const override;
protected:
virtual FileSystemResponseValue
GetSuccessRequestResult(ErrorResult& aRv) const override;

View File

@ -253,5 +253,11 @@ GetFilesTaskParent::IOWork()
return NS_OK;
}
nsresult
GetFilesTaskParent::GetTargetPath(nsAString& aPath) const
{
return mTargetPath->GetPath(aPath);
}
} // namespace dom
} // namespace mozilla

View File

@ -71,6 +71,9 @@ public:
FileSystemRequestParent* aParent,
ErrorResult& aRv);
nsresult
GetTargetPath(nsAString& aPath) const override;
private:
GetFilesTaskParent(FileSystemBase* aFileSystem,
const FileSystemGetFilesParams& aParam,

View File

@ -16,6 +16,7 @@ var script;
function setup_tests() {
SpecialPowers.pushPrefEnv({"set": [["dom.webkitBlink.dirPicker.enabled", true],
["dom.filesystem.pathcheck.disabled", true],
["dom.webkitBlink.filesystem.enabled", true]]}, next);
}

View File

@ -32,6 +32,7 @@ function setup_tests() {
SpecialPowers.pushPrefEnv({"set": [["dom.input.dirpicker", true],
["dom.webkitBlink.dirPicker.enabled", true],
["dom.filesystem.pathcheck.disabled", true],
["dom.webkitBlink.filesystem.enabled", true]]}, next);
}

View File

@ -16,6 +16,7 @@ var entries;
function setup_tests() {
SpecialPowers.pushPrefEnv({"set": [["dom.webkitBlink.dirPicker.enabled", true],
["dom.filesystem.pathcheck.disabled", true],
["dom.webkitBlink.filesystem.enabled", true]]}, next);
}

View File

@ -15,6 +15,7 @@ EXPORTS.mozilla.dom += [
'Directory.h',
'FileSystemBase.h',
'FileSystemRequestParent.h',
'FileSystemSecurity.h',
'FileSystemTaskBase.h',
'FileSystemUtils.h',
'GetFilesHelper.h',
@ -25,6 +26,7 @@ UNIFIED_SOURCES += [
'Directory.cpp',
'FileSystemBase.cpp',
'FileSystemRequestParent.cpp',
'FileSystemSecurity.cpp',
'FileSystemTaskBase.cpp',
'FileSystemUtils.cpp',
'GetDirectoryListingTask.cpp',

View File

@ -11,6 +11,7 @@ function createRelativePath(parentDir, dirOrFile) {
function setup_tests(aNext) {
SimpleTest.requestLongerTimeout(2);
SpecialPowers.pushPrefEnv({"set": [["dom.input.dirpicker", true],
["dom.filesystem.pathcheck.disabled", true],
["dom.webkitBlink.dirPicker.enabled", true]]}, aNext);
}

View File

@ -41,6 +41,7 @@
#include "mozilla/dom/Element.h"
#include "mozilla/dom/File.h"
#include "mozilla/dom/FileCreatorHelper.h"
#include "mozilla/dom/FileSystemSecurity.h"
#include "mozilla/dom/ExternalHelperAppParent.h"
#include "mozilla/dom/GetFilesHelper.h"
#include "mozilla/dom/GeolocationBinding.h"
@ -1680,6 +1681,11 @@ ContentParent::ActorDestroy(ActorDestroyReason why)
mHangMonitorActor = nullptr;
}
RefPtr<FileSystemSecurity> fss = FileSystemSecurity::Get();
if (fss) {
fss->Forget(ChildID());
}
if (why == NormalShutdown && !mCalledClose) {
// If we shut down normally but haven't called Close, assume somebody
// else called Close on us. In that case, we still need to call

View File

@ -13,6 +13,7 @@
#include "nsISimpleEnumerator.h"
#include "mozilla/Unused.h"
#include "mozilla/dom/FileBlobImpl.h"
#include "mozilla/dom/FileSystemSecurity.h"
#include "mozilla/dom/ContentParent.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/TabParent.h"
@ -145,6 +146,8 @@ FilePickerParent::IORunnable::Destroy()
void
FilePickerParent::SendFilesOrDirectories(const nsTArray<BlobImplOrString>& aData)
{
nsIContentParent* parent = TabParent::GetFrom(Manager())->Manager();
if (mMode == nsIFilePicker::modeGetFolder) {
MOZ_ASSERT(aData.Length() <= 1);
if (aData.IsEmpty()) {
@ -154,13 +157,18 @@ FilePickerParent::SendFilesOrDirectories(const nsTArray<BlobImplOrString>& aData
MOZ_ASSERT(aData[0].mType == BlobImplOrString::eDirectoryPath);
// Let's inform the security singleton about the given access of this tab on
// this directory path.
RefPtr<FileSystemSecurity> fss = FileSystemSecurity::GetOrCreate();
fss->GrantAccessToContentProcess(parent->ChildID(),
aData[0].mDirectoryPath);
InputDirectory input;
input.directoryPath() = aData[0].mDirectoryPath;
Unused << Send__delete__(this, input, mResult);
return;
}
nsIContentParent* parent = TabParent::GetFrom(Manager())->Manager();
InfallibleTArray<PBlobParent*> blobs;
for (unsigned i = 0; i < aData.Length(); i++) {

View File

@ -80,7 +80,7 @@ DynamicImage::OnImageDataComplete(nsIRequest* aRequest,
}
void
DynamicImage::OnSurfaceDiscarded()
DynamicImage::OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey)
{ }
void

View File

@ -53,7 +53,7 @@ public:
nsresult aStatus,
bool aLastPart) override;
virtual void OnSurfaceDiscarded() override;
virtual void OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey) override;
virtual void SetInnerWindowID(uint64_t aInnerWindowId) override;
virtual uint64_t InnerWindowID() const override;

View File

@ -28,9 +28,25 @@ namespace image {
void
AnimationState::NotifyDecodeComplete()
{
// If we weren't discarded before the decode finished then mark ourselves as
// currently decoded.
if (!mDiscarded) {
mIsCurrentlyDecoded = true;
}
mHasBeenDecoded = true;
}
void
AnimationState::SetDiscarded(bool aDiscarded)
{
if (aDiscarded) {
MOZ_ASSERT(gfxPrefs::ImageMemAnimatedDiscardable());
mIsCurrentlyDecoded = false;
mCompositedFrameInvalid = true;
}
mDiscarded = aDiscarded;
}
void
AnimationState::ResetAnimation()
{
@ -265,13 +281,17 @@ FrameAnimator::AdvanceFrame(AnimationState& aState, TimeStamp aTime)
RefreshResult
FrameAnimator::RequestRefresh(AnimationState& aState, const TimeStamp& aTime)
{
// By default, an empty RefreshResult.
RefreshResult ret;
if (aState.IsDiscarded()) {
return ret;
}
// only advance the frame if the current time is greater than or
// equal to the current frame's end time.
TimeStamp currentFrameEndTime = GetCurrentImgFrameEndTime(aState);
// By default, an empty RefreshResult.
RefreshResult ret;
while (currentFrameEndTime <= aTime) {
TimeStamp oldFrameEndTime = currentFrameEndTime;
@ -290,12 +310,26 @@ FrameAnimator::RequestRefresh(AnimationState& aState, const TimeStamp& aTime)
}
}
// Advanced to the correct frame, the composited frame is now valid to be drawn.
if (currentFrameEndTime > aTime) {
aState.mCompositedFrameInvalid = false;
}
MOZ_ASSERT(!aState.mIsCurrentlyDecoded || !aState.mCompositedFrameInvalid);
return ret;
}
LookupResult
FrameAnimator::GetCompositedFrame(AnimationState& aState)
{
if (aState.mCompositedFrameInvalid) {
MOZ_ASSERT(gfxPrefs::ImageMemAnimatedDiscardable());
MOZ_ASSERT(aState.GetHasBeenDecoded());
MOZ_ASSERT(!aState.GetIsCurrentlyDecoded());
return LookupResult(MatchType::NOT_FOUND);
}
// If we have a composited version of this frame, return that.
if (mLastCompositedFrameIndex >= 0 &&
(uint32_t(mLastCompositedFrameIndex) == aState.mCurrentAnimationFrameIndex)) {

View File

@ -33,6 +33,9 @@ public:
, mFirstFrameTimeout(FrameTimeout::FromRawMilliseconds(0))
, mAnimationMode(aAnimationMode)
, mHasBeenDecoded(false)
, mIsCurrentlyDecoded(false)
, mCompositedFrameInvalid(false)
, mDiscarded(false)
{ }
/**
@ -45,6 +48,40 @@ public:
*/
bool GetHasBeenDecoded() { return mHasBeenDecoded; }
/**
* Call this with true when this image is discarded. Call this with false
* when a decoder is created to decode the image.
*/
void SetDiscarded(bool aDiscarded);
/**
* Returns true if this image has been discarded and a decoded has not yet
* been created to redecode it.
*/
bool IsDiscarded() { return mDiscarded; }
/**
* Sets the composited frame as valid or invalid.
*/
void SetCompositedFrameInvalid(bool aInvalid) {
MOZ_ASSERT(!aInvalid || gfxPrefs::ImageMemAnimatedDiscardable());
mCompositedFrameInvalid = aInvalid;
}
/**
* Returns whether the composited frame is valid to draw to the screen.
*/
bool GetCompositedFrameInvalid() {
return mCompositedFrameInvalid;
}
/**
* Returns whether the image is currently full decoded..
*/
bool GetIsCurrentlyDecoded() {
return mIsCurrentlyDecoded;
}
/**
* Call when you need to re-start animating. Ensures we start from the first
* frame.
@ -145,8 +182,44 @@ private:
//! The animation mode of this image. Constants defined in imgIContainer.
uint16_t mAnimationMode;
/**
* The following four bools (mHasBeenDecoded, mIsCurrentlyDecoded,
* mCompositedFrameInvalid, mDiscarded) track the state of the image with
* regards to decoding. They all start out false, including mDiscarded,
* because we want to treat being discarded differently from "not yet decoded
* for the first time".
*
* (When we are decoding the image for the first time we want to show the
* image at the speed of data coming in from the network or the speed
* specified in the image file, whichever is slower. But when redecoding we
* want to show nothing until the frame for the current time has been
* decoded. The prevents the user from seeing the image "fast forward"
* to the expected spot.)
*
* When the image is decoded for the first time mHasBeenDecoded and
* mIsCurrentlyDecoded get set to true. When the image is discarded
* mIsCurrentlyDecoded gets set to false, and mCompositedFrameInvalid
* & mDiscarded get set to true. When we create a decoder to redecode the
* image mDiscarded gets set to false. mCompositedFrameInvalid gets set to
* false when we are able to advance to the frame that should be showing
* for the current time. mIsCurrentlyDecoded gets set to true when the
* redecode finishes.
*/
//! Whether this image has been decoded at least once.
bool mHasBeenDecoded;
//! Whether this image is currently fully decoded.
bool mIsCurrentlyDecoded;
//! Whether the composited frame is valid to draw to the screen, note that
//! the composited frame can exist and be filled with image data but not
//! valid to draw to the screen.
bool mCompositedFrameInvalid;
//! Whether this image is currently discarded. Only set to true after the
//! image has been decoded at least once.
bool mDiscarded;
};
/**

View File

@ -216,7 +216,7 @@ public:
/**
* Called when the SurfaceCache discards a surface belonging to this image.
*/
virtual void OnSurfaceDiscarded() = 0;
virtual void OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey) = 0;
virtual void SetInnerWindowID(uint64_t aInnerWindowId) = 0;
virtual uint64_t InnerWindowID() const = 0;
@ -256,7 +256,7 @@ public:
}
#endif
virtual void OnSurfaceDiscarded() override { }
virtual void OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey) override { }
virtual void SetInnerWindowID(uint64_t aInnerWindowId) override
{

View File

@ -88,9 +88,9 @@ ImageWrapper::OnImageDataComplete(nsIRequest* aRequest,
}
void
ImageWrapper::OnSurfaceDiscarded()
ImageWrapper::OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey)
{
return mInnerImage->OnSurfaceDiscarded();
return mInnerImage->OnSurfaceDiscarded(aSurfaceKey);
}
void

View File

@ -45,7 +45,7 @@ public:
nsresult aStatus,
bool aLastPart) override;
virtual void OnSurfaceDiscarded() override;
virtual void OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey) override;
virtual void SetInnerWindowID(uint64_t aInnerWindowId) override;
virtual uint64_t InnerWindowID() const override;

View File

@ -420,10 +420,15 @@ RasterImage::WillDrawOpaqueNow()
}
void
RasterImage::OnSurfaceDiscarded()
RasterImage::OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey)
{
MOZ_ASSERT(mProgressTracker);
if (mAnimationState && aSurfaceKey.Playback() == PlaybackType::eAnimated) {
MOZ_ASSERT(gfxPrefs::ImageMemAnimatedDiscardable());
mAnimationState->SetDiscarded(true);
}
NS_DispatchToMainThread(NewRunnableMethod("ProgressTracker::OnDiscard",
mProgressTracker, &ProgressTracker::OnDiscard));
}
@ -1028,6 +1033,10 @@ RasterImage::Discard()
// Delete all the decoded frames.
SurfaceCache::RemoveImage(ImageKey(this));
if (mAnimationState) {
mAnimationState->SetDiscarded(true);
}
// Notify that we discarded.
if (mProgressTracker) {
mProgressTracker->OnDiscard();
@ -1194,6 +1203,7 @@ RasterImage::Decode(const IntSize& aSize,
// Create a decoder.
RefPtr<IDecodingTask> task;
if (mAnimationState && aPlaybackType == PlaybackType::eAnimated) {
mAnimationState->SetDiscarded(false);
task = DecoderFactory::CreateAnimationDecoder(mDecoderType, WrapNotNull(this),
mSourceBuffer, mSize,
decoderFlags, surfaceFlags);

View File

@ -164,7 +164,7 @@ public:
virtual nsresult StopAnimation() override;
// Methods inherited from Image
virtual void OnSurfaceDiscarded() override;
virtual void OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey) override;
virtual size_t SizeOfSourceWithComputedFallback(MallocSizeOf aMallocSizeOf)
const override;

View File

@ -502,7 +502,7 @@ public:
// If the surface was not a placeholder, tell its image that we discarded it.
if (!aSurface->IsPlaceholder()) {
static_cast<Image*>(imageKey)->OnSurfaceDiscarded();
static_cast<Image*>(imageKey)->OnSurfaceDiscarded(aSurface->GetSurfaceKey());
}
StopTracking(aSurface);

View File

@ -1123,7 +1123,7 @@ VectorImage::RequestDiscard()
}
void
VectorImage::OnSurfaceDiscarded()
VectorImage::OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey)
{
MOZ_ASSERT(mProgressTracker);

View File

@ -49,7 +49,7 @@ public:
nsresult aResult,
bool aLastPart) override;
virtual void OnSurfaceDiscarded() override;
virtual void OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey) override;
/**
* Callback for SVGRootRenderingObserver.

View File

@ -787,11 +787,18 @@ BackgroundParentImpl::AllocPFileSystemRequestParent(
return nullptr;
}
result->Start();
return result.forget().take();
}
mozilla::ipc::IPCResult
BackgroundParentImpl::RecvPFileSystemRequestConstructor(
PFileSystemRequestParent* aActor,
const FileSystemParams& params)
{
static_cast<FileSystemRequestParent*>(aActor)->Start();
return IPC_OK();
}
bool
BackgroundParentImpl::DeallocPFileSystemRequestParent(
PFileSystemRequestParent* aDoomed)

View File

@ -193,6 +193,10 @@ protected:
virtual PFileSystemRequestParent*
AllocPFileSystemRequestParent(const FileSystemParams&) override;
virtual mozilla::ipc::IPCResult
RecvPFileSystemRequestConstructor(PFileSystemRequestParent* actor,
const FileSystemParams& params) override;
virtual bool
DeallocPFileSystemRequestParent(PFileSystemRequestParent*) override;

View File

@ -5183,7 +5183,7 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte
nscoord iSize, minISize, maxISize, bSize, minBSize, maxBSize;
enum class Stretch {
// stretch to fill the CB (preserving intrinsic ratio) in the relevant axis
eStretchPreservingRatio,
eStretchPreservingRatio, // XXX not used yet
// stretch to fill the CB in the relevant axis
eStretch,
// no stretching in the relevant axis
@ -5197,6 +5197,35 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte
Stretch stretchI = eNoStretch; // stretch behavior in the inline axis
Stretch stretchB = eNoStretch; // stretch behavior in the block axis
const bool isVertical = aWM.IsVertical();
const nsStyleCoord& isizeCoord =
isVertical ? aIntrinsicSize.height : aIntrinsicSize.width;
const bool hasIntrinsicISize = isizeCoord.GetUnit() == eStyleUnit_Coord;
nscoord intrinsicISize;
if (hasIntrinsicISize) {
intrinsicISize = std::max(nscoord(0), isizeCoord.GetCoordValue());
} else {
NS_ASSERTION(isizeCoord.GetUnit() == eStyleUnit_None,
"unexpected unit");
intrinsicISize = 0;
}
const nsStyleCoord& bsizeCoord =
isVertical ? aIntrinsicSize.width : aIntrinsicSize.height;
const bool hasIntrinsicBSize = bsizeCoord.GetUnit() == eStyleUnit_Coord;
nscoord intrinsicBSize;
if (hasIntrinsicBSize) {
intrinsicBSize = std::max(nscoord(0), bsizeCoord.GetCoordValue());
} else {
NS_ASSERTION(bsizeCoord.GetUnit() == eStyleUnit_None,
"unexpected unit");
intrinsicBSize = 0;
}
NS_ASSERTION(aIntrinsicRatio.width >= 0 && aIntrinsicRatio.height >= 0,
"Intrinsic ratio has a negative component!");
LogicalSize logicalRatio(aWM, aIntrinsicRatio);
if (!isAutoISize) {
iSize = ComputeISizeValue(aRenderingContext,
aCBSize.ISize(aWM), boxSizingAdjust.ISize(aWM),
@ -5211,9 +5240,13 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte
aWM.IsOrthogonalTo(GetParent()->GetWritingMode()) ?
stylePos->UsedAlignSelf(GetParent()->StyleContext()) :
stylePos->UsedJustifySelf(GetParent()->StyleContext());
if (inlineAxisAlignment == NS_STYLE_ALIGN_NORMAL) {
stretchI = eStretchPreservingRatio;
} else if (inlineAxisAlignment == NS_STYLE_ALIGN_STRETCH) {
// Note: 'normal' means 'start' for elements with an intrinsic size
// or ratio in the relevant dimension, otherwise 'stretch'.
// https://drafts.csswg.org/css-grid/#grid-item-sizing
if ((inlineAxisAlignment == NS_STYLE_ALIGN_NORMAL &&
!hasIntrinsicISize &&
!(logicalRatio.ISize(aWM) > 0)) ||
inlineAxisAlignment == NS_STYLE_ALIGN_STRETCH) {
stretchI = eStretch;
}
}
@ -5276,9 +5309,13 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte
!aWM.IsOrthogonalTo(GetParent()->GetWritingMode()) ?
stylePos->UsedAlignSelf(GetParent()->StyleContext()) :
stylePos->UsedJustifySelf(GetParent()->StyleContext());
if (blockAxisAlignment == NS_STYLE_ALIGN_NORMAL) {
stretchB = eStretchPreservingRatio;
} else if (blockAxisAlignment == NS_STYLE_ALIGN_STRETCH) {
// Note: 'normal' means 'start' for elements with an intrinsic size
// or ratio in the relevant dimension, otherwise 'stretch'.
// https://drafts.csswg.org/css-grid/#grid-item-sizing
if ((blockAxisAlignment == NS_STYLE_ALIGN_NORMAL &&
!hasIntrinsicBSize &&
!(logicalRatio.BSize(aWM) > 0)) ||
blockAxisAlignment == NS_STYLE_ALIGN_STRETCH) {
stretchB = eStretch;
}
}
@ -5316,48 +5353,9 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte
minBSize = 0;
}
// Resolve percentage intrinsic iSize/bSize as necessary:
NS_ASSERTION(aCBSize.ISize(aWM) != NS_UNCONSTRAINEDSIZE,
"Our containing block must not have unconstrained inline-size!");
const bool isVertical = aWM.IsVertical();
const nsStyleCoord& isizeCoord =
isVertical ? aIntrinsicSize.height : aIntrinsicSize.width;
const nsStyleCoord& bsizeCoord =
isVertical ? aIntrinsicSize.width : aIntrinsicSize.height;
bool hasIntrinsicISize, hasIntrinsicBSize;
nscoord intrinsicISize, intrinsicBSize;
if (isizeCoord.GetUnit() == eStyleUnit_Coord) {
hasIntrinsicISize = true;
intrinsicISize = isizeCoord.GetCoordValue();
if (intrinsicISize < 0)
intrinsicISize = 0;
} else {
NS_ASSERTION(isizeCoord.GetUnit() == eStyleUnit_None,
"unexpected unit");
hasIntrinsicISize = false;
intrinsicISize = 0;
}
if (bsizeCoord.GetUnit() == eStyleUnit_Coord) {
hasIntrinsicBSize = true;
intrinsicBSize = bsizeCoord.GetCoordValue();
if (intrinsicBSize < 0)
intrinsicBSize = 0;
} else {
NS_ASSERTION(bsizeCoord.GetUnit() == eStyleUnit_None,
"unexpected unit");
hasIntrinsicBSize = false;
intrinsicBSize = 0;
}
NS_ASSERTION(aIntrinsicRatio.width >= 0 && aIntrinsicRatio.height >= 0,
"Intrinsic ratio has a negative component!");
LogicalSize logicalRatio(aWM, aIntrinsicRatio);
// Now calculate the used values for iSize and bSize:
if (isAutoISize) {

View File

@ -4758,14 +4758,14 @@ nsGridContainerFrame::Tracks::StretchFlexibleTracks(
: ri->ComputedMaxISize();
}
Maybe<nsTArray<TrackSize>> origSizes;
bool applyMinMax = (minSize != 0 || maxSize != NS_UNCONSTRAINEDSIZE) &&
aAvailableSize == NS_UNCONSTRAINEDSIZE;
// We iterate twice at most. The 2nd time if the grid size changed after
// applying a min/max-size (can only occur if aAvailableSize is indefinite).
while (true) {
float fr = FindUsedFlexFraction(aState, aGridItems, flexTracks,
aFunctions, aAvailableSize);
if (fr != 0.0f) {
bool applyMinMax = (minSize != 0 || maxSize != NS_UNCONSTRAINEDSIZE) &&
aAvailableSize == NS_UNCONSTRAINEDSIZE;
for (uint32_t i : flexTracks) {
float flexFactor = aFunctions.MaxSizingFor(i).GetFlexFractionValue();
nscoord flexLength = NSToCoordRound(flexFactor * fr);
@ -4777,36 +4777,36 @@ nsGridContainerFrame::Tracks::StretchFlexibleTracks(
base = flexLength;
}
}
if (applyMinMax && origSizes.isSome()) {
// https://drafts.csswg.org/css-grid/#algo-flex-tracks
// "If using this flex fraction would cause the grid to be smaller than
// the grid containers min-width/height (or larger than the grid
// containers max-width/height), then redo this step, treating the free
// space as definite [...]"
nscoord newSize = 0;
for (auto& sz : mSizes) {
newSize += sz.mBase;
}
const auto sumOfGridGaps = SumOfGridGaps();
newSize += sumOfGridGaps;
if (newSize > maxSize) {
aAvailableSize = maxSize;
} else if (newSize < minSize) {
aAvailableSize = minSize;
}
if (aAvailableSize != NS_UNCONSTRAINEDSIZE) {
// Reset min/max-size to ensure 'applyMinMax' becomes false next time.
minSize = 0;
maxSize = NS_UNCONSTRAINEDSIZE;
aAvailableSize = std::max(0, aAvailableSize - sumOfGridGaps);
// Restart with the original track sizes and definite aAvailableSize.
}
if (applyMinMax) {
applyMinMax = false;
// https://drafts.csswg.org/css-grid/#algo-flex-tracks
// "If using this flex fraction would cause the grid to be smaller than
// the grid containers min-width/height (or larger than the grid
// containers max-width/height), then redo this step, treating the free
// space as definite [...]"
nscoord newSize = 0;
for (auto& sz : mSizes) {
newSize += sz.mBase;
}
const auto sumOfGridGaps = SumOfGridGaps();
newSize += sumOfGridGaps;
if (newSize > maxSize) {
aAvailableSize = maxSize;
} else if (newSize < minSize) {
aAvailableSize = minSize;
}
if (aAvailableSize != NS_UNCONSTRAINEDSIZE) {
aAvailableSize = std::max(0, aAvailableSize - sumOfGridGaps);
// Restart with the original track sizes and definite aAvailableSize.
if (origSizes.isSome()) {
mSizes = Move(*origSizes);
origSizes.reset();
if (aAvailableSize == 0) {
break; // zero available size wouldn't change any sizes though...
}
continue;
} // else, no mSizes[].mBase were changed above so it's still correct
if (aAvailableSize == 0) {
break; // zero available size wouldn't change any sizes though...
}
continue;
}
}
break;

View File

@ -82,5 +82,8 @@ a30 {
<div class="grid rel" style="width:100px; height:100px; position:relative">
<button style="top:0;width:40px;height:40px">AB</button><button style="top:0;right:0;height:40px">&nbsp;&nbsp;</button><button style="bottom:0;width:40px;">AB</button><button style="bottom:0;right:0">&nbsp;&nbsp;</button></div>
<div class="grid rel" style="width:100px; height:100px; position:relative">
<button style="top:0;width:40px;height:40px">AB</button><button style="top:0;right:0;height:40px">&nbsp;&nbsp;</button><button style="bottom:0;width:40px;">AB</button><button style="bottom:0;right:0">&nbsp;&nbsp;</button></div>
</body>
</html>

View File

@ -149,5 +149,12 @@ button:nth-child(4n) { background: silver; }
<button class="end">&nbsp;&nbsp;</button>
</div>
<div class="grid max40" style="grid:50px 50px/50px 50px; place-items:stretch">
<button>AB</button>
<button class="jend">&nbsp;&nbsp;</button>
<button class="aend">AB</button>
<button class="end">&nbsp;&nbsp;</button>
</div>
</body>
</html>

View File

@ -47,6 +47,7 @@ input {
</head>
<body>
<div class="grid"><div><input></div></div>
<div class="grid"><input class="m" style="width:190px; height:20px"></div>
<div class="grid"><input class="hma10 je" style="height:20px"></div>
<div class="grid"><input class="hmaa jc" style="height:20px"></div>

View File

@ -16,6 +16,7 @@
display: inline-grid;
border: 1px solid;
grid: 2px 30px 3px / 6px 200px 4px;
place-items: stretch;
}
input {
@ -40,6 +41,7 @@ input {
</head>
<body>
<div class="grid" style="place-items:start"><input></div>
<div class="grid"><input class="m"></div>
<div class="grid"><input class="hma10"></div>
<div class="grid"><input class="hmaa"></div>

View File

@ -91,75 +91,75 @@ var js = [ "normal", "start", "center", "stretch" ];
var as = [ "normal", "start", "center", "stretch" ];
var imgSizes =
[
['24px', '24px'],
['32px', '32px'],
['32px', '32px'],
['24px', '24px'],
['24px', '24px'],
['16px', '16px'],
['16px', '16px'],
['16px', '16px'],
['16px', '24px'],
['24px', '24px'],
['16px', '16px'],
['16px', '24px'],
['32px', '32px'],
['16px', '16px'],
['16px', '24px'],
['32px', '16px'],
['32px', '16px'],
['32px', '16px'],
['32px', '24px'],
['24px', '24px'],
['24px', '24px'],
['24px', '24px'],
['32px', '32px'],
['32px', '32px'],
['16px', '16px'],
['16px', '16px'],
['16px', '16px'],
['16px', '32px'],
['32px', '32px'],
['16px', '16px'],
['16px', '32px'],
['24px', '24px'],
['16px', '16px'],
['16px', '32px'],
['24px', '16px'],
['24px', '16px'],
['24px', '16px'],
['24px', '32px'],
['4px', '4px'],
['4px', '4px'],
['4px', '4px'],
['8px', '8px'],
['8px', '8px'],
['16px', '16px'],
['16px', '16px'],
['16px', '16px'],
['16px', '8px'],
['8px', '8px'],
['16px', '16px'],
['16px', '8px'],
['4px', '4px'],
['16px', '16px'],
['16px', '8px'],
['4px', '16px'],
['4px', '16px'],
['4px', '16px'],
['4px', '8px'],
['4px', '4px'],
['4px', '4px'],
['4px', '4px'],
['32px', '32px'],
['32px', '32px'],
['16px', '16px'],
['16px', '16px'],
['16px', '16px'],
['16px', '32px'],
['32px', '32px'],
['16px', '16px'],
['16px', '32px'],
['4px', '4px'],
['16px', '16px'],
['16px', '32px'],
['4px', '16px'],
['4px', '16px'],
['4px', '16px'],
['4px', '32px'],
['4px', '4px'],
['8px', '8px'],
['8px', '8px'],
['4px', '4px'],
['4px', '4px'],
['16px', '16px'],
['16px', '16px'],
['16px', '16px'],
['16px', '4px'],
['4px', '4px'],
['16px', '16px'],
['16px', '4px'],
['8px', '8px'],
['16px', '16px'],
['16px', '4px'],
['8px', '16px'],
['8px', '16px'],
['8px', '16px'],
['8px', '4px'],
['8px', '8px'],
['32px', '32px'],
['32px', '32px'],
['8px', '8px'],
['8px', '8px'],
['16px', '16px'],
['16px', '16px'],
['16px', '16px'],
['16px', '8px'],
['8px', '8px'],
['16px', '16px'],
['16px', '8px'],
['32px', '32px'],
['16px', '16px'],
['16px', '8px'],
['32px', '16px'],
['32px', '16px'],
['32px', '16px'],
['32px', '8px'],

View File

@ -87,27 +87,27 @@ var js = [ "normal", "start", "center", "stretch" ];
var as = [ "normal", "start", "center", "stretch" ];
var imgSizes =
[
['24px', '24px'],
['32px', '32px'],
['32px', '32px'],
['24px', '24px'],
['24px', '24px'],
['16px', '16px'],
['16px', '16px'],
['16px', '16px'],
['16px', '24px'],
['24px', '24px'],
['16px', '16px'],
['16px', '24px'],
['32px', '32px'],
['16px', '16px'],
['16px', '24px'],
['32px', '16px'],
['32px', '16px'],
['32px', '16px'],
['32px', '24px'],
['24px', '24px'],
['24px', '24px'],
['24px', '24px'],
['32px', '32px'],
['32px', '32px'],
['16px', '16px'],
['16px', '16px'],
['16px', '16px'],
['16px', '32px'],
['32px', '32px'],
['16px', '16px'],
['16px', '32px'],
['24px', '24px'],
['16px', '16px'],
['16px', '32px'],
['24px', '16px'],
['24px', '16px'],
['24px', '16px'],
['24px', '32px'],
@ -131,7 +131,7 @@ var imgSizes =
['4px', '32px'],
['4px', '4px'],
['4px', '32px'],
['4px', '4px'],
['4px', '16px'],
['4px', '16px'],
['4px', '16px'],
['4px', '32px'],
@ -150,7 +150,7 @@ var imgSizes =
['8px', '8px'],
['8px', '8px'],
['8px', '8px'],
['8px', '8px'],
['16px', '8px'],
['8px', '8px'],
['16px', '8px'],
['8px', '8px'],

View File

@ -140,7 +140,7 @@
var url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAEElEQVQoz2NgGAWjYBTAAAADEAABaJFtwwAAAABJRU5ErkJggg%3D%3D";
var imgs = document.querySelectorAll('img');
var imgSizes =
[
[
['4px', '4px'],
['4px', '4px'],
['16px', '4px'],
@ -155,13 +155,13 @@ var imgSizes =
['10px', '20px'],
['20px', '20px'],
['10px', '20px'],
['4px', '4px'],
['4px', '4px'],
['16px', '16px'],
['10px', '10px'],
['16px', '16px'],
['10px', '10px'],
['16px', '4px'],
['10px', '4px'],
['4px', '4px'],
['16px', '16px'],
['2px', '2px'],
['4px', '4px'],
['2px', '2px'],
@ -177,15 +177,15 @@ var imgSizes =
['20px', '10px'],
['20px', '32px'],
['20px', '10px'],
['32px', '32px'],
['20px', '20px'],
['20px', '10px'],
['4px', '4px'],
['4px', '4px'],
['16px', '16px'],
['10px', '10px'],
['16px', '16px'],
['10px', '10px'],
['16px', '32px'],
['16px', '10px'],
['32px', '32px'],
['16px', '16px'],
['10px', '10px'],
['20px', '20px'],
['20px', '10px'],

View File

@ -157,6 +157,7 @@ for (var i = 0; i < imgs.length; ++i) {
}
</script>
<!-- For generating button size results in -ref file
<script>
document.body.clientHeight;
var imgs = document.querySelectorAll('img');
@ -167,19 +168,6 @@ for (var i = 0; i < imgs.length; ++i) {
s += ']';
console.log(s)
</script>
<!-- For generating button size results in -ref file
<script>
document.body.clientHeight;
var buttons = document.querySelectorAll('button');
var s = ' [\n';
for (var i = 0; i < buttons.length; ++i) {
var cs = window.getComputedStyle(buttons[i]);
s += " ['"+ cs['width'] + "', '" + cs['height'] + "'],\n";
}
s += ']';
console.log(s)
</script>
-->
</body>

View File

@ -5,7 +5,7 @@
-->
<html><head>
<meta charset="utf-8">
<title>Reference: stretching intrinsic ratio item with min/max-size:0</title>
<title>Reference: stretching intrinsic ratio item with min-size:0</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1176775">
<style type="text/css">
body,html { color:black; background:white; font:16px/1 monospace; padding:0; margin:0; }
@ -22,59 +22,59 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
<body>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="height:96px; width:8px">
<img src="support/lime-2x24.png" style="height:96px; width:20px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="height:48px; width:4px">
<img src="support/lime-2x24.png" style="height:96px; width:4px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="width:20px; height:calc(2px * (20 / 24))">
<img src="support/lime-24x2.png" style="width:20px; height:8px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="width:96px; height:8px">
<img src="support/lime-24x2.png" style="width:100px; height:8px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; height:48px; width:4px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:4px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:96px; height:8px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<div class="grid" style="grid: 8px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:96px; height:8px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<br>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start unsafe; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start unsafe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start safe; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start safe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:end unsafe; height:120px; width:10px; margin-bottom:-24px">
<img src="support/lime-2x24.png" style="align-self:end unsafe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:end safe; height:120px; width:10px; margin-top:-24px">
<img src="support/lime-2x24.png" style="align-self:end safe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 4px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start unsafe; width:48px; height:4px">
<img src="support/lime-24x2.png" style="justify-self:start unsafe; width:24px; height:4px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 40px">
<img src="support/lime-24x2.png" style="justify-self:start safe; width:48px; height:4px">
<img src="support/lime-24x2.png" style="justify-self:start safe; width:24px; height:4px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 40px">
<img src="support/lime-24x2.png" style="justify-self:end unsafe; width:48px; height:4px; margin-right:-38px">
<img src="support/lime-24x2.png" style="justify-self:end unsafe; width:24px; height:4px; margin-right:-14px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 80px">
<img src="support/lime-24x2.png" style="justify-self:end safe; width:48px; height:4px; margin-left:-38px">
<img src="support/lime-24x2.png" style="justify-self:end safe; width:24px; height:4px; margin-left:-38px">
</div>
<br>
@ -82,59 +82,59 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
<div class="vertical-tests">
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="height:96px; width:8px">
<img src="support/lime-2x24.png" style="height:96px; width:20px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="height:48px; width:4px">
<img src="support/lime-2x24.png" style="height:96px; width:4px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="width:20px; height:calc(2px * (20 / 24))">
<img src="support/lime-24x2.png" style="width:20px; height:8px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="width:96px; height:8px">
<img src="support/lime-24x2.png" style="width:100px; height:8px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; height:48px; width:4px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:4px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:96px; height:8px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<div class="grid" style="grid: 8px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:96px; height:8px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<br>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start unsafe; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start unsafe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start safe; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start safe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:end unsafe; height:120px; width:10px; margin-bottom:-24px">
<img src="support/lime-2x24.png" style="align-self:end unsafe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:end safe; height:120px; width:10px; margin-top:-24px">
<img src="support/lime-2x24.png" style="align-self:end safe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 4px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start unsafe; width:48px; height:4px">
<img src="support/lime-24x2.png" style="justify-self:start unsafe; width:24px; height:4px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 40px">
<img src="support/lime-24x2.png" style="justify-self:start safe; width:48px; height:4px">
<img src="support/lime-24x2.png" style="justify-self:start safe; width:24px; height:4px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 40px">
<img src="support/lime-24x2.png" style="justify-self:end unsafe; width:48px; height:4px; margin-right:-38px">
<img src="support/lime-24x2.png" style="justify-self:end unsafe; width:24px; height:4px; margin-right:-14px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 80px">
<img src="support/lime-24x2.png" style="justify-self:end safe; width:48px; height:4px; margin-left:-38px">
<img src="support/lime-24x2.png" style="justify-self:end safe; width:24px; height:4px; margin-left:-38px">
</div>
</div>

View File

@ -5,7 +5,7 @@
-->
<html><head>
<meta charset="utf-8">
<title>CSS Grid Test: stretching intrinsic ratio item with min/max-size:0</title>
<title>CSS Grid Test: stretching intrinsic ratio item with min-size:0</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1176775">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-stretch">
<link rel="match" href="grid-item-intrinsic-ratio-stretch-001-ref.html">
@ -15,6 +15,7 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
display: inline-grid;
border: 1px solid;
margin: 5px;
place-items: stretch;
}
.grid > * {
min-width: 0;

View File

@ -22,61 +22,61 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
<body>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="width:4px; height:48px">
<img src="support/lime-2x24.png" style="width:4px; height:96px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="height:12px; width:1px">
<img src="support/lime-2x24.png" style="height:12px; width:4px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="height:1px; width:12px">
<img src="support/lime-24x2.png" style="height:8px; width:12px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="height:6px; width:72px">
<img src="support/lime-24x2.png" style="height:6px; width:100px">
</div>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="align-self:start; height:48px; width:4px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:20px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; height:12px; width:1px">
<img src="support/lime-2x24.png" style="align-self:start; height:12px; width:4px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:48px; height:4px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<div class="grid" style="grid: 8px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:48px; height:4px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<br>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="width:10px; height:120px">
<img src="support/lime-2x24.png" style="width:20px; height:96px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="width:6px; height:72px">
<img src="support/lime-2x24.png" style="width:6px; height:96px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="width:24px; height:2px">
<img src="support/lime-24x2.png" style="width:20px; height:8px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="width:120px; height:10px">
<img src="support/lime-24x2.png" style="width:100px; height:10px">
</div>
<div class="grid" style="grid: 48px / 6px">
<img src="support/lime-2x24.png" style="align-self:start; width:calc(2px * (80 / 24)); height:80px">
<img src="support/lime-2x24.png" style="align-self:start; width:6px; height:80px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; width:6px; height:72px">
<img src="support/lime-2x24.png" style="align-self:start; width:4px; height:72px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:98px; height:calc(2px * (98 / 24))">
</div>
<div class="grid" style="grid: 4px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:72px; height:6px">
<img src="support/lime-24x2.png" style="justify-self:start; width:72px; height:4px">
</div>
<br>
@ -84,61 +84,61 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
<div class="vertical-tests">
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="width:4px; height:48px">
<img src="support/lime-2x24.png" style="width:4px; height:96px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="height:12px; width:1px">
<img src="support/lime-2x24.png" style="height:12px; width:4px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="height:1px; width:12px">
<img src="support/lime-24x2.png" style="height:8px; width:12px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="height:6px; width:72px">
<img src="support/lime-24x2.png" style="height:6px; width:100px">
</div>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="align-self:start; height:48px; width:4px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:20px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; height:12px; width:1px">
<img src="support/lime-2x24.png" style="align-self:start; height:12px; width:4px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:48px; height:4px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<div class="grid" style="grid: 8px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:48px; height:4px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<br>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="width:10px; height:120px">
<img src="support/lime-2x24.png" style="width:20px; height:96px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="width:6px; height:72px">
<img src="support/lime-2x24.png" style="width:6px; height:96px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="width:24px; height:2px">
<img src="support/lime-24x2.png" style="width:20px; height:8px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="width:120px; height:10px">
<img src="support/lime-24x2.png" style="width:100px; height:10px">
</div>
<div class="grid" style="grid: 48px / 6px">
<img src="support/lime-2x24.png" style="align-self:start; width:calc(2px * (80 / 24)); height:80px">
<img src="support/lime-2x24.png" style="align-self:start; width:6px; height:80px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; width:6px; height:72px">
<img src="support/lime-2x24.png" style="align-self:start; width:4px; height:72px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:98px; height:calc(2px * (98 / 24))">
</div>
<div class="grid" style="grid: 4px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:72px; height:6px">
<img src="support/lime-24x2.png" style="justify-self:start; width:72px; height:4px">
</div>
</div>

View File

@ -16,6 +16,7 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
display: inline-grid;
border: 1px solid;
margin: 5px;
place-items: stretch;
}
.grid > * {
min-width: 0;

View File

@ -22,59 +22,59 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
<body>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="height:96px; width:8px">
<img src="support/lime-2x24.png" style="height:96px; width:20px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="height:48px; width:4px">
<img src="support/lime-2x24.png" style="height:96px; width:4px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="width:20px; height:calc(2px * (20 / 24))">
<img src="support/lime-24x2.png" style="width:20px; height:8px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="width:96px; height:8px">
<img src="support/lime-24x2.png" style="width:100px; height:8px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; height:48px; width:4px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:4px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:96px; height:8px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<div class="grid" style="grid: 8px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:start; width:10px; height:8px">
</div>
<br>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start unsafe; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start unsafe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start safe; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start safe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:end unsafe; height:120px; width:10px; margin-bottom:-24px">
<img src="support/lime-2x24.png" style="align-self:end unsafe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:end safe; height:120px; width:10px; margin-top:-24px">
<img src="support/lime-2x24.png" style="align-self:end safe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 4px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start unsafe; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:start unsafe; width:10px; height:4px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 40px">
<img src="support/lime-24x2.png" style="justify-self:start safe; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:start safe; width:10px; height:4px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 40px">
<img src="support/lime-24x2.png" style="justify-self:end unsafe; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:end unsafe; width:10px; height:4px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 80px">
<img src="support/lime-24x2.png" style="justify-self:end safe; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:end safe; width:10px; height:4px">
</div>
<br>
@ -82,59 +82,59 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
<div class="vertical-tests">
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="height:96px; width:8px">
<img src="support/lime-2x24.png" style="height:96px; width:20px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="height:48px; width:4px">
<img src="support/lime-2x24.png" style="height:96px; width:4px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="width:20px; height:calc(2px * (20 / 24))">
<img src="support/lime-24x2.png" style="width:20px; height:8px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="width:96px; height:8px">
<img src="support/lime-24x2.png" style="width:100px; height:8px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; height:48px; width:4px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:4px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:96px; height:8px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<div class="grid" style="grid: 8px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:start; width:10px; height:8px">
</div>
<br>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start unsafe; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start unsafe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:start safe; height:120px; width:10px">
<img src="support/lime-2x24.png" style="align-self:start safe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:end unsafe; height:120px; width:10px; margin-bottom:-24px">
<img src="support/lime-2x24.png" style="align-self:end unsafe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 96px / 10px">
<img src="support/lime-2x24.png" style="align-self:end safe; height:120px; width:10px; margin-top:-24px">
<img src="support/lime-2x24.png" style="align-self:end safe; height:24px; width:10px">
</div>
<div class="grid" style="grid: 4px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start unsafe; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:start unsafe; width:10px; height:4px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 40px">
<img src="support/lime-24x2.png" style="justify-self:start safe; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:start safe; width:10px; height:4px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 40px">
<img src="support/lime-24x2.png" style="justify-self:end unsafe; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:end unsafe; width:10px; height:4px">
</div>
<div class="grid" style="grid: 4px / 10px; margin-left: 80px">
<img src="support/lime-24x2.png" style="justify-self:end safe; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:end safe; width:10px; height:4px">
</div>
</div>

View File

@ -15,6 +15,7 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
display: inline-grid;
border: 1px solid;
margin: 5px;
place-items: stretch stretch;
}
.vertical-tests img { writing-mode: vertical-rl; }
.vertical-tests div { vertical-align:bottom }

View File

@ -23,61 +23,61 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
<body>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="width:4px; height:48px">
<img src="support/lime-2x24.png" style="width:4px; height:96px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="height:12px; width:1px">
<img src="support/lime-2x24.png" style="height:12px; width:4px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="height:1px; width:12px">
<img src="support/lime-24x2.png" style="height:8px; width:12px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="height:6px; width:72px">
<img src="support/lime-24x2.png" style="height:6px; width:100px">
</div>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="align-self:start; height:48px; width:4px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:20px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; height:12px; width:1px">
<img src="support/lime-2x24.png" style="align-self:start; height:12px; width:4px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:48px; height:4px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<div class="grid" style="grid: 8px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:start; width:10px; height:8px">
</div>
<br>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="width:10px; height:120px">
<img src="support/lime-2x24.png" style="width:20px; height:96px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="width:6px; height:72px">
<img src="support/lime-2x24.png" style="width:6px; height:96px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="width:24px; height:2px">
<img src="support/lime-24x2.png" style="width:20px; height:8px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="width:120px; height:10px">
<img src="support/lime-24x2.png" style="width:100px; height:10px">
</div>
<div class="grid" style="grid: 48px / 6px">
<img src="support/lime-2x24.png" style="align-self:start; width:calc(2px * (80 / 24)); height:80px">
<img src="support/lime-2x24.png" style="align-self:start; width:6px; height:80px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; width:6px; height:72px">
<img src="support/lime-2x24.png" style="align-self:start; width:4px; height:72px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:98px; height:calc(2px * (98 / 24))">
</div>
<div class="grid" style="grid: 4px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:72px; height:6px">
<img src="support/lime-24x2.png" style="justify-self:start; width:72px; height:4px">
</div>
<br>
@ -85,61 +85,61 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
<div class="vertical-tests">
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="width:4px; height:48px">
<img src="support/lime-2x24.png" style="width:4px; height:96px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="height:12px; width:1px">
<img src="support/lime-2x24.png" style="height:12px; width:4px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="height:1px; width:12px">
<img src="support/lime-24x2.png" style="height:8px; width:12px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="height:6px; width:72px">
<img src="support/lime-24x2.png" style="height:6px; width:100px">
</div>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="align-self:start; height:48px; width:4px">
<img src="support/lime-2x24.png" style="align-self:start; height:24px; width:20px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; height:12px; width:1px">
<img src="support/lime-2x24.png" style="align-self:start; height:12px; width:4px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:48px; height:4px">
<img src="support/lime-24x2.png" style="justify-self:start; width:24px; height:8px">
</div>
<div class="grid" style="grid: 8px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:10px; height:1px">
<img src="support/lime-24x2.png" style="justify-self:start; width:10px; height:8px">
</div>
<br>
<div class="grid" style="grid: 96px / 20px">
<img src="support/lime-2x24.png" style="width:10px; height:120px">
<img src="support/lime-2x24.png" style="width:20px; height:96px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="width:6px; height:72px">
<img src="support/lime-2x24.png" style="width:6px; height:96px">
</div>
<div class="grid" style="grid: 8px / 20px">
<img src="support/lime-24x2.png" style="width:24px; height:2px">
<img src="support/lime-24x2.png" style="width:20px; height:8px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="width:120px; height:10px">
<img src="support/lime-24x2.png" style="width:100px; height:10px">
</div>
<div class="grid" style="grid: 48px / 6px">
<img src="support/lime-2x24.png" style="align-self:start; width:calc(2px * (80 / 24)); height:80px">
<img src="support/lime-2x24.png" style="align-self:start; width:6px; height:80px">
</div>
<div class="grid" style="grid: 96px / 4px">
<img src="support/lime-2x24.png" style="align-self:start; width:6px; height:72px">
<img src="support/lime-2x24.png" style="align-self:start; width:4px; height:72px">
</div>
<div class="grid" style="grid: 8px / 100px">
<img src="support/lime-24x2.png" style="justify-self:start; width:98px; height:calc(2px * (98 / 24))">
</div>
<div class="grid" style="grid: 4px / 10px">
<img src="support/lime-24x2.png" style="justify-self:start; width:72px; height:6px">
<img src="support/lime-24x2.png" style="justify-self:start; width:72px; height:4px">
</div>
</div>

View File

@ -16,6 +16,7 @@ body,html { color:black; background:white; font:16px/1 monospace; padding:0; mar
display: inline-grid;
border: 1px solid;
margin: 5px;
place-items: stretch;
}
.vertical-tests img { writing-mode: vertical-rl; }
.vertical-tests div { vertical-align:bottom }

View File

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

View File

@ -5,7 +5,7 @@
-->
<html><head>
<meta charset="utf-8">
<title>Reference: stretching video items with auto-margins and/or orthogonal writing-mode</title>
<title>Reference: video items with auto-margins and/or orthogonal writing-mode</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1316051">
<style type="text/css">
* { vertical-align: top; }
@ -21,6 +21,8 @@ video {
padding: 0;
margin: 0;
background: lightgrey;
width: 16px;
height: 8px;
}
.m { margin: 7px 3px 1px 5px; }
@ -37,26 +39,24 @@ video {
.ae { align-self: end; }
.ac { align-self: center; }
.mxw, .mxh { width: 32px; height: 16px; }
.vr { writing-mode: vertical-rl; }
</style>
</head>
<body>
<div class="grid"><video class="m" src="support/colors-16x8.webm" style="width:80px; height:40px"></div>
<div class="grid"><video class="hma10 je" src="support/colors-16x8.webm" style="width:80px; height:40px"></div>
<div class="grid"><video class="hmaa jc" src="support/colors-16x8.webm" style="width:80px; height:40px"></div>
<div class="grid"><video class="vr hma10 je" src="support/colors-16x8.webm" style="width:80px; height:40px"></div>
<div class="grid"><video class="vr hmaa jc" src="support/colors-16x8.webm" style="width:80px; height:40px"></div>
<div class="grid"><video class="vr" src="support/colors-16x8.webm" style="width:96px; height:48px"></div>
<div class="grid"><video class="m" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="hma10 je" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="hmaa jc" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr hma10 je" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr hmaa jc" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vma10 ae" src="support/colors-16x8.webm" style="width:90px; height:45px"></div>
<div class="grid"><video class="vmaa ac" src="support/colors-16x8.webm" style="width:90px; height:45px"></div>
<div class="grid"><video class="vr vma10 ae" src="support/colors-16x8.webm" style="width:90px; height:45px"></div>
<div class="grid"><video class="vr vmaa ac" src="support/colors-16x8.webm" style="width:90px; height:45px"></div>
<div class="grid"><video class="vr p vma10 as" src="support/colors-16x8.webm" style="width:82px; height:41px"></div>
<div class="grid"><video class="vr p vmaa ac" src="support/colors-16x8.webm" style="width:82px; height:41px"></div>
<div class="grid"><video class="vma10 ae" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vmaa ac" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr vma10 ae" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr vmaa ac" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr p vma10 ae" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr p vmaa ac" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw m" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw hma10 je" src="support/colors-16x8.webm"></div>

View File

@ -5,7 +5,7 @@
-->
<html><head>
<meta charset="utf-8">
<title>CSS Grid Test: stretching video items with auto-margins and/or orthogonal writing-mode</title>
<title>CSS Grid Test: video items with auto-margins and/or orthogonal writing-mode</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1316051">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-normal">
<link rel="match" href="grid-item-video-stretch-001-ref.html">

View File

@ -0,0 +1,113 @@
<!DOCTYPE HTML>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html><head>
<meta charset="utf-8">
<title>Reference: stretching video items with auto-margins and/or orthogonal writing-mode</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1316051">
<style type="text/css">
* { vertical-align: top; }
.grid {
display: inline-grid;
border: 3px solid grey;
grid: 50px / 100px;
padding: 10px 4px 3px 6px;
}
video {
border: 1px solid;
padding: 0;
margin: 0;
background: lightgrey;
width: 16px;
height: 8px;
}
.m { margin: 7px 3px 1px 5px; }
.p { padding: 3px 1px 5px 7px; }
.hma10 { margin: 7px 3px 1px 0; }
.hmaa { margin: 7px 0 1px 0; }
.vma10 { margin: 0 7px 3px 1px; }
.vmaa { margin: 0 7px 0 1px; }
.js { justify-self: start; }
.je { justify-self: end; }
.jc { justify-self: center; }
.as { align-self: start; }
.ae { align-self: end; }
.ac { align-self: center; }
.vr { writing-mode: vertical-rl; }
</style>
</head>
<body>
<div class="grid"><video class="m" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="hma10 je" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="hmaa jc" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr hma10 je" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr hmaa jc" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vma10 ae" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vmaa ac" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr vma10 ae" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr vmaa ac" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr p vma10 ae" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr p vmaa ac" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw m" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw hma10 je" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw hmaa jc" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw vr hma10 je" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw vr hmaa jc" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw vr" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh m" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh hma10 je" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh hmaa jc" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh vr hma10 je" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh vr hmaa jc" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh vr" src="support/colors-16x8.webm"></div>
<script>
var sizes =
[
['90px', '40px'],
['16px', '40px'],
['16px', '40px'],
['16px', '40px'],
['16px', '40px'],
['98px', '48px'],
['90px', '8px'],
['90px', '8px'],
['90px', '8px'],
['90px', '8px'],
['82px', '8px'],
['82px', '8px'],
['32px', '40px'],
['16px', '40px'],
['16px', '40px'],
['16px', '40px'],
['16px', '40px'],
['32px', '48px'],
['90px', '16px'],
['16px', '16px'],
['16px', '16px'],
['16px', '16px'],
['16px', '16px'],
['98px', '16px'],
];
var items = document.querySelectorAll('video')
for (var i = 0; i < items.length; ++i) {
let item = items[i];
item.style.width = sizes[i][0];
item.style.height = sizes[i][1];
}
</script>
</body>
</html>

View File

@ -0,0 +1,91 @@
<!DOCTYPE HTML>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html><head>
<meta charset="utf-8">
<title>CSS Grid Test: stretching video items with auto-margins and/or orthogonal writing-mode</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1316051">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-normal">
<link rel="match" href="grid-item-video-stretch-002-ref.html">
<style type="text/css">
* { vertical-align: top; }
.grid {
display: inline-grid;
border: 3px solid grey;
grid: 10px 50px 3px / 6px 100px 4px;
align-items: stretch;
justify-items: stretch;
}
video {
border: 1px solid;
padding: 0;
margin: 0;
background: lightgrey;
grid-area: 2/2;
}
.m { margin: 7px 3px 1px 5px; }
.p { padding: 3px 1px 5px 7px; }
.hma10 { margin: 7px 3px 1px auto; }
.hmaa { margin: 7px auto 1px auto; }
.vma10 { margin: auto 7px 3px 1px; }
.vmaa { margin: auto 7px auto 1px; }
.mxw { max-width: 32px; }
.mxh { max-height: 16px; }
.vr { writing-mode: vertical-rl; }
</style>
</head>
<body>
<div class="grid"><video class="m" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="hma10" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="hmaa" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr hma10" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr hmaa" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vma10" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vmaa" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr vma10" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr vmaa" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr p vma10" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="vr p vmaa" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw m" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw hma10" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw hmaa" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw vr hma10" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw vr hmaa" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxw vr" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh m" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh hma10" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh hmaa" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh vr hma10" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh vr hmaa" src="support/colors-16x8.webm"></div>
<div class="grid"><video class="mxh vr" src="support/colors-16x8.webm"></div>
<!--
<script>
function test() {
document.body.clientHeight;
var videos = document.querySelectorAll('video');
var s = ' [\n';
for (var i = 0; i < videos.length; ++i) {
let cs = window.getComputedStyle(videos[i])
s += " ['"+ cs.width + "', '" + cs.height + "'],\n";
}
s += ']';
console.log(s)
}
setTimeout(test,2000)
</script>
-->
</body>
</html>

View File

@ -107,4 +107,28 @@
<div class="item"></div>
</div>
<pre>The first 6 grids should look the same:</pre>
<div class="grid rows" style="grid: 1fr / 30px; height:83px">
<div class="item"></div>
</div>
<div class="grid rows" style="grid: 10px 1fr / 30px; height:83px">
<div class="item" style="grid-row:span 2"></div>
</div>
<div class="grid rows" style="grid: 1fr / 30px; height:83px">
<div class="item"></div>
</div>
<div class="grid rows" style="grid: 1fr 1fr / 30px; height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 1fr auto / 30px; height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 10px 1fr / 30px; height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 1fr 1fr / 30px; grid-row-gap:10px; height:83px">
<div class="item" style="grid-row:span 2"><div style="height:40px"></div></div>
<div class="item"><div style="height:40px"></div></div>
</div>
</body></html>

View File

@ -105,4 +105,28 @@
<div class="item"></div>
</div>
<pre>The first 6 grids should look the same:</pre>
<div class="grid rows" style="grid: 1fr / 30px; min-height:83px">
<div class="item"></div>
</div>
<div class="grid rows" style="grid: 10px 1fr / 30px; min-height:83px">
<div class="item" style="grid-row:span 2"></div>
</div>
<div class="grid rows" style="grid: 1fr / 30px; max-height:30px; min-height:83px">
<div class="item"></div>
</div>
<div class="grid rows" style="grid: 1fr 1fr / 30px; max-height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 1fr auto / 30px; max-height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 10px 1fr / 30px; max-height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 1fr 1fr / 30px; grid-row-gap:10px; max-height:83px">
<div class="item" style="grid-row:span 2"><div style="height:40px"></div></div>
<div class="item"><div style="height:40px"></div></div>
</div>
</body></html>

View File

@ -124,6 +124,7 @@ skip-if(Android) == grid-item-button-001.html grid-item-button-001-ref.html
== grid-item-table-stretch-004.html grid-item-table-stretch-004-ref.html
== grid-item-fieldset-stretch-001.html grid-item-fieldset-stretch-001-ref.html
skip-if(Android) == grid-item-video-stretch-001.html grid-item-video-stretch-001-ref.html # Huh, Android doesn't have webm support?
skip-if(Android) == grid-item-video-stretch-002.html grid-item-video-stretch-002-ref.html # Huh, Android doesn't have webm support?
== grid-item-input-stretch-001.html grid-item-input-stretch-001-ref.html
== grid-item-self-baseline-001.html grid-item-self-baseline-001-ref.html
random-if(http.oscpu!="Linux\u0020i686") == grid-item-content-baseline-001.html grid-item-content-baseline-001-ref.html # depends on exact Ahem baseline font metrics which seems to differ between platforms: bug 1310792

View File

@ -1 +1 @@
NSPR_4_13_1_RTM
NSPR_4_14_BETA2

View File

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

4
nsprpub/configure vendored
View File

@ -2488,8 +2488,8 @@ test -n "$target_alias" &&
program_prefix=${target_alias}-
MOD_MAJOR_VERSION=4
MOD_MINOR_VERSION=13
MOD_PATCH_VERSION=1
MOD_MINOR_VERSION=14
MOD_PATCH_VERSION=0
NSPR_MODNAME=nspr20
_HAVE_PTHREADS=
USE_PTHREADS=

View File

@ -15,8 +15,8 @@ dnl ========================================================
dnl = Defaults
dnl ========================================================
MOD_MAJOR_VERSION=4
MOD_MINOR_VERSION=13
MOD_PATCH_VERSION=1
MOD_MINOR_VERSION=14
MOD_PATCH_VERSION=0
NSPR_MODNAME=nspr20
_HAVE_PTHREADS=
USE_PTHREADS=

View File

@ -31,11 +31,11 @@ PR_BEGIN_EXTERN_C
** The format of the version string is
** "<major version>.<minor version>[.<patch level>] [<Beta>]"
*/
#define PR_VERSION "4.13.1"
#define PR_VERSION "4.14 Beta"
#define PR_VMAJOR 4
#define PR_VMINOR 13
#define PR_VPATCH 1
#define PR_BETA PR_FALSE
#define PR_VMINOR 14
#define PR_VPATCH 0
#define PR_BETA PR_TRUE
/*
** PRVersionCheck

View File

@ -155,7 +155,7 @@ PRInt32 _PR_MD_PR_POLL(PRPollDesc *pds, PRIntn npds, PRIntervalTime timeout)
pd->out_flags = 0; /* pre-condition */
/* make sure this is an NSPR supported stack */
bottom = PR_GetIdentitiesLayer(pd->fd, PR_NSPR_IO_LAYER);
// ignore a socket without PR_NSPR_IO_LAYER available.
/* ignore a socket without PR_NSPR_IO_LAYER available */
if ((NULL != bottom)
&& (_PR_FILEDESC_OPEN == bottom->secret->state))

View File

@ -3847,7 +3847,8 @@ static PRInt32 _pr_poll_with_poll(
/* now locate the NSPR layer at the bottom of the stack */
PRFileDesc *bottom = PR_GetIdentitiesLayer(
pds[index].fd, PR_NSPR_IO_LAYER);
PR_ASSERT(NULL != bottom); /* what to do about that? */
/* ignore a socket without PR_NSPR_IO_LAYER available */
pds[index].out_flags = 0; /* pre-condition */
if ((NULL != bottom)
&& (_PR_FILEDESC_OPEN == bottom->secret->state))
@ -4105,7 +4106,8 @@ static PRInt32 _pr_poll_with_select(
/* now locate the NSPR layer at the bottom of the stack */
PRFileDesc *bottom = PR_GetIdentitiesLayer(
pds[index].fd, PR_NSPR_IO_LAYER);
PR_ASSERT(NULL != bottom); /* what to do about that? */
/* ignore a socket without PR_NSPR_IO_LAYER available */
pds[index].out_flags = 0; /* pre-condition */
if ((NULL != bottom)
&& (_PR_FILEDESC_OPEN == bottom->secret->state))

View File

@ -55,8 +55,8 @@ static char *incompatible_version[] = {
"3.0", "3.0.1",
"3.1", "3.1.1", "3.1.2", "3.1.3",
"3.5", "3.5.1",
"4.13.2",
"4.14", "4.14.1",
"4.14.1",
"4.15", "4.15.1",
"10.0", "11.1", "12.14.20"
};

View File

@ -5,6 +5,7 @@
from __future__ import absolute_import, print_function, unicode_literals
from distutils.version import LooseVersion
import hashlib
import logging
from mozbuild.base import (
BuildEnvironmentNotFoundException,
@ -94,16 +95,16 @@ Please commit or stash these changes before vendoring, or re-run with `--ignore-
self.log(logging.ERROR, 'openssl', {}, "OpenSSL not found!")
return None
def vendor(self, ignore_modified=False,
build_peers_said_large_imports_were_ok=False):
self.populate_logger()
self.log_manager.enable_unstructured()
if not ignore_modified:
self.check_modified_files()
def _ensure_cargo(self):
'''
Ensures all the necessary cargo bits are installed.
Returns the path to cargo if successful, None otherwise.
'''
cargo = self.get_cargo_path()
if not self.check_cargo_version(cargo):
self.log(logging.ERROR, 'cargo_version', {}, 'Cargo >= 0.13 required (install Rust 1.12 or newer)')
return
return None
else:
self.log(logging.DEBUG, 'cargo_version', {}, 'cargo is new enough')
have_vendor = any(l.strip() == 'vendor' for l in subprocess.check_output([cargo, '--list']).splitlines())
@ -118,7 +119,145 @@ Please commit or stash these changes before vendoring, or re-run with `--ignore-
self.run_process(args=[cargo, 'install', '--force', 'cargo-vendor'],
append_env=env)
else:
self.log(logging.DEBUG, 'cargo_vendor', {}, 'sufficiently new cargo-vendor is already intalled')
self.log(logging.DEBUG, 'cargo_vendor', {}, 'sufficiently new cargo-vendor is already installed')
return cargo
def _check_licenses(self, vendor_dir):
# A whitelist of acceptable license identifiers for the
# packages.license field from https://spdx.org/licenses/. Cargo
# documentation claims that values are checked against the above
# list and that multiple entries can be separated by '/'. We
# choose to list all combinations instead for the sake of
# completeness and because some entries below obviously do not
# conform to the format prescribed in the documentation.
#
# It is insufficient to have additions to this whitelist reviewed
# solely by a build peer; any additions must be checked by somebody
# competent to review licensing minutiae.
LICENSE_WHITELIST = [
'Apache-2.0',
'Apache-2.0 / MIT',
'Apache-2.0/MIT',
'Apache-2 / MIT',
'BSD-3-Clause', # bindgen (only used at build time)
'CC0-1.0',
'ISC',
'ISC/Apache-2.0',
'MIT',
'MIT / Apache-2.0',
'MIT/Apache-2.0',
'MIT OR Apache-2.0',
'MPL-2.0',
'Unlicense/MIT',
]
# This whitelist should only be used for packages that use a
# license-file and for which the license-file entry has been
# reviewed. The table is keyed by package names and maps to the
# sha256 hash of the license file that we reviewed.
#
# As above, it is insufficient to have additions to this whitelist
# reviewed solely by a build peer; any additions must be checked by
# somebody competent to review licensing minutiae.
LICENSE_FILE_PACKAGE_WHITELIST = {
# Google BSD-like license; some directories have separate licenses
'gamma-lut': '1f04103e3a61b91343b3f9d2ed2cc8543062917e2cc7d52a739ffe6429ccaf61',
# MIT
'deque': '6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb',
}
LICENSE_LINE_RE = re.compile(r'\s*license\s*=\s*"([^"]+)"')
LICENSE_FILE_LINE_RE = re.compile(r'\s*license[-_]file\s*=\s*"([^"]+)"')
def check_package(package):
self.log(logging.DEBUG, 'package_check', {},
'Checking license for {}'.format(package))
toml_file = os.path.join(vendor_dir, package, 'Cargo.toml')
# pytoml is not sophisticated enough to parse Cargo.toml files
# with [target.'cfg(...)'.dependencies sections, so we resort
# to scanning individual lines.
with open(toml_file, 'r') as f:
license_lines = [l for l in f if l.strip().startswith(b'license')]
license_matches = list(filter(lambda x: x, [LICENSE_LINE_RE.match(l) for l in license_lines]))
license_file_matches = list(filter(lambda x: x, [LICENSE_FILE_LINE_RE.match(l) for l in license_lines]))
# License information is optional for crates to provide, but
# we require it.
if not license_matches and not license_file_matches:
self.log(logging.ERROR, 'package_no_license', {},
'package {} does not provide a license'.format(package))
return False
# The Cargo.toml spec suggests that crates should either have
# `license` or `license-file`, but not both. We might as well
# be defensive about that, though.
if len(license_matches) > 1 or len(license_file_matches) > 1 or \
license_matches and license_file_matches:
self.log(logging.ERROR, 'package_many_licenses', {},
'package {} provides too many licenses'.format(package))
return False
if license_matches:
license = license_matches[0].group(1)
self.log(logging.DEBUG, 'package_license', {},
'has license {}'.format(license))
if license not in LICENSE_WHITELIST:
self.log(logging.ERROR, 'package_license_error', {},
'''Package {} has a non-approved license: {}.
Please request license review on the package's license. If the package's license
is approved, please add it to the whitelist of suitable licenses.
'''.format(package, license))
return False
else:
license_file = license_file_matches[0].group(1)
self.log(logging.DEBUG, 'package_license_file', {},
'has license-file {}'.format(license_file))
if package not in LICENSE_FILE_PACKAGE_WHITELIST:
self.log(logging.ERROR, 'package_license_file_unknown', {},
'''Package {} has an unreviewed license file: {}.
Please request review on the provided license; if approved, the package can be added
to the whitelist of packages whose licenses are suitable.
'''.format(package, license_file))
return False
approved_hash = LICENSE_FILE_PACKAGE_WHITELIST[package]
license_contents = open(os.path.join(vendor_dir, package, license_file), 'r').read()
current_hash = hashlib.sha256(license_contents).hexdigest()
if current_hash != approved_hash:
self.log(logging.ERROR, 'package_license_file_mismatch', {},
'''Package {} has changed its license file: {} (hash {}).
Please request review on the provided license; if approved, please update the
license file's hash.
'''.format(package, license_file, current_hash))
return False
return True
# Force all of the packages to be checked for license information
# before reducing via `all`, so all license issues are found in a
# single `mach vendor rust` invocation.
results = [check_package(p) for p in os.listdir(vendor_dir)]
return all(results)
def vendor(self, ignore_modified=False,
build_peers_said_large_imports_were_ok=False):
self.populate_logger()
self.log_manager.enable_unstructured()
if not ignore_modified:
self.check_modified_files()
cargo = self._ensure_cargo()
if not cargo:
return
relative_vendor_dir = 'third_party/rust'
vendor_dir = mozpath.join(self.topsrcdir, relative_vendor_dir)
self.log(logging.INFO, 'rm_vendor_dir', {}, 'rm -rf %s' % vendor_dir)
@ -135,6 +274,12 @@ Please commit or stash these changes before vendoring, or re-run with `--ignore-
# We do an |update -p| here to regenerate the Cargo.lock file with minimal changes. See bug 1324462
self._run_command_in_srcdir(args=[cargo, 'update', '--manifest-path', mozpath.join(path, 'Cargo.toml'), '-p', lib])
self._run_command_in_srcdir(args=[cargo, 'vendor', '--sync', mozpath.join(path, 'Cargo.lock'), vendor_dir])
if not self._check_licenses(vendor_dir):
self.log(logging.ERROR, 'license_check_failed', {},
'''The changes from `mach vendor rust` will NOT be added to version control.''')
sys.exit(1)
self.repository.add_remove_files(vendor_dir)
# 100k is a reasonable upper bound on source file size.

View File

@ -1157,4 +1157,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
static const int32_t kUnknownId = -1;
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1498057610195000);
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1498143261115000);

View File

@ -3,6 +3,7 @@
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 118" data: no]
0g.org.uk: could not connect to host
0p.no: did not receive HSTS header
0x.cx: could not connect to host
0x0a.net: could not connect to host
0x1337.eu: could not connect to host
0x44.net: did not receive HSTS header
@ -28,7 +29,6 @@
1xcess.com: did not receive HSTS header
206rc.net: max-age too low: 2592000
247loan.com: max-age too low: 0
247quickbooks.com: did not receive HSTS header
24hourpaint.com: could not connect to host
25daysof.io: could not connect to host
263.info: could not connect to host
@ -38,7 +38,7 @@
2or3.tk: could not connect to host
2programmers.net: could not connect to host
2smart4food.com: did not receive HSTS header
2ss.jp: did not receive HSTS header
2ss.jp: could not connect to host
300651.ru: did not receive HSTS header
300m.com: did not receive HSTS header
301.website: could not connect to host
@ -149,6 +149,7 @@ aether.pw: could not connect to host
aevpn.net: could not connect to host
aficotroceni.ro: did not receive HSTS header
afp548.tk: could not connect to host
afyou.co.kr: could not connect to host
agalaxyfarfaraway.co.uk: could not connect to host
agbremen.de: did not receive HSTS header
agentseeker.ca: did not receive HSTS header
@ -195,7 +196,7 @@ alittlebitcheeky.com: did not receive HSTS header
aljaspod.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 118" data: no]
alkami.com: did not receive HSTS header
all-subtitles.com: did not receive HSTS header
all.tf: did not receive HSTS header
all.tf: could not connect to host
alldaymonitoring.com: could not connect to host
allforyou.at: could not connect to host
allinnote.com: could not connect to host
@ -397,7 +398,6 @@ axado.com.br: did not receive HSTS header
axeny.com: did not receive HSTS header
axg.io: could not connect to host
az.search.yahoo.com: did not receive HSTS header
azazy.net: max-age too low: 2592000
azprep.us: could not connect to host
azuxul.fr: could not connect to host
b3orion.com: max-age too low: 0
@ -411,7 +411,6 @@ babymasaze.cz: did not receive HSTS header
babysaying.me: max-age too low: 6000
bacchanallia.com: could not connect to host
back-bone.nl: did not receive HSTS header
bacon-monitoring.org: could not connect to host
badcronjob.com: could not connect to host
badenhard.eu: could not connect to host
badkamergigant.com: could not connect to host
@ -643,6 +642,7 @@ buildci.asia: could not connect to host
buildify.co.za: could not connect to host
buildsaver.co.za: did not receive HSTS header
built.by: did not receive HSTS header
bul3seas.eu: could not connect to host
bullbits.com: could not connect to host
bulletpoint.cz: could not connect to host
bulmafox.com: could not connect to host
@ -679,6 +679,7 @@ bysymphony.com: max-age too low: 0
byte.wtf: did not receive HSTS header
bytepark.de: did not receive HSTS header
bytesund.biz: could not connect to host
bzv-fr.eu: could not connect to host
c1yd3i.me: could not connect to host
c3b.info: could not connect to host
cabarave.com: could not connect to host
@ -706,7 +707,6 @@ cancelmyprofile.com: did not receive HSTS header
candicontrols.com: did not receive HSTS header
candratech.com: could not connect to host
candylion.rocks: could not connect to host
canfly.org: could not connect to host
cannyfoxx.me: could not connect to host
canyonshoa.com: did not receive HSTS header
capecycles.co.za: did not receive HSTS header
@ -737,7 +737,7 @@ casino-cashflow.ru: did not receive HSTS header
casinostest.com: did not receive HSTS header
casioshop.eu: could not connect to host
casovi.cf: could not connect to host
catarsisvr.com: did not receive HSTS header
catarsisvr.com: could not connect to host
catinmay.com: could not connect to host
catnapstudios.com: could not connect to host
caveclan.org: did not receive HSTS header
@ -767,6 +767,7 @@ cesidianroot.eu: could not connect to host
cevrimici.com: could not connect to host
cfcproperties.com: did not receive HSTS header
cfetengineering.com: could not connect to host
cfoitplaybook.com: could not connect to host
cg.search.yahoo.com: did not receive HSTS header
chainmonitor.com: could not connect to host
championsofregnum.com: did not receive HSTS header
@ -780,6 +781,7 @@ charityclear.com: did not receive HSTS header
charnleyhouse.co.uk: max-age too low: 604800
chartpen.com: did not receive HSTS header
chartstoffarm.de: did not receive HSTS header
chat-porc.eu: could not connect to host
chatbot.me: did not receive HSTS header
chateauconstellation.ch: did not receive HSTS header
chatme.im: did not receive HSTS header
@ -819,7 +821,6 @@ chrisupjohn.com: could not connect to host
chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless)
chrome.google.com: did not receive HSTS header (error ignored - included regardless)
chroniclesofgeorge.com: did not receive HSTS header
chrst.ph: could not connect to host
chua.cf: could not connect to host
chulado.com: did not receive HSTS header
cidr.ml: could not connect to host
@ -837,7 +838,6 @@ clara-baumert.de: could not connect to host
classicsandexotics.com: did not receive HSTS header
classicspublishing.com: could not connect to host
clcleaningco.com: could not connect to host
cldly.com: could not connect to host
cleanexperts.co.uk: could not connect to host
cleaningsquad.ca: max-age too low: 0
cleanmta.com: could not connect to host
@ -852,7 +852,6 @@ clint.id.au: max-age too low: 0
clintonbloodworth.com: did not receive HSTS header
clintonbloodworth.io: could not connect to host
clintwilson.technology: max-age too low: 2592000
clipped4u.com: could not connect to host
cloud.wtf: could not connect to host
cloudapi.vc: could not connect to host
cloudcert.org: did not receive HSTS header
@ -860,14 +859,12 @@ cloudcy.net: could not connect to host
clouddesktop.co.nz: could not connect to host
cloudey.net: did not receive HSTS header
cloudflare.com: did not receive HSTS header
cloudia.org: could not connect to host
cloudimag.es: could not connect to host
cloudlink.club: could not connect to host
cloudns.com.au: could not connect to host
cloudspotterapp.com: did not receive HSTS header
cloudstoragemaus.com: could not connect to host
cloudstorm.me: could not connect to host
cloudup.com: did not receive HSTS header
cloudwalk.io: did not receive HSTS header
cloverleaf.net: max-age too low: 0
clubmate.rocks: could not connect to host
@ -901,7 +898,6 @@ codelayer.ca: could not connect to host
codelitmus.com: did not receive HSTS header
codemonkeyrawks.net: could not connect to host
codepoet.de: could not connect to host
codepult.com: could not connect to host
codepx.com: did not receive HSTS header
codewild.de: could not connect to host
codewiththepros.org: could not connect to host
@ -922,7 +918,6 @@ coloradocomputernetworking.net: could not connect to host
combron.nl: did not receive HSTS header
comfortdom.ua: did not receive HSTS header
comfortticket.de: did not receive HSTS header
comfy.moe: did not receive HSTS header
comicspines.com: could not connect to host
comotalk.com: could not connect to host
compalytics.com: could not connect to host
@ -1000,10 +995,9 @@ crypt.guru: could not connect to host
crypticshell.co.uk: could not connect to host
cryptify.eu: could not connect to host
cryptobin.org: could not connect to host
cryptojar.io: could not connect to host
cryptojar.io: did not receive HSTS header
cryptolab.pro: could not connect to host
cryptolab.tk: could not connect to host
cryptoparty.at: could not connect to host
cryptopartyatx.org: could not connect to host
cryptopush.com: did not receive HSTS header
crysadm.com: max-age too low: 1
@ -1011,6 +1005,7 @@ crystalclassics.co.uk: did not receive HSTS header
csapak.com: could not connect to host
csawctf.poly.edu: could not connect to host
csfs.org.uk: could not connect to host
csgf.ru: did not receive HSTS header
csgodicegame.com: did not receive HSTS header
csgoelemental.com: could not connect to host
csgokings.eu: could not connect to host
@ -1052,7 +1047,7 @@ dah5.com: did not receive HSTS header
dailystormerpodcasts.com: did not receive HSTS header
daimadi.com: could not connect to host
dakrib.net: could not connect to host
daku.gdn: could not connect to host
daku.gdn: did not receive HSTS header
dalfiume.it: [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 118" data: no]
dalingk.co: could not connect to host
damedrogy.cz: could not connect to host
@ -1158,6 +1153,7 @@ detector.exposed: could not connect to host
detest.org: could not connect to host
dethemium.com: could not connect to host
deuxvia.com: could not connect to host
devafterdark.com: could not connect to host
devcu.com: could not connect to host
devcu.net: could not connect to host
devincrow.me: could not connect to host
@ -1170,6 +1166,7 @@ dhome.at: did not receive HSTS header
dhpcs.com: did not receive HSTS header
dhpiggott.net: did not receive HSTS header
diablotine.rocks: could not connect to host
diagnostix.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 118" data: no]
diarbag.us: could not connect to host
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 118" data: no]
die-partei-reutlingen.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 118" data: no]
@ -1184,7 +1181,6 @@ digitalriver.tk: could not connect to host
digitalskillswap.com: could not connect to host
dim.lighting: could not connect to host
dinamoelektrik.com: max-age too low: 0
dingcc.com: did not receive HSTS header
dinkum.online: could not connect to host
discoveringdocker.com: did not receive HSTS header
discovery.lookout.com: did not receive HSTS header
@ -1213,6 +1209,7 @@ do-do.tk: could not connect to host
do.gd: could not connect to host
do.search.yahoo.com: did not receive HSTS header
dobet.in: could not connect to host
dobrev.family: could not connect to host
docid.io: could not connect to host
docket.news: could not connect to host
docset.io: could not connect to host
@ -1269,7 +1266,6 @@ ds-christiansen.de: did not receive HSTS header
dshiv.io: could not connect to host
dubrovskiy.net: could not connect to host
dubrovskiy.pro: could not connect to host
duelysthub.com: could not connect to host
duesee.org: could not connect to host
dullsir.com: did not receive HSTS header
dutchessuganda.com: did not receive HSTS header
@ -1321,7 +1317,6 @@ edk.com.tr: did not receive HSTS header
edmodo.com: did not receive HSTS header
edp-collaborative.com: max-age too low: 2500
eduvance.in: did not receive HSTS header
edwards.me.uk: could not connect to host
effectiveosgi.com: could not connect to host
efficienthealth.com: did not receive HSTS header
effortlesshr.com: did not receive HSTS header
@ -1333,7 +1328,6 @@ ehito.ovh: could not connect to host
ehrenamt-skpfcw.de: could not connect to host
eicfood.com: could not connect to host
eidolonhost.com: did not receive HSTS header
eisp.it: could not connect to host
ekbanden.nl: could not connect to host
elaintehtaat.fi: did not receive HSTS header
elan-organics.com: did not receive HSTS header
@ -1351,7 +1345,7 @@ elenoon.ir: did not receive HSTS header
elgacien.de: could not connect to host
elimdengelen.com: did not receive HSTS header
elitefishtank.com: could not connect to host
elnutricionista.es: did not receive HSTS header
elnutricionista.es: could not connect to host
eloanpersonal.com: max-age too low: 0
elpo.xyz: could not connect to host
elsamakhin.com: could not connect to host
@ -1381,7 +1375,6 @@ enefan.jp: could not connect to host
enersec.co.uk: could not connect to host
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 118" data: no]
engg.ca: could not connect to host
enginepit.com: could not connect to host
enginsight.com: did not receive HSTS header
enigmacpt.com: did not receive HSTS header
enigmail.net: did not receive HSTS header
@ -1445,7 +1438,6 @@ eulerpi.io: could not connect to host
eupho.me: could not connect to host
euroshop24.net: could not connect to host
evafojtova.cz: did not receive HSTS header
evalesc.com: could not connect to host
evantage.org: could not connect to host
evdenevenakliyatankara.pw: did not receive HSTS header
everybooks.com: max-age too low: 60
@ -1502,6 +1494,7 @@ familie-zimmermann.at: could not connect to host
familjenm.se: could not connect to host
fanyl.cn: could not connect to host
farhadexchange.com: did not receive HSTS header
farhood.org: did not receive HSTS header
fashioncare.cz: did not receive HSTS header
fasset.jp: could not connect to host
fastograph.com: could not connect to host
@ -1557,6 +1550,7 @@ fitiapp.com: could not connect to host
fitnesswerk.de: could not connect to host
five.vn: did not receive HSTS header
fivestarsitters.com: did not receive HSTS header
fivezerocreative.com: did not receive HSTS header
fixatom.com: did not receive HSTS header
fixingdns.com: did not receive HSTS header
fj.search.yahoo.com: did not receive HSTS header
@ -1630,7 +1624,7 @@ freesounding.ru: could not connect to host
freethought.org.au: could not connect to host
freeutopia.org: did not receive HSTS header
frenzel.dk: could not connect to host
freqlabs.com: could not connect to host
freqlabs.com: did not receive HSTS header
freshfind.xyz: could not connect to host
freshlymind.com: did not receive HSTS header
fretscha.com: could not connect to host
@ -1658,7 +1652,6 @@ furiffic.com: did not receive HSTS header
furnation.com: could not connect to host
furry.be: max-age too low: 86400
fusedrops.com: could not connect to host
fushee.com: could not connect to host
fusionmate.com: could not connect to host
futbol11.com: did not receive HSTS header
futurenda.com: could not connect to host
@ -1678,7 +1671,6 @@ g5led.nl: could not connect to host
gabber.scot: could not connect to host
gaelleetarnaud.com: did not receive HSTS header
gafachi.com: could not connect to host
gaiserik.com: could not connect to host
gakkainavi.jp: did not receive HSTS header
gakkainavi4.com: could not connect to host
gakkainavi4.net: did not receive HSTS header
@ -1715,7 +1707,7 @@ 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
gendrin.com: could not connect to host
gensonline.eu: 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
@ -1751,7 +1743,6 @@ getremembrall.com: could not connect to host
getsello.com: could not connect to host
getwashdaddy.com: could not connect to host
gfm.tech: could not connect to host
gfournier.ca: could not connect to host
gfwsb.ml: could not connect to host
ggss.ml: could not connect to host
gh16.com.ar: could not connect to host
@ -1847,6 +1838,7 @@ gresb.com: did not receive HSTS header
gribani.com: could not connect to host
grigalanzsoftware.com: could not connect to host
gripopgriep.net: could not connect to host
groetzner.net: could not connect to host
grossmann.gr: could not connect to host
groups.google.com: did not receive HSTS header (error ignored - included regardless)
grunex.com: did not receive HSTS header
@ -1862,7 +1854,6 @@ gtlfsonlinepay.com: did not receive HSTS header
gtraxapp.com: could not connect to host
gts-schulsoftware.de: did not receive HSTS header
guava.studio: did not receive HSTS header
guge.gq: could not connect to host
gugga.dk: did not receive HSTS header
guilde-vindicta.fr: did not receive HSTS header
gulenet.com: could not connect to host
@ -1870,8 +1861,6 @@ gunnarhafdal.com: did not receive HSTS header
gurom.lv: could not connect to host
gurusupe.com: could not connect to host
guso.gq: could not connect to host
guso.ml: could not connect to host
guso.tech: could not connect to host
gussi.is: did not receive HSTS header
gvt2.com: could not connect to host (error ignored - included regardless)
gvt3.com: could not connect to host (error ignored - included regardless)
@ -1897,6 +1886,7 @@ hackest.org: did not receive HSTS header
hackit.im: could not connect to host
hadzic.co: could not connect to host
haeckdesign.com: did not receive HSTS header
haeckl.eu: could not connect to host
hahayidu.org: could not connect to host
haitschi.com: could not connect to host
haitschi.de: could not connect to host
@ -1907,12 +1897,11 @@ haku.moe: could not connect to host
hakugin.org: could not connect to host
halo.red: could not connect to host
hancc.net: could not connect to host
handiworker.com: could not connect to host
hanfu.la: could not connect to host
hang333.pw: did not receive HSTS header
hanimalis.fr: could not connect to host
hansen.hn: could not connect to host
hao2taiwan.com: max-age too low: 0
hao2taiwan.com: could not connect to host
haoyugao.com: could not connect to host
hapijs.cn: could not connect to host
hapissl.com: could not connect to host
@ -1963,7 +1952,6 @@ hemdal.se: could not connect to host
hencagon.com: could not connect to host
henriknoerr.com: could not connect to host
henry.gg: could not connect to host
hermes-net.de: could not connect to host
herrenfahrt.com: did not receive HSTS header
herzbotschaft.de: did not receive HSTS header
heutger.net: did not receive HSTS header
@ -1985,6 +1973,7 @@ hilnu.tk: could not connect to host
hipercultura.com: did not receive HSTS header
hiphopconvention.nl: could not connect to host
hirake55.com: could not connect to host
historia-arte.com: did not receive HSTS header
hitoy.org: did not receive HSTS header
hittipps.com: did not receive HSTS header
hlyue.com: did not receive HSTS header
@ -2047,6 +2036,7 @@ hydra.ws: could not connect to host
hydronium.cf: could not connect to host
hydronium.ga: could not connect to host
hydronium.me: could not connect to host
hydronium.ml: could not connect to host
hydronium.tk: could not connect to host
hyper69.com: did not receive HSTS header
i-jp.net: could not connect to host
@ -2111,6 +2101,7 @@ immoprotect.ca: did not receive HSTS header
immortals-co.com: did not receive HSTS header
immoverkauf24.at: did not receive HSTS header
immoverkauf24.de: did not receive HSTS header
immunicity.eu: could not connect to host
immunicity.info: could not connect to host
immunicity.press: could not connect to host
immunicity.today: did not receive HSTS header
@ -2119,7 +2110,6 @@ immunicity.works: did not receive HSTS header
immunicity.world: did not receive HSTS header
imolug.org: did not receive HSTS header
imouto.my: max-age too low: 5184000
imouyang.com: did not receive HSTS header
imperialwebsolutions.com: did not receive HSTS header
imu.li: did not receive HSTS header
imusic.dk: did not receive HSTS header
@ -2137,6 +2127,7 @@ 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
infosoph.org: did not receive HSTS header
infotics.es: did not receive HSTS header
injigo.com: did not receive HSTS header
inkable.com.au: did not receive HSTS header
@ -2160,14 +2151,12 @@ institutoflordelavida.com: could not connect to host
intel.li: could not connect to host
interference.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 118" data: no]
interlun.com: could not connect to host
internect.co.za: did not receive HSTS header
internetcasinos.de: could not connect to host
internetcensus.org: could not connect to host
interserved.com: did not receive HSTS header
intex.es: max-age too low: 0
intim-uslugi-kazan.net: could not connect to host
intimtoy.com.ua: could not connect to host
intocities.de: could not connect to host
intranetsec.fr: could not connect to host
intrp.net: did not receive HSTS header
inverselink-user-content.com: could not connect to host
@ -2175,7 +2164,6 @@ inverselink.com: could not connect to host
invictusmc.uk: did not receive HSTS header
invite24.pro: could not connect to host
inwesttitle.com: max-age too low: 0
ioiart.eu: could not connect to host
ionx.co.uk: did not receive HSTS header
iop.intuit.com: max-age too low: 86400
iora.fr: could not connect to host
@ -2203,6 +2191,7 @@ iseek.biz: max-age too low: 0
ishillaryclintoninprisonyet.com: could not connect to host
isitamor.pm: could not connect to host
iskaz.rs: did not receive HSTS header
isntall.us: could not connect to host
isogram.nl: could not connect to host
israkurort.com: did not receive HSTS header
isslshop.com: could not connect to host
@ -2227,7 +2216,6 @@ ivi-fertility.com: max-age too low: 0
ivi.es: max-age too low: 0
ivk.website: could not connect to host
ivo.co.za: could not connect to host
ixec2.tk: could not connect to host
izdiwho.com: could not connect to host
izolight.ch: could not connect to host
izoox.com: did not receive HSTS header
@ -2265,6 +2253,7 @@ janus-engineering.de: did not receive HSTS header
japlex.com: could not connect to host
jaqen.ch: could not connect to host
jardins-utopie.net: could not connect to host
jaredfernandez.com: could not connect to host
jaroslavtrsek.cz: did not receive HSTS header
jarsater.com: could not connect to host
jartza.org: could not connect to host
@ -2327,15 +2316,18 @@ jollausers.de: could not connect to host
jonas-keidel.de: did not receive HSTS header
jonasgroth.se: did not receive HSTS header
jonathan.ir: could not connect to host
jondarby.com: did not receive HSTS header
jonn.me: could not connect to host
joostbovee.nl: did not receive HSTS header
jordanhamilton.me: could not connect to host
joretapo.fr: did not receive HSTS header
jornane.me: could not connect to host
josahrens.me: could not connect to host
joshi.su: could not connect to host
joshstroup.me: could not connect to host
jottit.com: could not connect to host
jpbike.cz: could not connect to host
jpcdi.com: could not connect to host
jrc9.ca: did not receive HSTS header
jrgold.me: could not connect to host
jrmd.io: could not connect to host
@ -2365,6 +2357,7 @@ k-dev.de: could not connect to host
ka-clan.com: could not connect to host
kabinapp.com: could not connect to host
kabuabc.com: did not receive HSTS header
kabus.org: could not connect to host
kadioglumakina.com.tr: did not receive HSTS header
kaela.design: could not connect to host
kahopoon.net: could not connect to host
@ -2374,6 +2367,7 @@ kaneo-gmbh.de: did not receive HSTS header
kaplatz.is: could not connect to host
kapucini.si: max-age too low: 0
karaoketonight.com: could not connect to host
karhm.com: could not connect to host
karhukamera.com: could not connect to host
kasilag.me: did not receive HSTS header
katiaetdavid.fr: could not connect to host
@ -2469,6 +2463,7 @@ krayx.com: could not connect to host
kreavis.com: did not receive HSTS header
kredite.sale: could not connect to host
kriegt.es: did not receive HSTS header
kristikala.nl: could not connect to host
krizevci.info: did not receive HSTS header
kroetenfuchs.de: could not connect to host
kropkait.pl: could not connect to host
@ -2501,7 +2496,7 @@ kz.search.yahoo.com: did not receive HSTS header
kzjnet.com: could not connect to host
l2guru.ru: could not connect to host
labaia.info: could not connect to host
labina.com.tr: did not receive HSTS header
labina.com.tr: could not connect to host
laboiteapc.fr: did not receive HSTS header
labordata.io: did not receive HSTS header
laborie.io: could not connect to host
@ -2542,7 +2537,6 @@ leadership9.com: could not connect to host
leardev.de: did not receive HSTS header
learnfrenchfluently.com: did not receive HSTS header
learningorder.com: could not connect to host
lebal.se: did not receive HSTS header
lechiennoir.net: did not receive HSTS header
ledgerscope.net: could not connect to host
leermotorrijden.nl: max-age too low: 300
@ -2671,7 +2665,7 @@ lt.search.yahoo.com: did not receive HSTS header
ltbytes.com: could not connect to host
lu.search.yahoo.com: did not receive HSTS header
lucaterzini.com: could not connect to host
ludwiggrill.de: could not connect to host
ludwiggrill.de: did not receive HSTS header
lufthansaexperts.com: max-age too low: 2592000
luine.xyz: did not receive HSTS header
luis-checa.com: could not connect to host
@ -2746,7 +2740,6 @@ mansion-note.com: did not receive HSTS header
maomaofuli.vip: could not connect to host
maple5.com: did not receive HSTS header
marchagen.nl: did not receive HSTS header
marcoececilia.it: could not connect to host
marcofinke.de: could not connect to host
marcontrol.com: did not receive HSTS header
marcosteixeira.tk: could not connect to host
@ -3040,7 +3033,6 @@ mypension.ca: could not connect to host
myphonebox.de: could not connect to host
mysecretrewards.com: did not receive HSTS header
mystery-science-theater-3000.de: did not receive HSTS header
mythslegendscollection.com: did not receive HSTS header
mytweeps.com: could not connect to host
myvirtualserver.com: max-age too low: 2592000
myzone.com: did not receive HSTS header
@ -3090,6 +3082,7 @@ near.st: did not receive HSTS header
nedzad.me: could not connect to host
neels.ch: [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 118" data: no]
neftaly.com: did not receive HSTS header
negai.moe: 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
@ -3116,12 +3109,12 @@ neuronfactor.com: [Exception... "Component returned failure code: 0x80004005 (NS
neutralox.com: did not receive HSTS header
never-afk.de: did not receive HSTS header
neveta.com: could not connect to host
new.travel.pl: did not receive HSTS header
newcitygas.ca: max-age too low: 0
newgenerationplus.org: could not connect to host
newhdmovies.io: did not receive HSTS header
newkaliningrad.ru: did not receive HSTS header
newlooknow.com: did not receive HSTS header
newmelalife.com: did not receive HSTS header
newportpropertygroup.com: could not connect to host
newtonwarp.com: could not connect to host
nextcloud.org: could not connect to host
@ -3244,12 +3237,11 @@ ochaken.cf: could not connect to host
odin.xxx: did not receive HSTS header
odinoffice.no: did not receive HSTS header
oe8.bet: could not connect to host
oeko-bundesfreiwilligendienst-sh.de: did not receive HSTS header
oeko-bundesfreiwilligendienst.de: did not receive HSTS header
ofcourselanguages.com: could not connect to host
offenedialoge.de: max-age too low: 2592000
offshore-firma.org: could not connect to host
ogogoshop.com: could not connect to host
oguya.ch: could not connect to host
oishioffice.com: did not receive HSTS header
okane.love: could not connect to host
okok-rent.com: could not connect to host
@ -3260,6 +3252,7 @@ oldoakflorist.com: could not connect to host
oliverdunk.com: did not receive HSTS header
ollehbizev.co.kr: could not connect to host
ollie.io: did not receive HSTS header
ollies.cloud: could not connect to host
omacostudio.com: could not connect to host
omgaanmetidealen.com: could not connect to host
ominto.com: max-age too low: 0
@ -3361,7 +3354,6 @@ owncloud.help: could not connect to host
ownmovies.fr: could not connect to host
oxygenabsorbers.com: did not receive HSTS header
oxynux.fr: could not connect to host
oxynux.xyz: could not connect to host
p.linode.com: could not connect to host
p8r.de: could not connect to host
pa.search.yahoo.com: did not receive HSTS header
@ -3458,7 +3450,7 @@ pet-nsk.ru: could not connect to host
petchart.net: could not connect to host
petit.site: could not connect to host
petplum.com: did not receive HSTS header
petrachuk.ru: did not receive HSTS header
petrachuk.ru: could not connect to host
petravdbos.nl: did not receive HSTS header
petrolplus.ru: did not receive HSTS header
petrovsky.pro: could not connect to host
@ -3466,7 +3458,6 @@ petsittersservices.com: could not connect to host
pettsy.com: could not connect to host
pewboards.com: could not connect to host
pexieapp.com: did not receive HSTS header
peytonfarrar.com: did not receive HSTS header
pflege.de: did not receive HSTS header
pgpm.io: could not connect to host
pharmgkb.org: could not connect to host
@ -3476,7 +3467,6 @@ phoebe.co.nz: did not receive HSTS header
phonenumberinfo.co.uk: could not connect to host
phongmay24h.com: could not connect to host
photoblogverona.com: could not connect to host
phoxmeh.com: could not connect to host
php-bach.org: could not connect to host
phpfashion.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 118" data: no]
phryanjr.com: could not connect to host
@ -3516,7 +3506,7 @@ planpharmacy.com: could not connect to host
platform.lookout.com: could not connect to host
play.google.com: did not receive HSTS header (error ignored - included regardless)
playflick.com: did not receive HSTS header
playkh.com: did not receive HSTS header
playkh.com: could not connect to host
playmaker.io: could not connect to host
playmyplay.com: did not receive HSTS header
playnation.io: could not connect to host
@ -3551,12 +3541,12 @@ polypho.nyc: could not connect to host
pompompoes.com: could not connect to host
pontualcomp.com: max-age too low: 2592000
poolsandstuff.com: did not receive HSTS header
poolvilla-margarita.net: could not connect to host
poon.tech: could not connect to host
porno-gif.ru: did not receive HSTS header
portalplatform.net: did not receive HSTS header
poshpak.com: max-age too low: 86400
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
potatoheads.net: could not connect to host
@ -3577,6 +3567,7 @@ prefontaine.name: could not connect to host
prego-shop.de: did not receive HSTS header
preissler.co.uk: could not connect to host
prelist.org: did not receive HSTS header
prescriptiondrugs.com: could not connect to host
pressfreedomfoundation.org: did not receive HSTS header
pretzlaff.info: did not receive HSTS header
preworkout.me: could not connect to host
@ -3592,6 +3583,7 @@ pro-zone.com: could not connect to host
prodpad.com: did not receive HSTS header
professionalboundaries.com: did not receive HSTS header
profi-durchgangsmelder.de: did not receive HSTS header
profpay.com: could not connect to host
profundr.com: could not connect to host
progblog.net: could not connect to host
progg.no: could not connect to host
@ -3699,6 +3691,7 @@ rbhighinc.org: could not connect to host
rc-rp.com: did not receive HSTS header
rc4.io: did not receive HSTS header
rcafox.com: could not connect to host
rcorporation.be: did not receive HSTS header
rcpcbd.com: did not receive HSTS header
rdns.im: did not receive HSTS header
re-customer.net: did not receive HSTS header
@ -3759,6 +3752,7 @@ restchart.com: did not receive HSTS header
retrotracks.net: max-age too low: 0
revealdata.com: did not receive HSTS header
revello.org: did not receive HSTS header
revensoftware.com: could not connect to host
reverie.pw: could not connect to host
reviews.anime.my: max-age too low: 5184000
revtut.net: did not receive HSTS header
@ -3806,6 +3800,7 @@ rodosto.com: could not connect to host
roeper.party: could not connect to host
roesemann.email: could not connect to host
roguelikecenter.fr: did not receive HSTS header
roguesignal.net: did not receive HSTS header
rolemaster.net: did not receive HSTS header
romans-place.me.uk: did not receive HSTS header
romulusapp.com: could not connect to host
@ -3981,7 +3976,6 @@ semenkovich.com: did not receive HSTS header
semps-servers.de: could not connect to host
semps.de: did not receive HSTS header
senedirect.com: did not receive HSTS header
sensepixel.com: could not connect to host
sensiblemn.org: could not connect to host
sensibus.com: did not receive HSTS header
seo.consulting: did not receive HSTS header
@ -3998,6 +3992,7 @@ servergno.me: did not receive HSTS header
servermonkey.nl: could not connect to host
seryo.moe: could not connect to host
seryo.net: could not connect to host
sesha.co.za: 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
@ -4063,7 +4058,6 @@ simbast.com: could not connect to host
simod.org: could not connect to host
simon.butcher.name: max-age too low: 2629743
simongong.net: did not receive HSTS header
simonhirscher.de: could not connect to host
simpan.id: could not connect to host
simpleai.net: max-age too low: 600
simplefraud.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 118" data: no]
@ -4107,7 +4101,6 @@ slightfuture.click: could not connect to host
slix.io: could not connect to host
slope.haus: could not connect to host
slovakiana.sk: did not receive HSTS header
slowfood.es: could not connect to host
sluitkampzeist.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 118" data: no]
slycurity.de: could not connect to host
smart-mirror.de: did not receive HSTS header
@ -4150,6 +4143,7 @@ socialdevelop.biz: max-age too low: 604800
socialhams.net: did not receive HSTS header
socialhead.io: could not connect to host
socialspirit.com.br: did not receive HSTS header
societyhilldance.com: did not receive HSTS header
sockeye.cc: could not connect to host
socomponents.co.uk: did not receive HSTS header
sodacore.com: could not connect to host
@ -4163,12 +4157,13 @@ solsystems.ru: could not connect to host
someshit.xyz: could not connect to host
somethingnew.xyz: could not connect to host
sonic.network: did not receive HSTS header
sonicrainboom.rocks: could not connect to host
sonicrainboom.rocks: did not receive HSTS header
soobi.org: did not receive HSTS header
soondy.com: did not receive HSTS header
sotor.de: did not receive HSTS header
soulema.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 118" data: no]
soulfulglamour.uk: could not connect to host
soundeo.net: did not receive HSTS header
sourcelair.com: did not receive HSTS header
southgale.condos: could not connect to host
southside-crew.club: could not connect to host
@ -4206,6 +4201,7 @@ spilsbury.io: could not connect to host
spititout.it: could not connect to host
spittersberger.recipes: did not receive HSTS header
sponsortobias.com: did not receive HSTS header
sportchirp-internal.azurewebsites.net: did not receive HSTS header
sportwette.eu: did not receive HSTS header
spot-events.com: could not connect to host
spotifyripper.tk: could not connect to host
@ -4214,6 +4210,7 @@ spr.id.au: did not receive HSTS header
spreadsheets.google.com: did not receive HSTS header (error ignored - included regardless)
sproutconnections.com: did not receive HSTS header
sprybear.com: did not receive HSTS header
squaddraft.com: could not connect to host
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 118" data: no]
sqzryang.com: did not receive HSTS header
@ -4226,17 +4223,17 @@ ssl.rip: could not connect to host
ssmato.me: could not connect to host
ssnc.org: max-age too low: 300
sss3s.com: could not connect to host
sstewartgallus.com: could not connect to host
ssworld.ga: could not connect to host
stabletoken.com: could not connect to host
stadjerspasonline.nl: could not connect to host
staffjoy.com: did not receive HSTS header
stahl.xyz: could not connect to host
stalschermer.nl: could not connect to host
standardssuck.org: did not receive HSTS header
standingmist.com: did not receive HSTS header
stargatepartners.com: did not receive HSTS header
starmusic.ga: did not receive HSTS header
starsam80.net: could not connect to host
starpeak.org: could not connect to host
starttraffic.com: did not receive HSTS header
startuponcloud.com: max-age too low: 2678400
startuppeople.co.uk: did not receive HSTS header
@ -4341,7 +4338,7 @@ sushifrick.de: could not connect to host
suzukikenichi.com: did not receive HSTS header
sv.search.yahoo.com: did not receive HSTS header
svarovani.tk: could not connect to host
svatba-frantovi.cz: did not receive HSTS header
svatba-frantovi.cz: could not connect to host
svenluijten.com: did not receive HSTS header
sweetstreats.ca: could not connect to host
swimbee.nl: did not receive HSTS header
@ -4410,7 +4407,7 @@ teachforcanada.ca: did not receive HSTS header
team-teasers.com: could not connect to host
teamblueridge.org: could not connect to host
teamsocial.co: did not receive HSTS header
teamx-gaming.de: could not connect to host
teamtouring.net: could not connect to host
teamzeus.cz: could not connect to host
tech55i.com: did not receive HSTS header
techassist.io: did not receive HSTS header
@ -4419,6 +4416,7 @@ techhipster.net: could not connect to host
techhub.ml: could not connect to host
techllage.com: could not connect to host
techloaner.com: could not connect to host
techmasters.andover.edu: could not connect to host
techmatehq.com: could not connect to host
technogroup.cz: did not receive HSTS header
technosavvyport.com: did not receive HSTS header
@ -4438,7 +4436,6 @@ tensei-slime.com: did not receive HSTS header
tensionup.com: could not connect to host
tentins.com: could not connect to host
teos.online: could not connect to host
tepid.org: could not connect to host
teriiphotography.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 118" data: no]
terra.by: did not receive HSTS header
terrax.berlin: could not connect to host
@ -4454,6 +4451,7 @@ textracer.dk: could not connect to host
tezcam.tk: could not connect to host
tf2stadium.com: did not receive HSTS header
tfcoms-sp-tracker-client.azurewebsites.net: could not connect to host
tffans.com: could not connect to host
tfl.lu: did not receive HSTS header
tgr.re: could not connect to host
thagki9.com: could not connect to host
@ -4621,6 +4619,7 @@ translate.googleapis.com: did not receive HSTS header (error ignored - included
transportal.sk: did not receive HSTS header
travelinsurance.co.nz: did not receive HSTS header
treeby.net: could not connect to host
tremoureux.fr: could not connect to host
trendberry.ru: could not connect to host
trinityaffirmations.com: max-age too low: 0
trinitycore.org: max-age too low: 2592000
@ -4630,7 +4629,7 @@ trollme.me: could not connect to host
trondelan.no: did not receive HSTS header
trunkjunk.co: could not connect to host
trusitio.com: did not receive HSTS header
trusteecar.com: did not receive HSTS header
trusteecar.com: could not connect to host
trustmeimfancy.com: could not connect to host
trybind.com: could not connect to host
tryoneday.co: did not receive HSTS header
@ -4699,6 +4698,7 @@ ukrgadget.com: could not connect to host
ulabox.cat: did not receive HSTS header
ulabox.es: did not receive HSTS header
ulmo.dk: could not connect to host
ultimate-garcinia-plus.com: could not connect to host
ultros.io: did not receive HSTS header
umidev.com: did not receive HSTS header
umie.cc: did not receive HSTS header
@ -4741,6 +4741,7 @@ uprotect.it: could not connect to host
upstats.eu: could not connect to host
ur-lauber.de: did not receive HSTS header
urandom.eu.org: did not receive HSTS header
urbanstylestaging.com: did not receive HSTS header
urphp.com: could not connect to host
us-immigration.com: did not receive HSTS header
usaa.com: did not receive HSTS header
@ -4798,7 +4799,6 @@ venixplays-stream.ml: could not connect to host
verifikatorindonesia.com: could not connect to host
vermontcareergateway.org: could not connect to host
versia.ru: did not receive HSTS header
verspai.de: could not connect to host
veryhax.de: could not connect to host
vetmgmt.com: could not connect to host
vfree.org: could not connect to host
@ -4827,7 +4827,6 @@ vio.no: did not receive HSTS header
viperdns.com: could not connect to host
vipi.es: could not connect to host
vipmusic.ga: could not connect to host
vipnettikasinoklubi.com: did not receive HSTS header
virginiacrimeanalysisnetwork.org: did not receive HSTS header
virtualperez.com: could not connect to host
visiontree-beta.eu: could not connect to host
@ -4884,7 +4883,7 @@ wapjt.cn: could not connect to host
warandpeace.xyz: could not connect to host
warehost.de: did not receive HSTS header
warhistoryonline.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 118" data: no]
warlions.info: did not receive HSTS header
warlions.info: could not connect to host
warped.com: did not receive HSTS header
warsentech.com: did not receive HSTS header
washingtonviews.com: did not receive HSTS header
@ -5001,7 +5000,6 @@ 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
womb.city: 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
@ -5015,7 +5013,6 @@ workpermit.com.vn: did not receive HSTS header
workwithgo.com: could not connect to host
worldsbeststory.com: did not receive HSTS header
wowapi.org: could not connect to host
wpcarer.pro: could not connect to host
wpfortify.com: did not receive HSTS header
wphostingspot.com: did not receive HSTS header
wpmetadatastandardsproject.org: could not connect to host
@ -5049,7 +5046,7 @@ www.surfeasy.com: did not receive HSTS header
www.zenpayroll.com: did not receive HSTS header
www3.info: did not receive HSTS header
wxukang.cn: could not connect to host
wyzphoto.nl: could not connect to host
wyzphoto.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 118" data: no]
x2w.io: could not connect to host
x3led.com: could not connect to host
x509.pub: could not connect to host
@ -5062,7 +5059,7 @@ xbt.co: could not connect to host
xcoop.me: could not connect to host
xellos.ga: could not connect to host
xellos.ml: could not connect to host
xendo.net: could not connect to host
xendo.net: did not receive HSTS header
xenesisziarovky.sk: could not connect to host
xett.com: did not receive HSTS header
xf-liam.com: did not receive HSTS header
@ -5071,7 +5068,6 @@ 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
xing.ml: could not connect to host
xisa.it: could not connect to host
xiyu.moe: could not connect to host
xmppwocky.net: could not connect to host
@ -5087,7 +5083,6 @@ xn--80aaihqncaejjobbu6v.xn--p1ai: max-age too low: 10000
xn--9pr52k0p5a.com: did not receive HSTS header
xn--datenrettung-mnchen-jbc.com: did not receive HSTS header
xn--dmonenjger-q5ag.net: could not connect to host
xn--knstler-n2a.tips: could not connect to host
xn--lgb3a8bcpn.cf: could not connect to host
xn--lgb3a8bcpn.ga: could not connect to host
xn--lgb3a8bcpn.gq: could not connect to host
@ -5113,7 +5108,7 @@ xuwei.de: could not connect to host
xuyh0120.win: did not receive HSTS header
xxbase.com: could not connect to host
y-o-w.com: did not receive HSTS header
y-s.pw: max-age too low: 0
y-s.pw: could not connect to host
yabrt.cn: could not connect to host
yagi2.com: could not connect to host
yalook.com: did not receive HSTS header
@ -5156,7 +5151,6 @@ yu.gg: did not receive HSTS header
yuan.ga: did not receive HSTS header
yuhen.ru: did not receive HSTS header
yuko.moe: could not connect to host
yunpan.blue: could not connect to host
yunzhu.li: did not receive HSTS header
yunzhu.org: could not connect to host
yutabon.com: could not connect to host
@ -5189,6 +5183,7 @@ zerudi.com: did not receive HSTS header
zett4.me: could not connect to host
zeytin.pro: could not connect to host
zh.search.yahoo.com: did not receive HSTS header
zhangsir.net: could not connect to host
zhaojin97.cn: did not receive HSTS header
zhendingresources.com: max-age too low: 0
zinc-x.com: did not receive HSTS header
@ -5208,7 +5203,6 @@ zoo24.de: did not receive HSTS header
zoomingin.net: max-age too low: 5184000
zoommailing.com: did not receive HSTS header
zorasvobodova.cz: did not receive HSTS header
zorgclustertool.nl: could not connect to host
zortium.report: could not connect to host
zoznamrealit.sk: did not receive HSTS header
zqhong.com: could not connect to host

File diff suppressed because it is too large Load Diff