зеркало из https://github.com/mozilla/gecko-dev.git
Merge mozilla-central to mozilla-inbound
This commit is contained in:
Коммит
06c0537572
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче