Merge mozilla-central to mozilla-inbound

This commit is contained in:
Carsten "Tomcat" Book 2017-01-09 10:39:03 +01:00
Родитель b68ae46ad6 bb28022e75
Коммит 06c0537572
24 изменённых файлов: 14104 добавлений и 13440 удалений

Просмотреть файл

@ -4,12 +4,50 @@
"use strict";
const { createClass, PropTypes, DOM } = require("devtools/client/shared/vendor/react");
const { createClass, createFactory, PropTypes, DOM } = require("devtools/client/shared/vendor/react");
const { div, span, img } = DOM;
const { L10N } = require("../l10n");
const { getFormattedSize } = require("../utils/format-utils");
const { getAbbreviatedMimeType } = require("../request-utils");
/**
* Compare two objects on a subset of their properties
*/
function propertiesEqual(props, item1, item2) {
return item1 === item2 || props.every(p => item1[p] === item2[p]);
}
/**
* Used by shouldComponentUpdate: compare two items, and compare only properties
* relevant for rendering the RequestListItem. Other properties (like request and
* response headers, cookies, bodies) are ignored. These are very useful for the
* sidebar details, but not here.
*/
const UPDATED_REQ_ITEM_PROPS = [
"mimeType",
"eventTimings",
"securityState",
"responseContentDataUri",
"status",
"statusText",
"fromCache",
"fromServiceWorker",
"method",
"url",
"remoteAddress",
"cause",
"contentSize",
"transferredSize",
"startedMillis",
"totalTime",
];
const UPDATED_REQ_PROPS = [
"index",
"isSelected",
"firstRequestStartedMillis"
];
/**
* Render one row in the request list.
*/
@ -33,10 +71,8 @@ const RequestListItem = createClass({
},
shouldComponentUpdate(nextProps) {
return !relevantPropsEqual(this.props.item, nextProps.item)
|| this.props.index !== nextProps.index
|| this.props.isSelected !== nextProps.isSelected
|| this.props.firstRequestStartedMillis !== nextProps.firstRequestStartedMillis;
return !propertiesEqual(UPDATED_REQ_ITEM_PROPS, this.props.item, nextProps.item) ||
!propertiesEqual(UPDATED_REQ_PROPS, this.props, nextProps);
},
componentDidUpdate(prevProps) {
@ -88,151 +124,171 @@ const RequestListItem = createClass({
onContextMenu,
onMouseDown,
},
StatusColumn(item),
MethodColumn(item),
FileColumn(item),
DomainColumn(item, onSecurityIconClick),
CauseColumn(item),
TypeColumn(item),
TransferredSizeColumn(item),
ContentSizeColumn(item),
WaterfallColumn(item, firstRequestStartedMillis)
StatusColumn({ item }),
MethodColumn({ item }),
FileColumn({ item }),
DomainColumn({ item, onSecurityIconClick }),
CauseColumn({ item }),
TypeColumn({ item }),
TransferredSizeColumn({ item }),
ContentSizeColumn({ item }),
WaterfallColumn({ item, firstRequestStartedMillis })
);
}
});
/**
* Used by shouldComponentUpdate: compare two items, and compare only properties
* relevant for rendering the RequestListItem. Other properties (like request and
* response headers, cookies, bodies) are ignored. These are very useful for the
* sidebar details, but not here.
*/
const RELEVANT_ITEM_PROPS = [
const UPDATED_STATUS_PROPS = [
"status",
"statusText",
"fromCache",
"fromServiceWorker",
"method",
"url",
"responseContentDataUri",
"remoteAddress",
"securityState",
"cause",
"mimeType",
"contentSize",
"transferredSize",
"startedMillis",
"totalTime",
"eventTimings",
];
function relevantPropsEqual(item1, item2) {
return item1 === item2 || RELEVANT_ITEM_PROPS.every(p => item1[p] === item2[p]);
}
const StatusColumn = createFactory(createClass({
shouldComponentUpdate(nextProps) {
return !propertiesEqual(UPDATED_STATUS_PROPS, this.props.item, nextProps.item);
},
function StatusColumn(item) {
const { status, statusText, fromCache, fromServiceWorker } = item;
render() {
const { status, statusText, fromCache, fromServiceWorker } = this.props.item;
let code, title;
let code, title;
if (status) {
if (fromCache) {
code = "cached";
} else if (fromServiceWorker) {
code = "service worker";
} else {
code = status;
}
if (statusText) {
title = `${status} ${statusText}`;
if (status) {
if (fromCache) {
title += " (cached)";
code = "cached";
} else if (fromServiceWorker) {
code = "service worker";
} else {
code = status;
}
if (fromServiceWorker) {
title += " (service worker)";
if (statusText) {
title = `${status} ${statusText}`;
if (fromCache) {
title += " (cached)";
}
if (fromServiceWorker) {
title += " (service worker)";
}
}
}
return div({ className: "requests-menu-subitem requests-menu-status", title },
div({ className: "requests-menu-status-icon", "data-code": code }),
span({ className: "subitem-label requests-menu-status-code" }, status)
);
}
}));
return div({ className: "requests-menu-subitem requests-menu-status", title },
div({ className: "requests-menu-status-icon", "data-code": code }),
span({ className: "subitem-label requests-menu-status-code" }, status)
);
}
const MethodColumn = createFactory(createClass({
shouldComponentUpdate(nextProps) {
return this.props.item.method !== nextProps.item.method;
},
function MethodColumn(item) {
const { method } = item;
return div({ className: "requests-menu-subitem requests-menu-method-box" },
span({ className: "subitem-label requests-menu-method" }, method)
);
}
function FileColumn(item) {
const { urlDetails, responseContentDataUri } = item;
return div({ className: "requests-menu-subitem requests-menu-icon-and-file" },
img({
className: "requests-menu-icon",
src: responseContentDataUri,
hidden: !responseContentDataUri,
"data-type": responseContentDataUri ? "thumbnail" : undefined
}),
div(
{
className: "subitem-label requests-menu-file",
title: urlDetails.unicodeUrl
},
urlDetails.baseNameWithQuery
)
);
}
function DomainColumn(item, onSecurityIconClick) {
const { urlDetails, remoteAddress, securityState } = item;
let iconClassList = [ "requests-security-state-icon" ];
let iconTitle;
if (urlDetails.isLocal) {
iconClassList.push("security-state-local");
iconTitle = L10N.getStr("netmonitor.security.state.secure");
} else if (securityState) {
iconClassList.push(`security-state-${securityState}`);
iconTitle = L10N.getStr(`netmonitor.security.state.${securityState}`);
render() {
const { method } = this.props.item;
return div({ className: "requests-menu-subitem requests-menu-method-box" },
span({ className: "subitem-label requests-menu-method" }, method)
);
}
}));
let title = urlDetails.host + (remoteAddress ? ` (${remoteAddress})` : "");
const UPDATED_FILE_PROPS = [
"urlDetails",
"responseContentDataUri",
];
return div(
{ className: "requests-menu-subitem requests-menu-security-and-domain" },
div({
className: iconClassList.join(" "),
title: iconTitle,
onClick: onSecurityIconClick,
}),
span({ className: "subitem-label requests-menu-domain", title }, urlDetails.host)
);
}
const FileColumn = createFactory(createClass({
shouldComponentUpdate(nextProps) {
return !propertiesEqual(UPDATED_FILE_PROPS, this.props.item, nextProps.item);
},
function CauseColumn(item) {
const { cause } = item;
render() {
const { urlDetails, responseContentDataUri } = this.props.item;
let causeType = "";
let causeUri = undefined;
let causeHasStack = false;
if (cause) {
causeType = cause.type;
causeUri = cause.loadingDocumentUri;
causeHasStack = cause.stacktrace && cause.stacktrace.length > 0;
return div({ className: "requests-menu-subitem requests-menu-icon-and-file" },
img({
className: "requests-menu-icon",
src: responseContentDataUri,
hidden: !responseContentDataUri,
"data-type": responseContentDataUri ? "thumbnail" : undefined
}),
div(
{
className: "subitem-label requests-menu-file",
title: urlDetails.unicodeUrl
},
urlDetails.baseNameWithQuery
)
);
}
}));
return div(
{ className: "requests-menu-subitem requests-menu-cause", title: causeUri },
span({ className: "requests-menu-cause-stack", hidden: !causeHasStack }, "JS"),
span({ className: "subitem-label" }, causeType)
);
}
const UPDATED_DOMAIN_PROPS = [
"urlDetails",
"remoteAddress",
"securityState",
];
const DomainColumn = createFactory(createClass({
shouldComponentUpdate(nextProps) {
return !propertiesEqual(UPDATED_DOMAIN_PROPS, this.props.item, nextProps.item);
},
render() {
const { item, onSecurityIconClick } = this.props;
const { urlDetails, remoteAddress, securityState } = item;
let iconClassList = [ "requests-security-state-icon" ];
let iconTitle;
if (urlDetails.isLocal) {
iconClassList.push("security-state-local");
iconTitle = L10N.getStr("netmonitor.security.state.secure");
} else if (securityState) {
iconClassList.push(`security-state-${securityState}`);
iconTitle = L10N.getStr(`netmonitor.security.state.${securityState}`);
}
let title = urlDetails.host + (remoteAddress ? ` (${remoteAddress})` : "");
return div(
{ className: "requests-menu-subitem requests-menu-security-and-domain" },
div({
className: iconClassList.join(" "),
title: iconTitle,
onClick: onSecurityIconClick,
}),
span({ className: "subitem-label requests-menu-domain", title }, urlDetails.host)
);
}
}));
const CauseColumn = createFactory(createClass({
shouldComponentUpdate(nextProps) {
return this.props.item.cause !== nextProps.item.cause;
},
render() {
const { cause } = this.props.item;
let causeType = "";
let causeUri = undefined;
let causeHasStack = false;
if (cause) {
causeType = cause.type;
causeUri = cause.loadingDocumentUri;
causeHasStack = cause.stacktrace && cause.stacktrace.length > 0;
}
return div(
{ className: "requests-menu-subitem requests-menu-cause", title: causeUri },
span({ className: "requests-menu-cause-stack", hidden: !causeHasStack }, "JS"),
span({ className: "subitem-label" }, causeType)
);
}
}));
const CONTENT_MIME_TYPE_ABBREVIATIONS = {
"ecmascript": "js",
@ -240,56 +296,110 @@ const CONTENT_MIME_TYPE_ABBREVIATIONS = {
"x-javascript": "js"
};
function TypeColumn(item) {
const { mimeType } = item;
let abbrevType;
if (mimeType) {
abbrevType = getAbbreviatedMimeType(mimeType);
abbrevType = CONTENT_MIME_TYPE_ABBREVIATIONS[abbrevType] || abbrevType;
const TypeColumn = createFactory(createClass({
shouldComponentUpdate(nextProps) {
return this.props.item.mimeType !== nextProps.item.mimeType;
},
render() {
const { mimeType } = this.props.item;
let abbrevType;
if (mimeType) {
abbrevType = getAbbreviatedMimeType(mimeType);
abbrevType = CONTENT_MIME_TYPE_ABBREVIATIONS[abbrevType] || abbrevType;
}
return div(
{ className: "requests-menu-subitem requests-menu-type", title: mimeType },
span({ className: "subitem-label" }, abbrevType)
);
}
}));
return div(
{ className: "requests-menu-subitem requests-menu-type", title: mimeType },
span({ className: "subitem-label" }, abbrevType)
);
}
const UPDATED_TRANSFERRED_PROPS = [
"transferredSize",
"fromCache",
"fromServiceWorker",
];
function TransferredSizeColumn(item) {
const { transferredSize, fromCache, fromServiceWorker } = item;
const TransferredSizeColumn = createFactory(createClass({
shouldComponentUpdate(nextProps) {
return !propertiesEqual(UPDATED_TRANSFERRED_PROPS, this.props.item, nextProps.item);
},
let text;
let className = "subitem-label";
if (fromCache) {
text = L10N.getStr("networkMenu.sizeCached");
className += " theme-comment";
} else if (fromServiceWorker) {
text = L10N.getStr("networkMenu.sizeServiceWorker");
className += " theme-comment";
} else if (typeof transferredSize == "number") {
text = getFormattedSize(transferredSize);
} else if (transferredSize === null) {
text = L10N.getStr("networkMenu.sizeUnavailable");
render() {
const { transferredSize, fromCache, fromServiceWorker } = this.props.item;
let text;
let className = "subitem-label";
if (fromCache) {
text = L10N.getStr("networkMenu.sizeCached");
className += " theme-comment";
} else if (fromServiceWorker) {
text = L10N.getStr("networkMenu.sizeServiceWorker");
className += " theme-comment";
} else if (typeof transferredSize == "number") {
text = getFormattedSize(transferredSize);
} else if (transferredSize === null) {
text = L10N.getStr("networkMenu.sizeUnavailable");
}
return div(
{ className: "requests-menu-subitem requests-menu-transferred", title: text },
span({ className }, text)
);
}
}));
return div(
{ className: "requests-menu-subitem requests-menu-transferred", title: text },
span({ className }, text)
);
}
const ContentSizeColumn = createFactory(createClass({
shouldComponentUpdate(nextProps) {
return this.props.item.contentSize !== nextProps.item.contentSize;
},
function ContentSizeColumn(item) {
const { contentSize } = item;
render() {
const { contentSize } = this.props.item;
let text;
if (typeof contentSize == "number") {
text = getFormattedSize(contentSize);
let text;
if (typeof contentSize == "number") {
text = getFormattedSize(contentSize);
}
return div(
{
className: "requests-menu-subitem subitem-label requests-menu-size",
title: text
},
span({ className: "subitem-label" }, text)
);
}
}));
return div(
{ className: "requests-menu-subitem subitem-label requests-menu-size", title: text },
span({ className: "subitem-label" }, text)
);
}
const UPDATED_WATERFALL_PROPS = [
"eventTimings",
"totalTime",
"fromCache",
"fromServiceWorker",
];
const WaterfallColumn = createFactory(createClass({
shouldComponentUpdate(nextProps) {
return this.props.firstRequestStartedMillis !== nextProps.firstRequestStartedMillis ||
!propertiesEqual(UPDATED_WATERFALL_PROPS, this.props.item, nextProps.item);
},
render() {
const { item, firstRequestStartedMillis } = this.props;
const startedDeltaMillis = item.startedMillis - firstRequestStartedMillis;
const paddingInlineStart = `${startedDeltaMillis}px`;
return div({ className: "requests-menu-subitem requests-menu-waterfall" },
div(
{ className: "requests-menu-timings", style: { paddingInlineStart } },
timingBoxes(item)
)
);
}
}));
// List of properties of the timing info we want to create boxes for
const TIMING_KEYS = ["blocked", "dns", "connect", "send", "wait", "receive"];
@ -331,16 +441,4 @@ function timingBoxes(item) {
return boxes;
}
function WaterfallColumn(item, firstRequestStartedMillis) {
const startedDeltaMillis = item.startedMillis - firstRequestStartedMillis;
const paddingInlineStart = `${startedDeltaMillis}px`;
return div({ className: "requests-menu-subitem requests-menu-waterfall" },
div(
{ className: "requests-menu-timings", style: { paddingInlineStart } },
timingBoxes(item)
)
);
}
module.exports = RequestListItem;

Просмотреть файл

@ -0,0 +1,92 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const { createClass, DOM, PropTypes } = require("devtools/client/shared/vendor/react");
const SourceEditor = require("devtools/client/sourceeditor/editor");
const { div } = DOM;
/**
* CodeMirror editor as a React component
*/
const Editor = createClass({
displayName: "Editor",
propTypes: {
open: PropTypes.bool,
text: PropTypes.string,
},
getDefaultProps() {
return {
open: true,
text: "",
};
},
componentDidMount() {
const { text } = this.props;
this.editor = new SourceEditor({
lineNumbers: true,
readOnly: true,
value: text,
});
this.deferEditor = this.editor.appendTo(this.refs.editorElement);
},
componentDidUpdate(prevProps) {
const { mode, open, text } = this.props;
if (!open) {
return;
}
if (prevProps.mode !== mode) {
this.deferEditor.then(() => {
this.editor.setMode(mode);
});
}
if (prevProps.text !== text) {
this.deferEditor.then(() => {
// FIXME: Workaround for browser_net_accessibility test to
// make sure editor node exists while setting editor text.
// deferEditor workround should be removed in bug 1308442
if (this.refs.editor) {
this.editor.setText(text);
}
});
}
},
componentWillUnmount() {
this.deferEditor.then(() => {
this.editor.destroy();
this.editor = null;
});
this.deferEditor = null;
},
render() {
const { open } = this.props;
return (
div({ className: "editor-container devtools-monospace" },
div({
ref: "editorElement",
className: "editor-mount devtools-monospace",
// Using visibility instead of display property to avoid breaking
// CodeMirror indentation
style: { visibility: open ? "visible" : "hidden" },
}),
)
);
}
});
module.exports = Editor;

Просмотреть файл

@ -3,7 +3,9 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
DevToolsModules(
'editor.js',
'preview-panel.js',
'properties-view.js',
'security-panel.js',
'timings-panel.js',
)

Просмотреть файл

@ -0,0 +1,162 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const {
createClass,
createFactory,
DOM,
PropTypes,
} = require("devtools/client/shared/vendor/react");
const { createFactories } = require("devtools/client/shared/components/reps/rep-utils");
const { MODE } = require("devtools/client/shared/components/reps/constants");
const { FILTER_SEARCH_DELAY } = require("../../constants");
// Components
const Editor = createFactory(require("devtools/client/netmonitor/shared/components/editor"));
const SearchBox = createFactory(require("devtools/client/shared/components/search-box"));
const TreeView = createFactory(require("devtools/client/shared/components/tree/tree-view"));
const TreeRow = createFactory(require("devtools/client/shared/components/tree/tree-row"));
const { Rep } = createFactories(require("devtools/client/shared/components/reps/rep"));
const { div, tr, td } = DOM;
/*
* Properties View component
* A scrollable tree view component which provides some useful features for
* representing object properties.
*
* Search filter - Set enableFilter to enable / disable SearchBox feature.
* Tree view - Default enabled.
* Source editor - Enable by specifying object level 1 property name to "editorText".
* Rep - Default enabled.
*/
const PropertiesView = createClass({
displayName: "PropertiesView",
propTypes: {
object: PropTypes.object,
enableInput: PropTypes.bool,
expandableStrings: PropTypes.bool,
filterPlaceHolder: PropTypes.string,
sectionNames: PropTypes.array,
},
getDefaultProps() {
return {
enableInput: true,
enableFilter: true,
expandableStrings: false,
filterPlaceHolder: "",
};
},
getInitialState() {
return {
filterText: "",
};
},
getRowClass(object, sectionNames) {
return sectionNames.includes(object.name) ? "tree-section" : "";
},
onFilter(object, whiteList) {
let { name, value } = object;
let filterText = this.state.filterText;
if (!filterText || whiteList.includes(name)) {
return true;
}
let jsonString = JSON.stringify({ [name]: value }).toLowerCase();
return jsonString.includes(filterText.toLowerCase());
},
renderRowWithEditor(props) {
const { level, name, value } = props.member;
// Display source editor when prop name specify to editorText
if (level === 1 && name === "editorText") {
return (
tr({},
td({ colSpan: 2 },
Editor({ text: value })
)
)
);
}
return TreeRow(props);
},
renderValueWithRep(props) {
// Hide rep summary for sections
if (props.member.level === 0) {
return null;
}
return Rep(Object.assign(props, {
// FIXME: A workaround for the issue in StringRep
// Force StringRep to crop the text everytime
member: Object.assign({}, props.member, { open: false }),
mode: MODE.TINY,
cropLimit: 60,
}));
},
updateFilterText(filterText) {
this.setState({
filterText,
});
},
render() {
const {
object,
decorator,
enableInput,
enableFilter,
expandableStrings,
filterPlaceHolder,
renderRow,
renderValue,
sectionNames,
} = this.props;
return (
div({ className: "properties-view" },
enableFilter && div({ className: "searchbox-section" },
SearchBox({
delay: FILTER_SEARCH_DELAY,
type: "filter",
onChange: this.updateFilterText,
placeholder: filterPlaceHolder,
}),
),
div({ className: "tree-container" },
TreeView({
object,
columns: [{
id: "value",
width: "100%",
}],
decorator: decorator || {
getRowClass: (rowObject) => this.getRowClass(rowObject, sectionNames),
},
enableInput,
expandableStrings,
expandedNodes: new Set(sectionNames.map((sec) => "/" + sec)),
onFilter: (props) => this.onFilter(props, sectionNames),
renderRow: renderRow || this.renderRowWithEditor,
renderValue: renderValue || this.renderValueWithRep,
}),
),
)
);
}
});
module.exports = PropertiesView;

Просмотреть файл

@ -1120,24 +1120,73 @@
font-weight: 600;
}
/* Customize default tree table style to align with devtools theme */
.theme-light .treeTable .treeLabel,
.theme-light .treeTable .treeRow.hasChildren > .treeLabelCell > .treeLabel:hover {
color: var(--theme-highlight-red);
.properties-view {
/* FIXME: Minus 24px * 2 for toolbox height + panel height
* Give a fixed panel container height in order to force tree view scrollable */
height: calc(100vh - 48px);
display: flex;
flex-direction: column;
}
.theme-dark .treeTable .treeLabel,
.theme-dark .treeTable .treeRow.hasChildren > .treeLabelCell > .treeLabel:hover {
color: var(--theme-highlight-purple);
.properties-view .searchbox-section {
flex: 0 1 auto;
}
.theme-firebug .treeTable .treeLabel {
color: var(--theme-body-color);
.properties-view .devtools-searchbox {
padding: 0;
}
.treeTable .treeRow.hasChildren > .treeLabelCell > .treeLabel:hover {
cursor: default;
text-decoration: none;
.properties-view .devtools-searchbox input {
margin: 1px 3px;
}
.tree-container {
position: relative;
height: 100%;
}
/* Make treeTable fill parent element and scrollable */
.tree-container .treeTable {
position: absolute;
display: block;
overflow-y: auto;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.properties-view .devtools-searchbox,
.tree-container .treeTable .tree-section {
width: 100%;
background-color: var(--theme-toolbar-background);
}
.tree-container .treeTable .tree-section > * {
vertical-align: middle;
}
.tree-container .treeTable .treeRow.tree-section > .treeLabelCell > .treeLabel,
.tree-container .treeTable .treeRow.tree-section > .treeLabelCell > .treeLabel:hover {
color: var(--theme-body-color-alt);
}
.tree-container .treeTable .treeValueCell {
/* FIXME: Make value cell can be reduced to shorter width */
max-width: 0;
padding-inline-end: 5px;
}
.tree-container .objectBox {
white-space: nowrap;
}
.editor-container,
.editor-mount,
.editor-mount iframe {
border: none;
width: 100%;
height: 100%;
}
/*

Просмотреть файл

@ -6,3 +6,4 @@ support-files =
[browser_bug453896.js]
[browser_newtab_share_rule_processors.js]
skip-if = stylo # bug 1290224

Просмотреть файл

@ -15,7 +15,9 @@ support-files =
[test_bug1160724.xul]
[test_bug535806.xul]
[test_display_mode.html]
tags = fullscreen
[test_display_mode_reflow.html]
tags = fullscreen
[test_hover.html]
[test_moz_document_rules.html]
skip-if = stylo # bug 1290224

Просмотреть файл

@ -36,9 +36,13 @@ support-files =
[test_acid3_test46.html]
[test_addSheet.html]
skip-if = stylo # bug 1290224
support-files = additional_sheets_helper.html
[test_additional_sheets.html]
skip-if = stylo # bug 1290224
support-files = additional_sheets_helper.html
[test_align_justify_computed_values.html]
[test_align_shorthand_serialization.html]
[test_all_shorthand.html]
[test_animations.html]
skip-if = toolkit == 'android'
@ -62,10 +66,13 @@ support-files = file_animations_pausing.html
[test_animations_playbackrate.html]
support-files = file_animations_playbackrate.html
[test_animations_styles_on_event.html]
skip-if = stylo # timeout bug 1328505
support-files = file_animations_styles_on_event.html
[test_animations_with_disabled_properties.html]
skip-if = stylo # timeout bug 1328503
support-files = file_animations_with_disabled_properties.html
[test_any_dynamic.html]
[test_asyncopen2.html]
[test_at_rule_parse_serialize.html]
[test_attribute_selector_eof_behavior.html]
[test_background_blend_mode.html]
@ -142,6 +149,7 @@ support-files = file_bug829816.css
[test_bug1055933.html]
support-files = file_bug1055933_circle-xxl.png
[test_bug1089417.html]
skip-if = stylo # bug 1323665
support-files = file_bug1089417_iframe.html
[test_bug1112014.html]
[test_bug1203766.html]
@ -169,7 +177,9 @@ skip-if = toolkit == 'android' #bug 536603
[test_css_function_mismatched_parenthesis.html]
[test_css_loader_crossorigin_data_url.html]
[test_css_supports.html]
skip-if = stylo # bug 1323715
[test_css_supports_variables.html]
skip-if = stylo # bug 1323715
[test_default_bidi_css.html]
[test_default_computed_style.html]
[test_descriptor_storage.html]
@ -178,7 +188,6 @@ skip-if = toolkit == 'android' #bug 536603
[test_dynamic_change_causing_reflow.html]
[test_exposed_prop_accessors.html]
[test_extra_inherit_initial.html]
[test_align_justify_computed_values.html]
[test_flexbox_child_display_values.xhtml]
[test_flexbox_flex_grow_and_shrink.html]
[test_flexbox_flex_shorthand.html]
@ -206,11 +215,9 @@ support-files =
[test_inherit_computation.html]
skip-if = toolkit == 'android'
[test_inherit_storage.html]
tags = stylo
[test_initial_computation.html]
skip-if = toolkit == 'android'
[test_initial_storage.html]
tags = stylo
[test_keyframes_rules.html]
[test_load_events_on_stylesheets.html]
[test_logical_properties.html]
@ -238,6 +245,7 @@ skip-if = android_version == '18' #debug-only failure; timed out #Android 4.3 aw
[test_pseudoelement_state.html]
[test_pseudoelement_parsing.html]
[test_redundant_font_download.html]
skip-if = stylo # bug 1323665
support-files = redundant_font_download.sjs
[test_rem_unit.html]
[test_restyles_in_smil_animation.html]
@ -260,23 +268,29 @@ skip-if = toolkit == 'android' #bug 775227
[test_transitions_and_reframes.html]
[test_transitions_and_restyles.html]
[test_transitions_and_zoom.html]
skip-if = stylo # timeout bug 1328499
[test_transitions_cancel_near_end.html]
skip-if = stylo # timeout bug 1328499
[test_transitions_computed_values.html]
[test_transitions_computed_value_combinations.html]
[test_transitions_events.html]
skip-if = stylo # timeout bug 1328499
[test_transitions.html]
skip-if = (android_version == '18' && debug) # bug 1159532
[test_transitions_bug537151.html]
skip-if = stylo # timeout bug 1328499
[test_transitions_dynamic_changes.html]
[test_transitions_per_property.html]
skip-if = toolkit == 'android' #bug 775227
skip-if = (toolkit == 'android' || stylo) # bug 775227 for android, bug 1292283 for stylo
[test_transitions_replacement_on_busy_frame.html]
skip-if = stylo # timeout bug 1328503
support-files = file_transitions_replacement_on_busy_frame.html
[test_transitions_step_functions.html]
[test_transitions_with_disabled_properties.html]
support-files = file_transitions_with_disabled_properties.html
[test_unclosed_parentheses.html]
[test_unicode_range_loading.html]
skip-if = stylo # timeout bug 1328507
support-files = ../../reftests/fonts/markA.woff ../../reftests/fonts/markB.woff ../../reftests/fonts/markC.woff ../../reftests/fonts/markD.woff
[test_units_angle.html]
[test_units_frequency.html]
@ -287,11 +301,11 @@ support-files = unprefixing_service_iframe.html unprefixing_service_utils.js
[test_unprefixing_service_prefs.html]
support-files = unprefixing_service_iframe.html unprefixing_service_utils.js
[test_value_cloning.html]
tags = stylo
skip-if = toolkit == 'android' #bug 775227
[test_value_computation.html]
skip-if = toolkit == 'android'
[test_value_storage.html]
skip-if = stylo # bug 1329533
[test_variable_serialization_computed.html]
[test_variable_serialization_specified.html]
[test_variables.html]
@ -299,16 +313,14 @@ support-files = support/external-variable-url.css
[test_video_object_fit.html]
[test_viewport_units.html]
[test_visited_image_loading.html]
skip-if = toolkit == 'android' #TIMED_OUT
skip-if = (toolkit == 'android' || stylo) # TIMED_OUT for android, timeout bug 1328511 for stylo
[test_visited_image_loading_empty.html]
skip-if = toolkit == 'android' #TIMED_OUT
skip-if = (toolkit == 'android' || stylo) # TIMED_OUT for android, timeout bug 1328511 for stylo
[test_visited_lying.html]
skip-if = toolkit == 'android' #TIMED_OUT
skip-if = (toolkit == 'android' || stylo) # TIMED_OUT for android, timeout bug 1328511 for stylo
[test_visited_pref.html]
skip-if = toolkit == 'android' #TIMED_OUT
skip-if = (toolkit == 'android' || stylo) # TIMED_OUT for android, timeout bug 1328511 for stylo
[test_visited_reftests.html]
skip-if = toolkit == 'android' #TIMED_OUT
skip-if = (toolkit == 'android' || stylo) # TIMED_OUT for android, timeout bug 1328511 for stylo
[test_webkit_device_pixel_ratio.html]
[test_webkit_flex_display.html]
[test_asyncopen2.html]
[test_align_shorthand_serialization.html]

Просмотреть файл

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

Просмотреть файл

@ -9,7 +9,9 @@
10seos.com: did not receive HSTS header
10tacle.io: could not connect to host
123plons.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
127011-networks.ch: could not connect to host
12vpnchina.com: could not connect to host
16packets.com: could not connect to host
18f.gsa.gov: did not receive HSTS header
1a-jva.de: did not receive HSTS header
1p.ro: could not connect to host
@ -75,7 +77,6 @@ acgmoon.org: did not receive HSTS header
acisonline.net: did not receive HSTS header
acorns.com: did not receive HSTS header
acr.im: could not connect to host
acritelli.com: could not connect to host
acslimited.co.uk: did not receive HSTS header
activateplay.com: did not receive HSTS header
activeweb.top: could not connect to host
@ -114,6 +115,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
agevio.com: could not connect to host
@ -125,6 +127,7 @@ ahabingo.com: did not receive HSTS header
ahoynetwork.com: could not connect to host
ahri.ovh: could not connect to host
aidanwoods.com: did not receive HSTS header
aimeeandalec.com: did not receive HSTS header
airbnb.com: did not receive HSTS header
aircomms.com: did not receive HSTS header
airproto.com: did not receive HSTS header
@ -146,6 +149,8 @@ alariel.de: did not receive HSTS header
alarmsystemreviews.com: did not receive HSTS header
albertopimienta.com: did not receive HSTS header
alcazaar.com: could not connect to host
alecpap.com: did not receive HSTS header
alecpapierniak.com: did not receive HSTS header
alecvannoten.be: did not receive HSTS header
alenan.org: could not connect to host
alessandro.pw: did not receive HSTS header
@ -161,6 +166,7 @@ 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
allmbw.com: could not connect to host
allstarswithus.com: could not connect to host
alpha.irccloud.com: could not connect to host
alphabit-secure.com: could not connect to host
@ -215,6 +221,7 @@ anomaly.ws: did not receive HSTS header
anonboards.com: did not receive HSTS header
anonymousstatecollegelulzsec.com: could not connect to host
anook.com: max-age too low: 0
another.ch: could not connect to host
ant.land: could not connect to host
anthenor.co.uk: could not connect to host
antimine.kr: could not connect to host
@ -225,8 +232,7 @@ antoniorequena.com.ve: could not connect to host
antscript.com: did not receive HSTS header
any.pm: could not connect to host
anycoin.me: could not connect to host
aojiao.org: did not receive HSTS header
aosc.io: did not receive HSTS header
aojiao.org: could not connect to host
apachelounge.com: did not receive HSTS header
apeasternpower.com: max-age too low: 0
api.mega.co.nz: could not connect to host
@ -235,6 +241,7 @@ apis.google.com: did not receive HSTS header (error ignored - included regardles
apis.world: did not receive HSTS header
apmg-certified.com: did not receive HSTS header
apnakliyat.com: did not receive HSTS header
apolloyl.com: did not receive HSTS header
aponkralsunucu.com: did not receive HSTS header
app.lookout.com: could not connect to host
app.manilla.com: could not connect to host
@ -254,7 +261,6 @@ aran.me.uk: did not receive HSTS header
arboineuropa.nl: did not receive HSTS header
arbu.eu: max-age too low: 2419200
argh.io: could not connect to host
aristocrates.co: could not connect to host
arlen.se: could not connect to host
armingrodon.de: did not receive HSTS header
armory.consulting: could not connect to host
@ -285,7 +291,6 @@ asset-alive.net: did not receive HSTS header
astrath.net: could not connect to host
astrolpost.com: could not connect to host
astromelody.com: did not receive HSTS header
asuhe.cc: did not receive HSTS header
atavio.at: could not connect to host
atavio.ch: could not connect to host
atavio.de: did not receive HSTS header
@ -321,6 +326,7 @@ auverbox.ovh: could not connect to host
av.de: did not receive HSTS header
avec-ou-sans-ordonnance.fr: could not connect to host
avinet.com: max-age too low: 0
avqueen.cn: could not connect to host
awg-mode.de: did not receive HSTS header
axado.com.br: did not receive HSTS header
axeny.com: did not receive HSTS header
@ -332,6 +338,7 @@ baby-click.de: did not receive HSTS header
babybic.hu: did not receive HSTS header
babyhouse.xyz: could not connect to host
babysaying.me: could not connect to host
bacchanallia.com: did not receive HSTS header
back-bone.nl: did not receive HSTS header
badcronjob.com: could not connect to host
badkamergigant.com: could not connect to host
@ -422,10 +429,11 @@ biofam.ru: did not receive HSTS header
bionicspirit.com: could not connect to host
biophysik-ssl.de: did not receive HSTS header
birkman.com: did not receive HSTS header
birzan.org: could not connect to host
bismarck.moe: did not receive HSTS header
bit-rapid.com: could not connect to host
bitchan.it: could not connect to host
bitcoinworld.me: could not connect to host
bitconcepts.co.uk: could not connect to host
bitf.ly: could not connect to host
bitfactory.ws: could not connect to host
bitfarm-archiv.com: did not receive HSTS header
@ -471,7 +479,6 @@ blupig.net: did not receive HSTS header
bm-trading.nl: did not receive HSTS header
bngsecure.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
bobiji.com: did not receive HSTS header
bobobox.net: could not connect to host
bodo-wolff.de: could not connect to host
bodyblog.nl: did not receive HSTS header
bodybuilding-legends.com: could not connect to host
@ -519,15 +526,17 @@ broken-oak.com: could not connect to host
brookechase.com: did not receive HSTS header
browserid.org: did not receive HSTS header
brunix.net: did not receive HSTS header
brunoramos.org: could not connect to host
bsagan.fr: could not connect to host
bsdtips.com: could not connect to host
bsquared.org: could not connect to host
btcdlc.com: could not connect to host
buchheld.at: did not receive HSTS header
bucket.tk: could not connect to host
budger.nl: could not connect to host
budgetthostels.nl: did not receive HSTS header
budskap.eu: could not connect to host
bugtrack.io: could not connect to host
bugtrack.io: did not receive HSTS header
buhler.pro: did not receive HSTS header
buildci.asia: could not connect to host
buildsaver.co.za: did not receive HSTS header
@ -541,7 +550,7 @@ burrow.ovh: could not connect to host
burtrum.me: could not connect to host
burtrum.top: could not connect to host
business.lookout.com: could not connect to host
business.medbank.com.mt: max-age too low: 10702363
business.medbank.com.mt: max-age too low: 10615978
businesshosting.nl: did not receive HSTS header
busold.ws: could not connect to host
bustimes.org: could not connect to host
@ -549,7 +558,6 @@ butchersworkshop.com: did not receive HSTS header
buttercoin.com: could not connect to host
buybaby.eu: did not receive HSTS header
buyfox.de: did not receive HSTS header
bw.codes: could not connect to host
by4cqb.cn: could not connect to host
bynet.cz: could not connect to host
bypassed.press: could not connect to host
@ -737,6 +745,7 @@ code.google.com: did not receive HSTS header (error ignored - included regardles
codeco.pw: could not connect to host
codeforce.io: 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
codiva.io: max-age too low: 2592000
coffeeetc.co.uk: did not receive HSTS header
@ -772,6 +781,7 @@ content-api-dev.azurewebsites.net: could not connect to host
continuumgaming.com: could not connect to host
controlcenter.gigahost.dk: did not receive HSTS header
coolchevy.org.ua: could not connect to host
coopens.com: did not receive HSTS header
coralproject.net: did not receive HSTS header
cordial-restaurant.com: did not receive HSTS header
core.mx: could not connect to host
@ -815,6 +825,7 @@ crowdcurity.com: did not receive HSTS header
crowdjuris.com: could not connect to host
crtvmgmt.com: could not connect to host
crudysql.com: could not connect to host
crute.me: could not connect to host
cruzr.xyz: could not connect to host
crypt.guru: could not connect to host
cryptify.eu: could not connect to host
@ -850,7 +861,6 @@ cybershambles.com: could not connect to host
cycleluxembourg.lu: did not receive HSTS header
cydia-search.io: could not connect to host
cyphertite.com: could not connect to host
d0xq.net: could not connect to host
dad256.tk: could not connect to host
dadtheimpaler.com: could not connect to host
dah5.com: did not receive HSTS header
@ -927,6 +937,7 @@ deltaconcepts.de: did not receive HSTS header
deltanet-production.de: max-age too low: 0
demilitarized.ninja: could not connect to host
democracychronicles.com: did not receive HSTS header
demotops.com: did not receive HSTS header
demuzere.com: could not connect to host
demuzere.eu: could not connect to host
demuzere.net: could not connect to host
@ -957,7 +968,6 @@ diarbag.us: did not receive HSTS header
diasp.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
diedrich.co: could not connect to host
digidroom.be: did not receive HSTS header
digitalbank.kz: did not receive HSTS header
digitaldaddy.net: could not connect to host
digitalriver.tk: could not connect to host
digitalskillswap.com: could not connect to host
@ -995,6 +1005,7 @@ dollywiki.co.uk: could not connect to host
dolphin-cloud.com: could not connect to host
dolphincorp.co.uk: could not connect to host
domaris.de: did not receive HSTS header
domfee.com: could not connect to host
dominique-mueller.de: did not receive HSTS header
donttrustrobots.nl: could not connect to host
donzelot.co.uk: max-age too low: 3600
@ -1035,6 +1046,7 @@ duesee.org: could not connect to host
dullsir.com: did not receive HSTS header
duria.de: max-age too low: 3600
dutchrank.com: could not connect to host
dutchrank.nl: could not connect to host
dwhd.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
dxa.io: could not connect to host
dycontrol.de: could not connect to host
@ -1067,6 +1079,7 @@ echosystem.fr: did not receive HSTS header
ecole-en-danger.fr: could not connect to host
ecomparemo.com: did not receive HSTS header
ecorus.eu: did not receive HSTS header
ecupcafe.com: could not connect to host
edcphenix.tk: could not connect to host
edelsteincosmetic.com: did not receive HSTS header
edissecurity.sk: did not receive HSTS header
@ -1161,7 +1174,7 @@ erotische-aanbiedingen.nl: could not connect to host
errlytics.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
errolz.com: could not connect to host
errors.zenpayroll.com: could not connect to host
ersindemirtas.com: could not connect to host
ersindemirtas.com: did not receive HSTS header
escotour.com: did not receive HSTS header
esec.rs: did not receive HSTS header
espra.com: could not connect to host
@ -1297,6 +1310,7 @@ flouartistique.ch: could not connect to host
flow.pe: could not connect to host
flow.su: could not connect to host
flowersandclouds.com: could not connect to host
flra.gov: could not connect to host
flukethoughts.com: could not connect to host
flushstudios.com: did not receive HSTS header
flyaces.com: did not receive HSTS header
@ -1397,6 +1411,7 @@ gampenhof.de: did not receive HSTS header
gancedo.com.es: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
gaptek.id: did not receive HSTS header
garciamartin.me: could not connect to host
gasnews.net: did not receive HSTS header
gatilagata.com.br: did not receive HSTS header
gchq.wtf: could not connect to host
gdpventure.com: max-age too low: 0
@ -1499,6 +1514,7 @@ gpsfix.cz: could not connect to host
gpstuner.com: did not receive HSTS header
gracesofgrief.com: max-age too low: 86400
grandmascookieblog.com: did not receive HSTS header
grandmasfridge.org: could not connect to host
graph.no: did not receive HSTS header
gravito.nl: did not receive HSTS header
gravity-net.de: could not connect to host
@ -1541,7 +1557,6 @@ gypthecat.com: max-age too low: 604800
gyz.io: could not connect to host
h2check.org: could not connect to host
haarkliniek.com: did not receive HSTS header
haavard.me: could not connect to host
habanaavenue.com: did not receive HSTS header
habbo.life: did not receive HSTS header
hablemosdetecnologia.com.ve: could not connect to host
@ -1549,6 +1564,7 @@ hack.cz: could not connect to host
hack.li: did not receive HSTS header
hacker.one: could not connect to host
hackerforever.com: did not receive HSTS header
hackernet.se: could not connect to host
hackerone-ext-adroll.com: could not connect to host
hackest.org: did not receive HSTS header
hackit.im: could not connect to host
@ -1602,6 +1618,7 @@ hdwallpapers.net: did not receive HSTS header
healtious.com: did not receive HSTS header
heart.ge: did not receive HSTS header
heartlandrentals.com: did not receive HSTS header
heartsucker.com: could not connect to host
heftkaufen.de: did not receive HSTS header
hejahanif.se: could not connect to host
helloworldhost.com: did not receive HSTS header
@ -1666,6 +1683,7 @@ howrandom.org: could not connect to host
hr-intranet.com: did not receive HSTS header
hsir.me: could not connect to host
hsts.date: could not connect to host
hszhyy120.com: did not receive HSTS header
http418.xyz: could not connect to host
httpstatuscode418.xyz: could not connect to host
hu.search.yahoo.com: did not receive HSTS header
@ -1686,7 +1704,7 @@ i-partners.sk: did not receive HSTS header
iamokay.nl: did not receive HSTS header
iamusingtheinter.net: could not connect to host
iamveto.com: could not connect to host
iapws.com: did not receive HSTS header
iapws.com: could not connect to host
iban.is: could not connect to host
icebat.dyndns.org: could not connect to host
icewoman.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
@ -1711,6 +1729,7 @@ ies-italia.it: did not receive HSTS header
ies.id.lv: could not connect to host
ifad.org: did not receive HSTS header
ifleurs.com: could not connect to host
ignace72.eu: could not connect to host
ignatisd.gr: did not receive HSTS header
ignitedmindz.in: could not connect to host
igule.net: could not connect to host
@ -1740,7 +1759,6 @@ immunicity.press: could not connect to host
immunicity.top: could not connect to host
imolug.org: did not receive HSTS header
imouto.my: max-age too low: 5184000
imouyang.com: could not connect to host
imperialwebsolutions.com: did not receive HSTS header
imu.li: did not receive HSTS header
imusic.dk: did not receive HSTS header
@ -1788,7 +1806,6 @@ inverselink.com: could not connect to host
invite24.pro: could not connect to host
inwesttitle.com: max-age too low: 0
iocheck.com: could not connect to host
ioiart.eu: did not receive HSTS header
ionx.co.uk: did not receive HSTS header
iop.intuit.com: max-age too low: 86400
iosmods.com: could not connect to host
@ -1797,6 +1814,7 @@ iotsms.io: could not connect to host
ip-life.net: could not connect to host
ip6.im: did not receive HSTS header
ipmimagazine.com: did not receive HSTS header
ipsec.pl: could not connect to host
iptel.by: max-age too low: 0
iptel.ro: could not connect to host
ipv6cloud.club: could not connect to host
@ -1822,6 +1840,7 @@ itos.asia: did not receive HSTS header
itos.pl: did not receive HSTS header
itsadog.co.uk: did not receive HSTS header
itsamurai.ru: max-age too low: 2592000
itsatrap.nl: could not connect to host
itsecurityassurance.pw: did not receive HSTS header
itsg-faq.de: could not connect to host
itshost.ru: could not connect to host
@ -1907,15 +1926,14 @@ jkbuster.com: could not connect to host
jmdekker.it: could not connect to host
joakimalgroy.com: could not connect to host
jobmedic.com: did not receive HSTS header
jobss.co.uk: could not connect to host
joedavison.me: could not connect to host
jogi-server.de: did not receive HSTS header
johnblackbourn.com: could not connect to host
johners.me: could not connect to host
johners.tech: did not receive HSTS header
johners.tech: could not connect to host
johnrom.com: did not receive HSTS header
jonas-keidel.de: did not receive HSTS header
jonasgroth.se: max-age too low: 2592000
jonasgroth.se: did not receive HSTS header
jonathan.ir: could not connect to host
jonathancarter.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
jonn.me: could not connect to host
@ -1975,7 +1993,6 @@ kawaii.io: could not connect to host
kawaiiku.com: could not connect to host
kawaiiku.de: could not connect to host
kayon.cf: could not connect to host
kcolford.com: could not connect to host
kcsordparticipation.org: could not connect to host
kd-plus.pp.ua: could not connect to host
kdata.it: did not receive HSTS header
@ -1989,7 +2006,7 @@ kerangalam.com: could not connect to host
kerksanders.nl: did not receive HSTS header
kermadec.net: could not connect to host
kernl.us: did not receive HSTS header
kevinapease.com: did not receive HSTS header
keybored.me: could not connect to host
keymaster.lookout.com: did not receive HSTS header
kgxtech.com: max-age too low: 2592000
ki-on.net: did not receive HSTS header
@ -2012,7 +2029,7 @@ kirkforcongress.com: could not connect to host
kirkforsenate.com: could not connect to host
kirkpatrickdavis.com: could not connect to host
kisa.io: could not connect to host
kisalt.im: could not connect to host
kisalt.im: did not receive HSTS header
kissart.net: could not connect to host
kissflow.com: did not receive HSTS header
kisun.co.jp: could not connect to host
@ -2030,6 +2047,8 @@ kleertjesvoordelig.nl: did not receive HSTS header
kleinblogje.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
kletterkater.com: did not receive HSTS header
klicktojob.de: could not connect to host
klingeletest.de: could not connect to host
klustekeningen.nl: did not receive HSTS header
kmartin.io: did not receive HSTS header
knccloud.com: could not connect to host
kngkng.com: could not connect to host
@ -2037,6 +2056,7 @@ knowledgesnap.com: did not receive HSTS header
kodokushi.fr: could not connect to host
koen.io: did not receive HSTS header
koenrouwhorst.nl: did not receive HSTS header
koketteriet.se: could not connect to host
kollabria.com: max-age too low: 0
komikito.com: could not connect to host
kompetenzwerft.de: did not receive HSTS header
@ -2080,7 +2100,6 @@ kylinj.com: could not connect to host
kyochon.fr: could not connect to host
kz.search.yahoo.com: did not receive HSTS header
kzjnet.com: could not connect to host
kzsdabas.hu: could not connect to host
labaia.info: could not connect to host
labina.com.tr: did not receive HSTS header
laboiteapc.fr: did not receive HSTS header
@ -2140,13 +2159,13 @@ lesperlesdunet.fr: could not connect to host
letras.mus.br: did not receive HSTS header
letsmultiplayerplay.com: did not receive HSTS header
letustravel.tk: could not connect to host
lewis.li: could not connect to host
lfullerdesign.com: did not receive HSTS header
lgiswa.com.au: did not receive HSTS header
lgrs.com.au: did not receive HSTS header
lgts.se: could not connect to host
li.search.yahoo.com: did not receive HSTS header
liaillustr.at: did not receive HSTS header
liam-w.com: could not connect to host
lianye1.cc: could not connect to host
lianye2.cc: could not connect to host
lianye3.cc: could not connect to host
@ -2218,6 +2237,7 @@ lookzook.com: did not receive HSTS header
loophost.com.br: did not receive HSTS header
lordjevington.co.uk: could not connect to host
lostinsecurity.com: could not connect to host
lostinweb.eu: could not connect to host
lothai.re: could not connect to host
lotsencafe.de: did not receive HSTS header
lovelifelovelive.com: could not connect to host
@ -2253,6 +2273,7 @@ luther.fi: could not connect to host
luxus-russen.de: did not receive HSTS header
luxwatch.com: could not connect to host
lv.search.yahoo.com: did not receive HSTS header
lyonl.com: did not receive HSTS header
lzkill.com: could not connect to host
m-ali.xyz: did not receive HSTS header
m.gparent.org: could not connect to host
@ -2274,6 +2295,7 @@ mafamane.com: could not connect to host
mafiareturns.com: max-age too low: 2592000
magenx.com: did not receive HSTS header
mahamed91.pw: could not connect to host
mahefa.co.uk: could not connect to host
mail-settings.google.com: did not receive HSTS header (error ignored - included regardless)
mail.google.com: did not receive HSTS header (error ignored - included regardless)
maildragon.com: could not connect to host
@ -2303,6 +2325,7 @@ markayapilandirma.com: could not connect to host
market.android.com: did not receive HSTS header (error ignored - included regardless)
markrego.com: could not connect to host
markus-dev.com: did not receive HSTS header
markusehrlicher.de: could not connect to host
markusweimar.de: did not receive HSTS header
marleyresort.com: did not receive HSTS header
marshut.net: could not connect to host
@ -2404,6 +2427,7 @@ mijn-email.org: could not connect to host
mikaelemilsson.net: did not receive HSTS header
mikeburns.com: did not receive HSTS header
mikeg.de: did not receive HSTS header
mikek.work: did not receive HSTS header
mikeology.org: could not connect to host
mikepair.net: did not receive HSTS header
mikonmaa.fi: could not connect to host
@ -2429,17 +2453,18 @@ mister.hosting: could not connect to host
misterl.net: did not receive HSTS header
mitchellrenouf.ca: could not connect to host
mittenhacks.com: could not connect to host
mitzpettel.com: could not connect to host
miui-germany.de: did not receive HSTS header
miyoshi-kikaku.co.jp: did not receive HSTS header
miyoshi-kikaku.com: did not receive HSTS header
mizd.at: could not connect to host
mizi.name: did not receive HSTS header
mlcdn.co: could not connect to host
mlpepilepsy.org: could not connect to host
mm13.at: could not connect to host
mmgazhomeloans.com: did not receive HSTS header
mnemotiv.com: could not connect to host
mnetworkingsolutions.co.uk: did not receive HSTS header
mobaircon.com: could not connect to host
mobifinans.ru: did not receive HSTS header
mobilekey.co: could not connect to host
mobilemedics.com: did not receive HSTS header
@ -2497,7 +2522,6 @@ mtcgf.com: did not receive HSTS header
mtg-esport.de: could not connect to host
mu.search.yahoo.com: did not receive HSTS header
mudcrab.us: did not receive HSTS header
mumei.space: could not connect to host
munich-rage.de: could not connect to host
munzee.com: did not receive HSTS header
muriburi.land: could not connect to host
@ -2538,7 +2562,6 @@ myraytech.net: did not receive HSTS header
mysecretrewards.com: did not receive HSTS header
mystery-science-theater-3000.de: did not receive HSTS header
mystudy.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
mythslegendscollection.com: did not receive HSTS header
myvirtualserver.com: max-age too low: 2592000
myzone.com: did not receive HSTS header
mziulu.me: could not connect to host
@ -2596,6 +2619,7 @@ netherwind.eu: did not receive HSTS header
netica.fr: did not receive HSTS header
netmagik.com: did not receive HSTS header
netsight.org: could not connect to host
nettefoundation.com: could not connect to host
netzbit.de: could not connect to host
netzpolitik.org: did not receive HSTS header
netztest.at: did not receive HSTS header
@ -2627,7 +2651,7 @@ niconode.com: could not connect to host
nien.chat: could not connect to host
niho.jp: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
nikcub.com: could not connect to host
nikksno.io: did not receive HSTS header
nikksno.io: could not connect to host
nikomo.fi: could not connect to host
ninchisho-online.com: did not receive HSTS header
nine-hells.net: could not connect to host
@ -2683,7 +2707,6 @@ nu3.fi: did not receive HSTS header
nu3.fr: did not receive HSTS header
nu3.no: did not receive HSTS header
nu3.se: did not receive HSTS header
nube.ninja: could not connect to host
nufla.de: could not connect to host
null-sec.ru: could not connect to host
null.cat: could not connect to host
@ -2825,7 +2848,7 @@ pacelink.de: could not connect to host
packlane.com: did not receive HSTS header
pader-deko.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
paestbin.com: could not connect to host
pagerate.io: could not connect to host
pagerate.io: did not receive HSTS header
pagetoimage.com: could not connect to host
pahae.de: did not receive HSTS header
paintingat.com: could not connect to host
@ -2843,7 +2866,6 @@ papygeek.com: could not connect to host
parent5446.us: could not connect to host
parentmail.co.uk: did not receive HSTS header
parithy.net: could not connect to host
parkingpoint.co.uk: could not connect to host
parodybit.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
parpaing-paillette.net: could not connect to host
particonpsplus.it: could not connect to host
@ -2854,6 +2876,7 @@ partyvan.it: could not connect to host
partyvan.moe: could not connect to host
partyvan.nl: could not connect to host
partyvan.se: could not connect to host
passphrase.today: could not connect to host
passwordbox.com: did not receive HSTS header
passwordrevelator.net: did not receive HSTS header
passwords.google.com: did not receive HSTS header (error ignored - included regardless)
@ -2927,6 +2950,7 @@ piratedb.com: could not connect to host
piratedot.com: could not connect to host
piratelist.online: could not connect to host
piratenlogin.de: could not connect to host
pirateproxy.sx: could not connect to host
pirati.cz: max-age too low: 604800
pirlitu.com: did not receive HSTS header
pisexy.me: did not receive HSTS header
@ -2958,10 +2982,9 @@ plombirator.kz: could not connect to host
plothost.com: did not receive HSTS header
ploup.net: could not connect to host
pmnts.io: could not connect to host
po.gl: could not connect to host
po.gl: did not receive HSTS header
poiema.com.sg: did not receive HSTS header
pol.in.th: could not connect to host
polaire.org: did not receive HSTS header
poleartschool.com: could not connect to host
polimat.org: could not connect to host
politically-incorrect.xyz: could not connect to host
@ -2975,8 +2998,7 @@ poolsandstuff.com: did not receive HSTS header
poon.tech: could not connect to host
porno-gif.ru: did not receive HSTS header
portalplatform.net: did not receive HSTS header
postcodewise.co.uk: could not connect to host
posterspy.com: did not receive HSTS header
postcodewise.co.uk: did not receive HSTS header
postscheduler.org: could not connect to host
posylka.de: did not receive HSTS header
poussinooz.fr: could not connect to host
@ -3026,7 +3048,8 @@ proximato.com: could not connect to host
proxybay.al: could not connect to host
proxybay.club: could not connect to host
proxybay.info: did not receive HSTS header
prxio.site: could not connect to host
prxio.date: could not connect to host
prxio.site: did not receive HSTS header
prytkov.com: did not receive HSTS header
psicologia.co.ve: could not connect to host
psw.academy: did not receive HSTS header
@ -3054,7 +3077,7 @@ qccqld.org.au: could not connect to host
qingxuan.info: max-age too low: 864000
qinxi1992.com: did not receive HSTS header
qldconservation.org: could not connect to host
qorm.co.uk: could not connect to host
qorm.co.uk: did not receive HSTS header
qrara.net: did not receive HSTS header
qrlending.com: did not receive HSTS header
quail.solutions: could not connect to host
@ -3072,9 +3095,9 @@ qwilink.me: did not receive HSTS header
r10n.com: did not receive HSTS header
r15.me: could not connect to host
r3bl.me: did not receive HSTS header
r40.us: could not connect to host
raajheshkannaa.com: could not connect to host
radicaleducation.net: could not connect to host
radiormi.com: did not receive HSTS header
rafaelcz.de: could not connect to host
railgun.com.cn: could not connect to host
rainbowbarracuda.com: could not connect to host
@ -3215,6 +3238,7 @@ rubyshop.nl: max-age too low: 604800
rudeotter.com: could not connect to host
rudloff.pro: did not receive HSTS header
rugirlfriend.com: could not connect to host
rugk.dedyn.io: could not connect to host
ruiming.me: did not receive HSTS header
runawebinar.nl: could not connect to host
runementors.com: could not connect to host
@ -3281,6 +3305,7 @@ schwarzkopfforyou.de: did not receive HSTS header
scienceathome.org: did not receive HSTS header
scooshonline.co.uk: did not receive HSTS header
scotbirchfield.com: did not receive HSTS header
scottdial.com: could not connect to host
scottgthomas.com: could not connect to host
scrambl.is: could not connect to host
scrambler.in: could not connect to host
@ -3337,6 +3362,7 @@ sensiblemn.org: could not connect to host
sensibus.com: did not receive HSTS header
seo.consulting: did not receive HSTS header
seomobo.com: could not connect to host
seon.me: could not connect to host
seowarp.net: did not receive HSTS header
sep23.ru: did not receive HSTS header
seq.tf: did not receive HSTS header
@ -3400,7 +3426,6 @@ simbolo.co.uk: 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
simonkjellberg.se: could not connect to host
simpleai.net: max-age too low: 600
simplefraud.com: could not connect to host
simplelearner.com: could not connect to host
@ -3419,6 +3444,7 @@ skk.io: could not connect to host
skoda-clever-lead.de: could not connect to host
skoda-im-dialog.de: could not connect to host
skullhouse.nyc: did not receive HSTS header
skyasker.cn: could not connect to host
skyflix.me: did not receive HSTS header
skyoy.com: could not connect to host
slash-dev.de: did not receive HSTS header
@ -3479,6 +3505,7 @@ someshit.xyz: could not connect to host
somethingnew.xyz: did not receive HSTS header
sonic.sk: max-age too low: 0
sonicrainboom.rocks: did not receive HSTS header
sortaweird.net: could not connect to host
sotiran.com: did not receive HSTS header
sotor.de: did not receive HSTS header
soulboy.io: did not receive HSTS header
@ -3603,6 +3630,7 @@ suksit.com: could not connect to host
sumoatm.com: did not receive HSTS header
sumoscout.de: did not receive HSTS header
suncountrymarine.com: did not receive HSTS header
sunflyer.cn: did not receive HSTS header
sunnyfruit.ru: did not receive HSTS header
sunshinepress.org: could not connect to host
suos.io: could not connect to host
@ -3682,7 +3710,6 @@ tcomms.org: max-age too low: 0
tcp.expert: did not receive HSTS header
teachforcanada.ca: did not receive HSTS header
team-one.racing: could not connect to host
team-pancake.eu: could not connect to host
teamsocial.co: did not receive HSTS header
teamzeus.cz: could not connect to host
tech55i.com: did not receive HSTS header
@ -3694,7 +3721,6 @@ techloaner.com: could not connect to host
techmatehq.com: could not connect to host
technosavvyport.com: did not receive HSTS header
techpointed.com: could not connect to host
techvalue.gr: did not receive HSTS header
tegelsensanitaironline.nl: did not receive HSTS header
tekshrek.com: did not receive HSTS header
telefonnummer.online: could not connect to host
@ -3734,7 +3760,7 @@ thecharlestonwaldorf.com: did not receive HSTS header
theclementinebutchers.com: could not connect to host
thecoffeehouse.xyz: could not connect to host
thediaryofadam.com: did not receive HSTS header
theendofzion.com: did not receive HSTS header
theendofzion.com: could not connect to host
theeyeopener.com: did not receive HSTS header
theflowerbasketonline.com: could not connect to host
thefootballanalyst.com: could not connect to host
@ -3749,6 +3775,7 @@ themicrocapital.com: could not connect to host
themillerslive.com: could not connect to host
theodorejones.info: could not connect to host
thepartywarehouse.co.uk: did not receive HSTS header
thepasteb.in: could not connect to host
thepiratebay.al: could not connect to host
thepiratebay.tech: could not connect to host
therapyportal.com: did not receive HSTS header
@ -3763,6 +3790,7 @@ thevintagenews.com: [Exception... "Component returned failure code: 0x80004005 (
thewebfellas.com: did not receive HSTS header
thezonders.com: did not receive HSTS header
thierfreund.de: could not connect to host
thijsvanderveen.net: could not connect to host
thinkcoding.de: could not connect to host
thirdpartytrade.com: did not receive HSTS header
thirty5.net: did not receive HSTS header
@ -3774,7 +3802,6 @@ thorncreek.net: did not receive HSTS header
thriveapproach.co.uk: did not receive HSTS header
thues.eu: could not connect to host
thumbtack.com: did not receive HSTS header
ticfleet.com: could not connect to host
tickettoaster.de: max-age too low: 0
tickopa.co.uk: could not connect to host
tickreport.com: did not receive HSTS header
@ -3813,7 +3840,7 @@ tobias-bielefeld.de: did not receive HSTS header
tobiasmathes.com: could not connect to host
tobiasmathes.name: could not connect to host
tobiasofficial.at: could not connect to host
todo.is: could not connect to host
todo.is: did not receive HSTS header
todobazar.es: could not connect to host
tokyopopline.com: did not receive HSTS header
tollmanz.com: did not receive HSTS header
@ -3848,6 +3875,7 @@ tradingcentre.com.au: did not receive HSTS header
tradinghope.com: could not connect to host
traeningsprojekt.dk: did not receive HSTS header
traindb.nl: could not connect to host
trainut.com: could not connect to host
translate.googleapis.com: did not receive HSTS header (error ignored - included regardless)
transportal.sk: did not receive HSTS header
treeby.net: could not connect to host
@ -3869,6 +3897,7 @@ tsecy.com: did not receive HSTS header
tsgoc.com: did not receive HSTS header
tsrstore.gq: could not connect to host
tssouthernpower.com: max-age too low: 0
tsumegumi.net: could not connect to host
tuamoronline.com: could not connect to host
tubepro.de: max-age too low: 600000
tuingereedschappen.net: could not connect to host
@ -3898,6 +3927,8 @@ tx041cap.org: did not receive HSTS header
txclimbers.com: could not connect to host
txf.pw: could not connect to host
ty2u.com: did not receive HSTS header
tyler.rs: could not connect to host
tyleromeara.com: could not connect to host
tylian.net: max-age too low: 0
typingrevolution.com: did not receive HSTS header
tyrelius.com: did not receive HSTS header
@ -3905,7 +3936,6 @@ tyroproducts.eu: did not receive HSTS header
tzappa.net: could not connect to host
u-blox.com: max-age too low: 0
ua.search.yahoo.com: did not receive HSTS header
uberwald.ws: could not connect to host
ubicloud.de: could not connect to host
ublox.com: did not receive HSTS header
ubuntuhot.com: did not receive HSTS header
@ -3922,6 +3952,7 @@ ulmo.dk: could not connect to host
ultros.io: did not receive HSTS header
umidev.com: could not connect to host
umie.cc: did not receive HSTS header
unart.info: could not connect to host
unbanthe.net: could not connect to host
unblocked-networks.org: could not connect to host
unblocked.host: could not connect to host
@ -3989,7 +4020,6 @@ vanitynailworkz.com: could not connect to host
vanlaanen.com: did not receive HSTS header
vansieleghem.com: could not connect to host
vasanth.org: could not connect to host
vault21.net: could not connect to host
vbulletin-russia.com: could not connect to host
vbulletinrussia.com: could not connect to host
vcdove.com: did not receive HSTS header
@ -4007,6 +4037,7 @@ vetmgmt.com: could not connect to host
vfree.org: could not connect to host
vglimg.com: could not connect to host
vhost.co.id: could not connect to host
vibrant-america.com: could not connect to host
videnskabsklubben.dk: did not receive HSTS header
videomuz.com: did not receive HSTS header
vidz.ga: could not connect to host
@ -4117,7 +4148,6 @@ whatnext.limited: did not receive HSTS header
whats.io: did not receive HSTS header
whatsstalk.me: could not connect to host
when-release.com: did not receive HSTS header
whisker.network: could not connect to host
whiterabbitcakery.com: could not connect to host
whitestagforge.com: did not receive HSTS header
whoclicks.net: could not connect to host
@ -4211,7 +4241,7 @@ xellos.ml: 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: could not connect to host
xf-liam.com: did not receive HSTS header
xfive.de: did not receive HSTS header
xia100.xyz: could not connect to host
xiaody.me: could not connect to host
@ -4274,6 +4304,7 @@ yippie.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_
yjsoft.me: did not receive HSTS header
ynode.co: did not receive HSTS header
ynsn.nl: did not receive HSTS header
yntongji.com: did not receive HSTS header
yoga.is-an-engineer.com: could not connect to host
yokeepo.com: could not connect to host
yoloboatrentals.com: did not receive HSTS header
@ -4320,9 +4351,9 @@ zeytin.pro: could not connect to host
zh.search.yahoo.com: did not receive HSTS header
zhaojin97.cn: did not receive HSTS header
zhendingresources.com: max-age too low: 0
zihao.me: could not connect to host
zingarastore.com: could not connect to host
zirtue.io: could not connect to host
ziyuanabc.xyz: could not connect to host
zkillboard.com: did not receive HSTS header
zking.ga: could not connect to host
zmy.im: could not connect to host
zocken.com: could not connect to host

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -251,10 +251,11 @@ ClientEngine.prototype = {
const allCommands = this._readCommands();
const clientCommands = allCommands[clientId] || [];
if (hasDupeCommand(clientCommands, command)) {
return;
return false;
}
allCommands[clientId] = clientCommands.concat(command);
this._saveCommands(allCommands);
return true;
},
_syncStartup: function _syncStartup() {
@ -477,7 +478,7 @@ ClientEngine.prototype = {
* @param args Array of arguments/data for command
* @param clientId Client to send command to
*/
_sendCommandToClient: function sendCommandToClient(command, args, clientId) {
_sendCommandToClient: function sendCommandToClient(command, args, clientId, flowID = null) {
this._log.trace("Sending " + command + " to " + clientId);
let client = this._store._remoteClients[clientId];
@ -491,11 +492,21 @@ ClientEngine.prototype = {
let action = {
command: command,
args: args,
flowID: flowID || Utils.makeGUID(), // used for telemetry.
};
this._log.trace("Client " + clientId + " got a new action: " + [command, args]);
this._addClientCommand(clientId, action);
this._tracker.addChangedID(clientId);
if (this._addClientCommand(clientId, action)) {
this._log.trace(`Client ${clientId} got a new action`, [command, args]);
this._tracker.addChangedID(clientId);
let deviceID;
try {
deviceID = this.service.identity.hashedDeviceID(clientId);
} catch (_) {}
this.service.recordTelemetryEvent("sendcommand", command, undefined,
{ flowID: action.flowID, deviceID });
} else {
this._log.trace(`Client ${clientId} got a duplicate action`, [command, args]);
}
},
/**
@ -515,9 +526,12 @@ ClientEngine.prototype = {
let URIsToDisplay = [];
// Process each command in order.
for (let rawCommand of commands) {
let {command, args} = rawCommand;
let {command, args, flowID} = rawCommand;
this._log.debug("Processing command: " + command + "(" + args + ")");
this.service.recordTelemetryEvent("processcommand", command, undefined,
{ flowID });
let engines = [args[0]];
switch (command) {
case "resetAll":
@ -570,8 +584,11 @@ ClientEngine.prototype = {
* @param clientId
* Client ID to send command to. If undefined, send to all remote
* clients.
* @param flowID
* A unique identifier used to track success for this operation across
* devices.
*/
sendCommand: function sendCommand(command, args, clientId) {
sendCommand: function sendCommand(command, args, clientId, flowID = null) {
let commandData = this._commands[command];
// Don't send commands that we don't know about.
if (!commandData) {
@ -586,11 +603,11 @@ ClientEngine.prototype = {
}
if (clientId) {
this._sendCommandToClient(command, args, clientId);
this._sendCommandToClient(command, args, clientId, flowID);
} else {
for (let [id, record] of Object.entries(this._store._remoteClients)) {
if (!record.stale) {
this._sendCommandToClient(command, args, id);
this._sendCommandToClient(command, args, id, flowID);
}
}
}

Просмотреть файл

@ -1750,6 +1750,10 @@ Sync11Service.prototype = {
return callback(null, result);
});
},
recordTelemetryEvent(object, method, value, extra = undefined) {
Svc.Obs.notify("weave:telemetry:event", { object, method, value, extra });
},
};
this.Service = new Sync11Service();

Просмотреть файл

@ -45,6 +45,8 @@ const TOPICS = [
"weave:engine:sync:uploaded",
"weave:engine:validate:finish",
"weave:engine:validate:error",
"weave:telemetry:event",
];
const PING_FORMAT_VERSION = 1;
@ -127,6 +129,44 @@ function timeDeltaFrom(monotonicStartTime) {
return -1;
}
// This function validates the payload of a telemetry "event" - this can be
// removed once there are APIs available for the telemetry modules to collect
// these events (bug 1329530) - but for now we simulate that planned API as
// best we can.
function validateTelemetryEvent(eventDetails) {
let { object, method, value, extra } = eventDetails;
// Do do basic validation of the params - everything except "extra" must
// be a string. method and object are required.
if (typeof method != "string" || typeof object != "string" ||
(value && typeof value != "string") ||
(extra && typeof extra != "object")) {
log.warn("Invalid event parameters - wrong types", eventDetails);
return false;
}
// length checks.
if (method.length > 20 || object.length > 20 ||
(value && value.length > 80)) {
log.warn("Invalid event parameters - wrong lengths", eventDetails);
return false;
}
// extra can be falsey, or an object with string names and values.
if (extra) {
if (Object.keys(extra).length > 10) {
log.warn("Invalid event parameters - too many extra keys", eventDetails);
return false;
}
for (let [ename, evalue] of Object.entries(extra)) {
if (typeof ename != "string" || ename.length > 15 ||
typeof evalue != "string" || evalue.length > 85) {
log.warn(`Invalid event parameters: extra item "${ename} is invalid`, eventDetails);
return false;
}
}
}
return true;
}
class EngineRecord {
constructor(name) {
// startTime is in ms from process start, but is monotonic (unlike Date.now())
@ -416,6 +456,8 @@ class SyncTelemetryImpl {
this.payloads = [];
this.discarded = 0;
this.events = [];
this.maxEventsCount = Svc.Prefs.get("telemetry.maxEventsCount", 1000);
this.maxPayloadCount = Svc.Prefs.get("telemetry.maxPayloadCount");
this.submissionInterval = Svc.Prefs.get("telemetry.submissionInterval") * 1000;
this.lastSubmissionTime = Telemetry.msSinceProcessStart();
@ -431,6 +473,7 @@ class SyncTelemetryImpl {
syncs: this.payloads.slice(),
uid: this.lastUID,
deviceID: this.lastDeviceID,
events: this.events.length == 0 ? undefined : this.events,
};
}
@ -440,6 +483,7 @@ class SyncTelemetryImpl {
let result = this.getPingJSON(reason);
this.payloads = [];
this.discarded = 0;
this.events = [];
this.submit(result);
}
@ -530,6 +574,39 @@ class SyncTelemetryImpl {
}
}
_recordEvent(eventDetails) {
if (this.events.length >= this.maxEventsCount) {
log.warn("discarding event - already queued our maximum", eventDetails);
return;
}
if (!validateTelemetryEvent(eventDetails)) {
// we've already logged what the problem is...
return;
}
log.debug("recording event", eventDetails);
let { object, method, value, extra } = eventDetails;
let category = "sync";
let ts = Math.floor(tryGetMonotonicTimestamp());
// An event record is a simple array with at least 4 items.
let event = [ts, category, method, object];
// It may have up to 6 elements if |extra| is defined
if (value) {
event.push(value);
if (extra) {
event.push(extra);
}
} else {
if (extra) {
event.push(null); // a null for the empty value.
event.push(extra);
}
}
this.events.push(event);
}
observe(subject, topic, data) {
log.trace(`observed ${topic} ${data}`);
@ -598,6 +675,10 @@ class SyncTelemetryImpl {
}
break;
case "weave:telemetry:event":
this._recordEvent(subject);
break;
default:
log.warn(`unexpected observer topic ${topic}`);
break;

Просмотреть файл

@ -276,7 +276,15 @@ function assert_valid_ping(record) {
// no Syncs - either of them not being true might be an actual problem)
if (record && (record.why != "shutdown" || record.syncs.length != 0)) {
if (!SyncPingValidator(record)) {
deepEqual([], SyncPingValidator.errors, "Sync telemetry ping validation failed");
if (SyncPingValidator.errors.length) {
// validation failed - using a simple |deepEqual([], errors)| tends to
// truncate the validation errors in the output and doesn't show that
// the ping actually was - so be helpful.
do_print("telemetry ping validation failed");
do_print("the ping data is: " + JSON.stringify(record, undefined, 2));
do_print("the validation failures: " + JSON.stringify(SyncPingValidator.errors, undefined, 2));
ok(false, "Sync telemetry ping validation failed - see output above for details");
}
}
equal(record.version, 1);
record.syncs.forEach(p => {

Просмотреть файл

@ -20,6 +20,11 @@
"type": "array",
"minItems": 1,
"items": { "$ref": "#/definitions/payload" }
},
"events": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/definitions/event" }
}
},
"definitions": {
@ -128,6 +133,11 @@
"failed": { "type": "integer", "minimum": 1 }
}
},
"event": {
"type": "array",
"minItems": 4,
"maxItems": 6
},
"error": {
"oneOf": [
{ "$ref": "#/definitions/httpError" },

Просмотреть файл

@ -389,6 +389,7 @@ add_test(function test_send_command() {
equal(command.command, action);
equal(command.args.length, 2);
deepEqual(command.args, args);
ok(command.flowID);
notEqual(tracker.changedIDs[remoteId], undefined);
@ -632,12 +633,12 @@ add_task(async function test_filter_duplicate_names() {
let collection = server.getCollection("foo", "clients");
let recentPayload = JSON.parse(JSON.parse(collection.payload(recentID)).ciphertext);
deepEqual(recentPayload.commands, [{ command: "logout", args: [] }],
"Should send commands to the recent client");
compareCommands(recentPayload.commands, [{ command: "logout", args: [] }],
"Should send commands to the recent client");
let oldPayload = JSON.parse(JSON.parse(collection.payload(oldID)).ciphertext);
deepEqual(oldPayload.commands, [{ command: "logout", args: [] }],
"Should send commands to the week-old client");
compareCommands(oldPayload.commands, [{ command: "logout", args: [] }],
"Should send commands to the week-old client");
let dupePayload = JSON.parse(JSON.parse(collection.payload(dupeID)).ciphertext);
deepEqual(dupePayload.commands, [],
@ -914,6 +915,7 @@ add_task(async function test_merge_commands() {
commands: [{
command: "displayURI",
args: ["https://example.com", engine.localID, "Yak Herders Anonymous"],
flowID: Utils.makeGUID(),
}],
version: "48",
protocols: ["1.5"],
@ -927,6 +929,7 @@ add_task(async function test_merge_commands() {
commands: [{
command: "logout",
args: [],
flowID: Utils.makeGUID(),
}],
version: "48",
protocols: ["1.5"],
@ -945,7 +948,7 @@ add_task(async function test_merge_commands() {
let collection = server.getCollection("foo", "clients");
let desktopPayload = JSON.parse(JSON.parse(collection.payload(desktopID)).ciphertext);
deepEqual(desktopPayload.commands, [{
compareCommands(desktopPayload.commands, [{
command: "displayURI",
args: ["https://example.com", engine.localID, "Yak Herders Anonymous"],
}, {
@ -954,8 +957,8 @@ add_task(async function test_merge_commands() {
}], "Should send the logout command to the desktop client");
let mobilePayload = JSON.parse(JSON.parse(collection.payload(mobileID)).ciphertext);
deepEqual(mobilePayload.commands, [{ command: "logout", args: [] }],
"Should not send a duplicate logout to the mobile client");
compareCommands(mobilePayload.commands, [{ command: "logout", args: [] }],
"Should not send a duplicate logout to the mobile client");
} finally {
Svc.Prefs.resetBranch("");
Service.recordManager.clearCache();
@ -1022,7 +1025,7 @@ add_task(async function test_duplicate_remote_commands() {
let collection = server.getCollection("foo", "clients");
let desktopPayload = JSON.parse(JSON.parse(collection.payload(desktopID)).ciphertext);
deepEqual(desktopPayload.commands, [{
compareCommands(desktopPayload.commands, [{
command: "displayURI",
args: ["https://foobar.com", engine.localID, "Foo bar!"],
}], "Should only send the second command to the desktop client");
@ -1062,7 +1065,9 @@ add_task(async function test_upload_after_reboot() {
name: "Device B",
type: "desktop",
commands: [{
command: "displayURI", args: ["https://deviceclink.com", deviceCID, "Device C link"]
command: "displayURI",
args: ["https://deviceclink.com", deviceCID, "Device C link"],
flowID: Utils.makeGUID(),
}],
version: "48",
protocols: ["1.5"],
@ -1092,7 +1097,7 @@ add_task(async function test_upload_after_reboot() {
let collection = server.getCollection("foo", "clients");
let deviceBPayload = JSON.parse(JSON.parse(collection.payload(deviceBID)).ciphertext);
deepEqual(deviceBPayload.commands, [{
compareCommands(deviceBPayload.commands, [{
command: "displayURI", args: ["https://deviceclink.com", deviceCID, "Device C link"]
}], "Should be the same because the upload failed");
@ -1113,7 +1118,7 @@ add_task(async function test_upload_after_reboot() {
engine._sync();
deviceBPayload = JSON.parse(JSON.parse(collection.payload(deviceBID)).ciphertext);
deepEqual(deviceBPayload.commands, [{
compareCommands(deviceBPayload.commands, [{
command: "displayURI",
args: ["https://example.com", engine.localID, "Yak Herders Anonymous"],
}], "Should only had written our outgoing command");
@ -1153,10 +1158,14 @@ add_task(async function test_keep_cleared_commands_after_reboot() {
name: "Device A",
type: "desktop",
commands: [{
command: "displayURI", args: ["https://deviceblink.com", deviceBID, "Device B link"]
command: "displayURI",
args: ["https://deviceblink.com", deviceBID, "Device B link"],
flowID: Utils.makeGUID(),
},
{
command: "displayURI", args: ["https://deviceclink.com", deviceCID, "Device C link"]
command: "displayURI",
args: ["https://deviceclink.com", deviceCID, "Device C link"],
flowID: Utils.makeGUID(),
}],
version: "48",
protocols: ["1.5"],
@ -1195,7 +1204,7 @@ add_task(async function test_keep_cleared_commands_after_reboot() {
equal(commandsProcessed, 2, "We processed 2 commands");
let localRemoteRecord = JSON.parse(JSON.parse(collection.payload(engine.localID)).ciphertext);
deepEqual(localRemoteRecord.commands, [{
compareCommands(localRemoteRecord.commands, [{
command: "displayURI", args: ["https://deviceblink.com", deviceBID, "Device B link"]
},
{
@ -1208,13 +1217,19 @@ add_task(async function test_keep_cleared_commands_after_reboot() {
name: "Device A",
type: "desktop",
commands: [{
command: "displayURI", args: ["https://deviceblink.com", deviceBID, "Device B link"]
command: "displayURI",
args: ["https://deviceblink.com", deviceBID, "Device B link"],
flowID: Utils.makeGUID(),
},
{
command: "displayURI", args: ["https://deviceclink.com", deviceCID, "Device C link"]
command: "displayURI",
args: ["https://deviceclink.com", deviceCID, "Device C link"],
flowID: Utils.makeGUID(),
},
{
command: "displayURI", args: ["https://deviceclink2.com", deviceCID, "Device C link 2"]
command: "displayURI",
args: ["https://deviceclink2.com", deviceCID, "Device C link 2"],
flowID: Utils.makeGUID(),
}],
version: "48",
protocols: ["1.5"],
@ -1302,7 +1317,7 @@ add_task(async function test_deleted_commands() {
"Should not reupload deleted clients");
let activePayload = JSON.parse(JSON.parse(collection.payload(activeID)).ciphertext);
deepEqual(activePayload.commands, [{ command: "logout", args: [] }],
compareCommands(activePayload.commands, [{ command: "logout", args: [] }],
"Should send the command to the active client");
} finally {
Svc.Prefs.resetBranch("");
@ -1346,18 +1361,19 @@ add_task(async function test_send_uri_ack() {
ourPayload.commands = [{
command: "displayURI",
args: ["https://example.com", fakeSenderID, "Yak Herders Anonymous"],
flowID: Utils.makeGUID(),
}];
server.insertWBO("foo", "clients", new ServerWBO(engine.localID, encryptPayload(ourPayload), now));
_("Sync again");
engine._sync();
deepEqual(engine.localCommands, [{
compareCommands(engine.localCommands, [{
command: "displayURI",
args: ["https://example.com", fakeSenderID, "Yak Herders Anonymous"],
}], "Should receive incoming URI");
ok(engine.processIncomingCommands(), "Should process incoming commands");
const clearedCommands = engine._readCommands()[engine.localID];
deepEqual(clearedCommands, [{
compareCommands(clearedCommands, [{
command: "displayURI",
args: ["https://example.com", fakeSenderID, "Yak Herders Anonymous"],
}], "Should mark the commands as cleared after processing");

Просмотреть файл

@ -565,4 +565,92 @@ add_task(async function test_no_foreign_engines_in_success_ping() {
Service.engineManager.unregister(engine);
await cleanAndGo(engine, server);
}
});
});
add_task(async function test_events() {
Service.engineManager.register(BogusEngine);
let engine = Service.engineManager.get("bogus");
engine.enabled = true;
let server = serverForUsers({"foo": "password"}, {
meta: {global: {engines: {bogus: {version: engine.version, syncID: engine.syncID}}}},
steam: {}
});
await SyncTestingInfrastructure(server);
try {
Service.recordTelemetryEvent("object", "method", "value", { foo: "bar" });
let ping = await wait_for_ping(() => Service.sync(), true, true);
equal(ping.events.length, 1);
let [timestamp, category, method, object, value, extra] = ping.events[0];
ok((typeof timestamp == "number") && timestamp > 0); // timestamp.
equal(category, "sync");
equal(method, "method");
equal(object, "object");
equal(value, "value");
deepEqual(extra, { foo: "bar" });
// Test with optional values.
Service.recordTelemetryEvent("object", "method");
ping = await wait_for_ping(() => Service.sync(), false, true);
equal(ping.events.length, 1);
equal(ping.events[0].length, 4);
Service.recordTelemetryEvent("object", "method", "extra");
ping = await wait_for_ping(() => Service.sync(), false, true);
equal(ping.events.length, 1);
equal(ping.events[0].length, 5);
Service.recordTelemetryEvent("object", "method", undefined, { foo: "bar" });
ping = await wait_for_ping(() => Service.sync(), false, true);
equal(ping.events.length, 1);
equal(ping.events[0].length, 6);
[timestamp, category, method, object, value, extra] = ping.events[0];
equal(value, null);
} finally {
Service.engineManager.unregister(engine);
await cleanAndGo(engine, server);
}
});
add_task(async function test_invalid_events() {
Service.engineManager.register(BogusEngine);
let engine = Service.engineManager.get("bogus");
engine.enabled = true;
let server = serverForUsers({"foo": "password"}, {
meta: {global: {engines: {bogus: {version: engine.version, syncID: engine.syncID}}}},
steam: {}
});
async function checkNotRecorded(...args) {
Service.recordTelemetryEvent.call(args);
let ping = await wait_for_ping(() => Service.sync(), false, true);
equal(ping.events, undefined);
}
await SyncTestingInfrastructure(server);
try {
let long21 = "l".repeat(21);
let long81 = "l".repeat(81);
let long86 = "l".repeat(86);
await checkNotRecorded("object");
await checkNotRecorded("object", 2);
await checkNotRecorded(2, "method");
await checkNotRecorded("object", "method", 2);
await checkNotRecorded("object", "method", "value", 2);
await checkNotRecorded("object", "method", "value", { foo: 2 });
await checkNotRecorded(long21, "method", "value");
await checkNotRecorded("object", long21, "value");
await checkNotRecorded("object", "method", long81);
let badextra = {};
badextra[long21] = "x";
await checkNotRecorded("object", "method", "value", badextra);
badextra = { "x": long86 };
await checkNotRecorded("object", "method", "value", badextra);
for (let i = 0; i < 10; i++) {
badextra["name" + i] = "x";
}
await checkNotRecorded("object", "method", "value", badextra);
} finally {
Service.engineManager.unregister(engine);
await cleanAndGo(engine, server);
}
});

Просмотреть файл

@ -67,7 +67,7 @@ stylo-tests:
- cppunit
- crashtest
- reftest-stylo
- mochitest-stylo
- mochitest-style
ccov-code-coverage-tests:
- mochitest

Просмотреть файл

@ -770,9 +770,9 @@ mochitest-webgl:
extra-options:
- --mochitest-suite=mochitest-gl
mochitest-stylo:
description: "Mochitest run for Stylo"
suite: mochitest/mochitest-stylo
mochitest-style:
description: "Mochitest plain run for style system"
suite: mochitest/mochitest-style
treeherder-symbol: tc-M(s)
loopback-video: true
e10s: false
@ -785,7 +785,7 @@ mochitest-stylo:
- unittests/linux_unittest.py
- remove_executables.py
extra-options:
- --mochitest-suite=mochitest-stylo
- --mochitest-suite=mochitest-style
reftest:
description: "Reftest run"

Просмотреть файл

@ -203,7 +203,7 @@ config = {
"jetpack-package-clipboard": ["--flavor=jetpack-package", "--subsuite=clipboard"],
"jetpack-addon": ["--flavor=jetpack-addon"],
"a11y": ["--flavor=a11y"],
"mochitest-stylo": ["--disable-e10s", "--tag=stylo"],
"mochitest-style": ["--disable-e10s", "layout/style/test"],
},
# local reftest suites
"all_reftest_suites": {

Просмотреть файл

@ -97,7 +97,10 @@ Structure:
}
}
]
}]
}],
events: [
event_array // See events below,
]
}
}
@ -180,3 +183,42 @@ syncs.devices
~~~~~~~~~~~~~
The list of remote devices associated with this account, as reported by the clients collection. The ID of each device is hashed using the same algorithm as the local id.
Events in the "sync" ping
=========================
The sync ping includes events in the same format as they are included in the
main ping. The documentation for these events will land in bug 1302666.
Every event recorded in this ping will have a category of ``sync``. The following
events are defined, categorized by the event method.
sendcommand
-----------
Records that Sync wrote a remote "command" to another client. These commands
cause that other client to take some action, such as resetting Sync on that
client, or opening a new URL.
- object: The specific command being written.
- value: Not used (ie, ``undefined``)
- extra: An object with the following attributes:
- deviceID: A GUID which identifies the device the command is being sent to.
- flowID: A GUID which uniquely identifies this command invocation.
processcommand
--------------
Records that Sync processed a remote "command" previously sent by another
client. This is logically the "other end" of ``sendcommand``.
- object: The specific command being processed.
- value: Not used (ie, ``undefined``)
- extra: An object with the following attributes:
- deviceID: A GUID which identifies the device the command is being sent to.
- flowID: A GUID which uniquely identifies this command invocation. The value
for this GUID will be the same as the flowID sent to the client via
``sendcommand``.

Просмотреть файл

@ -246,14 +246,19 @@ static inline bool profiler_in_privacy_mode() { return false; }
static inline void profiler_log(const char *str) {}
static inline void profiler_log(const char *fmt, va_list args) {}
namespace mozilla {
class AutoProfilerRegister final MOZ_STACK_CLASS
{
AutoProfilerRegister(const char* aName) {}
public:
explicit AutoProfilerRegister(const char* aName) {}
private:
AutoProfilerRegister(const AutoProfilerRegister&) = delete;
AutoProfilerRegister& operator=(const AutoProfilerRegister&) = delete;
};
} // namespace mozilla
#else
#include "GeckoProfilerImpl.h"

Просмотреть файл

@ -1813,12 +1813,18 @@ moz_gtk_menu_item_paint(WidgetNodeType widget, cairo_t *cr, GdkRectangle* rect,
GtkWidgetState* state, GtkTextDirection direction)
{
gint x, y, w, h;
guint minorVersion = gtk_get_minor_version();
GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state);
// GTK versions prior to 3.8 render the background and frame only when not
// a separator and in hover prelight.
if (minorVersion < 8 && (widget == MOZ_GTK_MENUSEPARATOR ||
!(state_flags & GTK_STATE_FLAG_PRELIGHT)))
return MOZ_GTK_SUCCESS;
GtkStyleContext* style = ClaimStyleContext(widget, direction, state_flags);
bool pre_3_6 = gtk_check_version(3, 6, 0) != nullptr;
if (pre_3_6) {
if (minorVersion < 6) {
// GTK+ 3.4 saves the style context and adds the menubar class to
// menubar children, but does each of these only when drawing, not
// during layout.
@ -1836,7 +1842,7 @@ moz_gtk_menu_item_paint(WidgetNodeType widget, cairo_t *cr, GdkRectangle* rect,
gtk_render_background(style, cr, x, y, w, h);
gtk_render_frame(style, cr, x, y, w, h);
if (pre_3_6) {
if (minorVersion < 6) {
gtk_style_context_restore(style);
}
ReleaseStyleContext(style);