mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 11:55:49 +00:00
Merge mozilla-central to mozilla-inbound
This commit is contained in:
commit
9c7529527f
@ -9,6 +9,10 @@ module.metadata = {
|
||||
|
||||
const { flatten } = require('./array');
|
||||
|
||||
// Create a shortcut for Array.prototype.slice.call().
|
||||
const unbind = Function.call.bind(Function.bind, Function.call);
|
||||
const slice = unbind(Array.prototype.slice);
|
||||
|
||||
/**
|
||||
* Merges all the properties of all arguments into first argument. If two or
|
||||
* more argument objects have own properties with the same name, the property
|
||||
@ -34,7 +38,7 @@ function merge(source) {
|
||||
// `Boolean` converts the first parameter to a boolean value. Any object is
|
||||
// converted to `true` where `null` and `undefined` becames `false`. Therefore
|
||||
// the `filter` method will keep only objects that are defined and not null.
|
||||
Array.slice(arguments, 1).filter(Boolean).forEach(function onEach(properties) {
|
||||
slice(arguments, 1).filter(Boolean).forEach(function onEach(properties) {
|
||||
getOwnPropertyIdentifiers(properties).forEach(function(name) {
|
||||
descriptor[name] = Object.getOwnPropertyDescriptor(properties, name);
|
||||
});
|
||||
@ -50,7 +54,7 @@ exports.merge = merge;
|
||||
* `merge(Object.create(source1), source2, source3)`.
|
||||
*/
|
||||
function extend(source) {
|
||||
let rest = Array.slice(arguments, 1);
|
||||
let rest = slice(arguments, 1);
|
||||
rest.unshift(Object.create(source));
|
||||
return merge.apply(null, rest);
|
||||
}
|
||||
@ -72,7 +76,7 @@ exports.each = each;
|
||||
* merging XPCOM objects
|
||||
*/
|
||||
function safeMerge(source) {
|
||||
Array.slice(arguments, 1).forEach(function onEach (obj) {
|
||||
slice(arguments, 1).forEach(function onEach (obj) {
|
||||
for (let prop in obj) source[prop] = obj[prop];
|
||||
});
|
||||
return source;
|
||||
|
@ -1,6 +1,9 @@
|
||||
MOZ_AUTOMATION_BUILD_SYMBOLS=0
|
||||
MOZ_AUTOMATION_L10N_CHECK=0
|
||||
|
||||
# Needed to set SourceRepository in application.ini (used by Talos)
|
||||
export MOZILLA_OFFICIAL=1
|
||||
|
||||
. "$topsrcdir/build/macosx/mozconfig.common"
|
||||
. "$topsrcdir/build/mozconfig.common.override"
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
MOZ_AUTOMATION_BUILD_SYMBOLS=0
|
||||
MOZ_AUTOMATION_L10N_CHECK=0
|
||||
|
||||
# Needed to set SourceRepository in application.ini (used by Talos)
|
||||
export MOZILLA_OFFICIAL=1
|
||||
|
||||
. "$topsrcdir/browser/config/mozconfigs/common"
|
||||
. "$topsrcdir/build/mozconfig.win-common"
|
||||
. "$topsrcdir/build/win32/mozconfig.vs-latest"
|
||||
|
@ -1,6 +1,9 @@
|
||||
MOZ_AUTOMATION_BUILD_SYMBOLS=0
|
||||
MOZ_AUTOMATION_L10N_CHECK=0
|
||||
|
||||
# Needed to set SourceRepository in application.ini (used by Talos)
|
||||
export MOZILLA_OFFICIAL=1
|
||||
|
||||
. "$topsrcdir/browser/config/mozconfigs/win64/common-win64"
|
||||
. "$topsrcdir/browser/config/mozconfigs/common"
|
||||
. "$topsrcdir/build/mozconfig.win-common"
|
||||
|
@ -513,7 +513,7 @@ description > html|a {
|
||||
}
|
||||
|
||||
.fxaAccountBoxButtons > button:first-child {
|
||||
margin-right: 14px !important;
|
||||
margin-inline-end: 14px !important;
|
||||
}
|
||||
|
||||
.fxaSyncIllustration {
|
||||
|
@ -28,7 +28,7 @@ const MAX_ORDINAL = 99;
|
||||
* DevTools is a class that represents a set of developer tools, it holds a
|
||||
* set of tools and keeps track of open toolboxes in the browser.
|
||||
*/
|
||||
this.DevTools = function DevTools() {
|
||||
function DevTools() {
|
||||
this._tools = new Map(); // Map<toolId, tool>
|
||||
this._themes = new Map(); // Map<themeId, theme>
|
||||
this._toolboxes = new Map(); // Map<target, toolbox>
|
||||
|
@ -240,7 +240,7 @@ exports.getHighlighterUtils = function (toolbox) {
|
||||
yield toolbox.walker.highlight(nodeFront);
|
||||
}
|
||||
|
||||
toolbox.emit("node-highlight", nodeFront, options.toSource());
|
||||
toolbox.emit("node-highlight", nodeFront);
|
||||
});
|
||||
|
||||
/**
|
||||
|
65
devtools/client/inspector/bin/dev-server.js
Normal file
65
devtools/client/inspector/bin/dev-server.js
Normal file
@ -0,0 +1,65 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* global __dirname */
|
||||
|
||||
"use strict";
|
||||
|
||||
const toolbox = require("../node_modules/devtools-local-toolbox/index");
|
||||
const feature = require("devtools-config");
|
||||
const envConfig = require("../configs/development.json");
|
||||
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
feature.setConfig(envConfig);
|
||||
const webpackConfig = require("../webpack.config")(envConfig);
|
||||
|
||||
let {app} = toolbox.startDevServer(envConfig, webpackConfig);
|
||||
|
||||
function sendFile(res, src, encoding) {
|
||||
const filePath = path.join(__dirname, src);
|
||||
const file = encoding ? fs.readFileSync(filePath, encoding) : fs.readFileSync(filePath);
|
||||
res.send(file);
|
||||
}
|
||||
|
||||
function addFileRoute(from, to) {
|
||||
app.get(from, function (req, res) {
|
||||
sendFile(res, to, "utf-8");
|
||||
});
|
||||
}
|
||||
|
||||
// Routes
|
||||
addFileRoute("/", "../inspector.xhtml");
|
||||
addFileRoute("/markup/markup.xhtml", "../markup/markup.xhtml");
|
||||
|
||||
app.get("/devtools/skin/images/:file.png", function (req, res) {
|
||||
res.contentType("image/png");
|
||||
sendFile(res, "../../themes/images/" + req.params.file + ".png");
|
||||
});
|
||||
|
||||
app.get("/devtools/skin/images/:file.svg", function (req, res) {
|
||||
res.contentType("image/svg+xml");
|
||||
sendFile(res, "../../themes/images/" + req.params.file + ".svg", "utf-8");
|
||||
});
|
||||
|
||||
app.get("/images/:file.svg", function (req, res) {
|
||||
res.contentType("image/svg+xml");
|
||||
sendFile(res, "../../themes/images/" + req.params.file + ".svg", "utf-8");
|
||||
});
|
||||
|
||||
// Redirect chrome:devtools/skin/file.css to ../../themes/file.css
|
||||
app.get("/devtools/skin/:file.css", function (req, res) {
|
||||
res.contentType("text/css; charset=utf-8");
|
||||
sendFile(res, "../../themes/" + req.params.file + ".css", "utf-8");
|
||||
});
|
||||
|
||||
// Redirect chrome:devtools/client/path/to/file.css to ../../path/to/file.css
|
||||
// and chrome:devtools/content/path/to/file.css to ../../path/to/file.css
|
||||
app.get(/^\/devtools\/(?:client|content)\/(.*)\.css$/, function (req, res) {
|
||||
res.contentType("text/css; charset=utf-8");
|
||||
sendFile(res, "../../" + req.params[0] + ".css");
|
||||
});
|
22
devtools/client/inspector/configs/development.json
Normal file
22
devtools/client/inspector/configs/development.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"title": "Inspector",
|
||||
"environment": "development",
|
||||
"baseWorkerURL": "public/build/",
|
||||
"theme": "light",
|
||||
"host": "",
|
||||
"logging": {
|
||||
"client": false,
|
||||
"firefoxProxy": false
|
||||
},
|
||||
"features": {
|
||||
},
|
||||
"firefox": {
|
||||
"proxyHost": "localhost:9000",
|
||||
"webSocketConnection": false,
|
||||
"webSocketHost": "localhost:6080"
|
||||
},
|
||||
"development": {
|
||||
"serverPort": 8000,
|
||||
"customIndex": true
|
||||
}
|
||||
}
|
@ -4,12 +4,10 @@
|
||||
* 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/. */
|
||||
|
||||
/* global window */
|
||||
/* global window, BrowserLoader */
|
||||
|
||||
"use strict";
|
||||
|
||||
var Cu = Components.utils;
|
||||
var { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
|
||||
var Services = require("Services");
|
||||
var promise = require("promise");
|
||||
var defer = require("devtools/shared/defer");
|
||||
@ -1354,15 +1352,15 @@ Inspector.prototype = {
|
||||
// create tool iframe
|
||||
this._markupFrame = doc.createElement("iframe");
|
||||
this._markupFrame.setAttribute("flex", "1");
|
||||
// This is needed to enable tooltips inside the iframe document.
|
||||
this._markupFrame.setAttribute("tooltip", "aHTMLTooltip");
|
||||
this._markupFrame.addEventListener("contextmenu", this._onContextMenu);
|
||||
|
||||
// This is needed to enable tooltips inside the iframe document.
|
||||
this._markupFrame.addEventListener("load", this._onMarkupFrameLoad, true);
|
||||
|
||||
this._markupBox.setAttribute("collapsed", true);
|
||||
this._markupBox.appendChild(this._markupFrame);
|
||||
this._markupFrame.setAttribute("src", "chrome://devtools/content/inspector/markup/markup.xhtml");
|
||||
|
||||
this._markupFrame.addEventListener("load", this._onMarkupFrameLoad, true);
|
||||
this._markupFrame.setAttribute("src", "markup/markup.xhtml");
|
||||
this._markupFrame.setAttribute("aria-label",
|
||||
INSPECTOR_L10N.getStr("inspector.panelLabel.markupView"));
|
||||
},
|
||||
@ -1891,89 +1889,111 @@ Inspector.prototype = {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a fake toolbox when running the inspector standalone, either in a chrome tab or
|
||||
* in a content tab.
|
||||
*
|
||||
* @param {Target} target to debug
|
||||
* @param {Function} createThreadClient
|
||||
* When supported the thread client needs a reference to the toolbox.
|
||||
* This callback will be called right after the toolbox object is created.
|
||||
* @param {Object} dependencies
|
||||
* - react
|
||||
* - reactDOM
|
||||
* - browserRequire
|
||||
*/
|
||||
const buildFakeToolbox = Task.async(function* (
|
||||
target, createThreadClient, {
|
||||
React,
|
||||
ReactDOM,
|
||||
browserRequire
|
||||
}) {
|
||||
const { InspectorFront } = require("devtools/shared/fronts/inspector");
|
||||
const { Selection } = require("devtools/client/framework/selection");
|
||||
const { getHighlighterUtils } = require("devtools/client/framework/toolbox-highlighter-utils");
|
||||
|
||||
let notImplemented = function () {
|
||||
throw new Error("Not implemented in a tab");
|
||||
};
|
||||
let fakeToolbox = {
|
||||
target,
|
||||
hostType: "bottom",
|
||||
doc: window.document,
|
||||
win: window,
|
||||
on() {}, emit() {}, off() {},
|
||||
initInspector() {},
|
||||
browserRequire,
|
||||
React,
|
||||
ReactDOM,
|
||||
isToolRegistered() {
|
||||
return false;
|
||||
},
|
||||
currentToolId: "inspector",
|
||||
getCurrentPanel() {
|
||||
return "inspector";
|
||||
},
|
||||
get textboxContextMenuPopup() {
|
||||
notImplemented();
|
||||
},
|
||||
getPanel: notImplemented,
|
||||
openSplitConsole: notImplemented,
|
||||
viewCssSourceInStyleEditor: notImplemented,
|
||||
viewJsSourceInDebugger: notImplemented,
|
||||
viewSource: notImplemented,
|
||||
viewSourceInDebugger: notImplemented,
|
||||
viewSourceInStyleEditor: notImplemented,
|
||||
|
||||
// For attachThread:
|
||||
highlightTool() {},
|
||||
unhighlightTool() {},
|
||||
selectTool() {},
|
||||
raise() {},
|
||||
getNotificationBox() {}
|
||||
};
|
||||
|
||||
fakeToolbox.threadClient = yield createThreadClient(fakeToolbox);
|
||||
|
||||
let inspector = InspectorFront(target.client, target.form);
|
||||
let showAllAnonymousContent =
|
||||
Services.prefs.getBoolPref("devtools.inspector.showAllAnonymousContent");
|
||||
let walker = yield inspector.getWalker({ showAllAnonymousContent });
|
||||
let selection = new Selection(walker);
|
||||
let highlighter = yield inspector.getHighlighter(false);
|
||||
fakeToolbox.highlighterUtils = getHighlighterUtils(fakeToolbox);
|
||||
|
||||
fakeToolbox.inspector = inspector;
|
||||
fakeToolbox.walker = walker;
|
||||
fakeToolbox.selection = selection;
|
||||
fakeToolbox.highlighter = highlighter;
|
||||
return fakeToolbox;
|
||||
});
|
||||
|
||||
// URL constructor doesn't support chrome: scheme
|
||||
let href = window.location.href.replace(/chrome:/, "http://");
|
||||
let url = new window.URL(href);
|
||||
|
||||
// Only use this method to attach the toolbox if some query parameters are given
|
||||
if (url.search.length > 1) {
|
||||
// If query parameters are given in a chrome tab, the inspector is running in standalone.
|
||||
if (window.location.protocol === "chrome:" && url.search.length > 1) {
|
||||
const { targetFromURL } = require("devtools/client/framework/target-from-url");
|
||||
const { attachThread } = require("devtools/client/framework/attach-thread");
|
||||
const { BrowserLoader } =
|
||||
Cu.import("resource://devtools/client/shared/browser-loader.js", {});
|
||||
|
||||
const { Selection } = require("devtools/client/framework/selection");
|
||||
const { InspectorFront } = require("devtools/shared/fronts/inspector");
|
||||
const { getHighlighterUtils } = require("devtools/client/framework/toolbox-highlighter-utils");
|
||||
const browserRequire = BrowserLoader({ window, useOnlyShared: true }).require;
|
||||
const React = browserRequire("devtools/client/shared/vendor/react");
|
||||
const ReactDOM = browserRequire("devtools/client/shared/vendor/react-dom");
|
||||
|
||||
Task.spawn(function* () {
|
||||
let target = yield targetFromURL(url);
|
||||
|
||||
let notImplemented = function () {
|
||||
throw new Error("Not implemented in a tab");
|
||||
};
|
||||
let fakeToolbox = {
|
||||
let fakeToolbox = yield buildFakeToolbox(
|
||||
target,
|
||||
hostType: "bottom",
|
||||
doc: window.document,
|
||||
win: window,
|
||||
on() {}, emit() {}, off() {},
|
||||
initInspector() {},
|
||||
browserRequire: BrowserLoader({
|
||||
window: window,
|
||||
useOnlyShared: true
|
||||
}).require,
|
||||
get React() {
|
||||
return this.browserRequire("devtools/client/shared/vendor/react");
|
||||
},
|
||||
get ReactDOM() {
|
||||
return this.browserRequire("devtools/client/shared/vendor/react-dom");
|
||||
},
|
||||
isToolRegistered() {
|
||||
return false;
|
||||
},
|
||||
currentToolId: "inspector",
|
||||
getCurrentPanel() {
|
||||
return "inspector";
|
||||
},
|
||||
get textboxContextMenuPopup() {
|
||||
notImplemented();
|
||||
},
|
||||
getPanel: notImplemented,
|
||||
openSplitConsole: notImplemented,
|
||||
viewCssSourceInStyleEditor: notImplemented,
|
||||
viewJsSourceInDebugger: notImplemented,
|
||||
viewSource: notImplemented,
|
||||
viewSourceInDebugger: notImplemented,
|
||||
viewSourceInStyleEditor: notImplemented,
|
||||
|
||||
// For attachThread:
|
||||
highlightTool() {},
|
||||
unhighlightTool() {},
|
||||
selectTool() {},
|
||||
raise() {},
|
||||
getNotificationBox() {}
|
||||
};
|
||||
|
||||
// attachThread also expect a toolbox as argument
|
||||
fakeToolbox.threadClient = yield attachThread(fakeToolbox);
|
||||
|
||||
let inspector = InspectorFront(target.client, target.form);
|
||||
let showAllAnonymousContent =
|
||||
Services.prefs.getBoolPref("devtools.inspector.showAllAnonymousContent");
|
||||
let walker = yield inspector.getWalker({ showAllAnonymousContent });
|
||||
let selection = new Selection(walker);
|
||||
let highlighter = yield inspector.getHighlighter(false);
|
||||
|
||||
fakeToolbox.inspector = inspector;
|
||||
fakeToolbox.walker = walker;
|
||||
fakeToolbox.selection = selection;
|
||||
fakeToolbox.highlighter = highlighter;
|
||||
fakeToolbox.highlighterUtils = getHighlighterUtils(fakeToolbox);
|
||||
|
||||
(toolbox) => attachThread(toolbox),
|
||||
{ React, ReactDOM, browserRequire }
|
||||
);
|
||||
let inspectorUI = new Inspector(fakeToolbox);
|
||||
inspectorUI.init();
|
||||
}).then(null, e => {
|
||||
window.alert("Unable to start the inspector:" + e.message + "\n" + e.stack);
|
||||
});
|
||||
}
|
||||
|
||||
exports.Inspector = Inspector;
|
||||
exports.buildFakeToolbox = buildFakeToolbox;
|
||||
|
@ -26,6 +26,18 @@
|
||||
|
||||
<script type="application/javascript;version=1.8"
|
||||
src="chrome://devtools/content/shared/theme-switching.js"></script>
|
||||
<script type="text/javascript">
|
||||
/* eslint-disable */
|
||||
var isInChrome = window.location.href.includes("chrome:");
|
||||
if (isInChrome) {
|
||||
var exports = {};
|
||||
var Cu = Components.utils;
|
||||
var { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
|
||||
var { BrowserLoader } = Cu.import("resource://devtools/client/shared/browser-loader.js", {});
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- in content, inspector.js is mapped to the dynamically generated webpack bundle -->
|
||||
<script type="application/javascript;version=1.8" src="inspector.js" defer="true"></script>
|
||||
</head>
|
||||
<body class="theme-body" role="application">
|
||||
|
121
devtools/client/inspector/local-toolbox.js
Normal file
121
devtools/client/inspector/local-toolbox.js
Normal file
@ -0,0 +1,121 @@
|
||||
/* 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/. */
|
||||
|
||||
/* global window, document */
|
||||
|
||||
"use strict";
|
||||
|
||||
const React = require("devtools/client/shared/vendor/react");
|
||||
const ReactDOM = require("devtools/client/shared/vendor/react-dom");
|
||||
const { appinfo } = require("Services");
|
||||
|
||||
const { buildFakeToolbox, Inspector } = require("./inspector");
|
||||
|
||||
function onConnect(arg) {
|
||||
if (!arg || !arg.client) {
|
||||
return;
|
||||
}
|
||||
|
||||
let client = arg.client;
|
||||
|
||||
const tabTarget = client.getTabTarget();
|
||||
let threadClient = { paused: false };
|
||||
buildFakeToolbox(
|
||||
tabTarget,
|
||||
() => threadClient,
|
||||
{ React, ReactDOM, browserRequire: () => {} }
|
||||
).then(function (fakeToolbox) {
|
||||
let inspector = new Inspector(fakeToolbox);
|
||||
inspector.init();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Stylesheet links in devtools xhtml files are using chrome or resource URLs.
|
||||
* Rewrite the href attribute to remove the protocol. web-server.js contains redirects
|
||||
* to map CSS urls to the proper file. Supports urls using:
|
||||
* - devtools/client/
|
||||
* - devtools/content/
|
||||
* - skin/
|
||||
* The css for the light-theme will additionally be loaded.
|
||||
* Will also add mandatory classnames and attributes to be compatible with devtools theme
|
||||
* stylesheet.
|
||||
*
|
||||
*/
|
||||
function fixStylesheets(doc) {
|
||||
let links = doc.head.querySelectorAll("link");
|
||||
for (let link of links) {
|
||||
link.href = link.href.replace(/(resource|chrome)\:\/\//, "/");
|
||||
}
|
||||
|
||||
// Add the light theme stylesheet to compensate for the missing theme-switching.js
|
||||
let themeLink = doc.createElement("link");
|
||||
themeLink.setAttribute("rel", "stylesheet");
|
||||
themeLink.setAttribute("href", "/devtools/skin/light-theme.css");
|
||||
|
||||
doc.head.appendChild(themeLink);
|
||||
doc.documentElement.classList.add("theme-light");
|
||||
doc.body.classList.add("theme-light");
|
||||
|
||||
if (appinfo.OS === "Darwin") {
|
||||
doc.documentElement.setAttribute("platform", "mac");
|
||||
} else if (appinfo.OS === "Linux") {
|
||||
doc.documentElement.setAttribute("platform", "linux");
|
||||
} else {
|
||||
doc.documentElement.setAttribute("platform", "win");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called each time a childList mutation is received on the main document.
|
||||
* Check the iframes currently loaded in the document and call fixStylesheets if needed.
|
||||
*/
|
||||
function fixStylesheetsOnMutation() {
|
||||
let frames = document.body.querySelectorAll("iframe");
|
||||
for (let frame of frames) {
|
||||
let doc = frame.contentDocument || frame.contentWindow.document;
|
||||
if (doc.__fixStylesheetsFlag) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Mark the document as processed to avoid extra changes.
|
||||
doc.__fixStylesheetsFlag = true;
|
||||
if (doc.readyState !== "complete") {
|
||||
// If the document is not loaded yet, wait for DOMContentLoaded.
|
||||
frame.contentWindow.addEventListener("DOMContentLoaded", () => {
|
||||
fixStylesheets(doc);
|
||||
}, { once: true });
|
||||
} else {
|
||||
fixStylesheets(doc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", function onInspectorDOMLoaded() {
|
||||
window.removeEventListener("DOMContentLoaded", onInspectorDOMLoaded);
|
||||
|
||||
// Add styling for the main document.
|
||||
fixStylesheets(document);
|
||||
|
||||
// Add a mutation observer to check if new iframes have been loaded and need to have
|
||||
// their stylesheet links updated.
|
||||
new window.MutationObserver(mutations => {
|
||||
fixStylesheetsOnMutation();
|
||||
}).observe(document.body, { childList: true, subtree: true });
|
||||
|
||||
const hasFirefoxTabParam = window.location.href.indexOf("firefox-tab") != -1;
|
||||
if (!hasFirefoxTabParam) {
|
||||
const inspectorRoot = document.querySelector(".inspector");
|
||||
// Remove the inspector specific markup and add the landing page root element.
|
||||
inspectorRoot.remove();
|
||||
let mount = document.createElement("div");
|
||||
mount.setAttribute("id", "mount");
|
||||
document.body.appendChild(mount);
|
||||
}
|
||||
|
||||
// Toolbox tries to add a theme classname on the documentElement and should only be
|
||||
// required after DOMContentLoaded.
|
||||
const { bootstrap } = require("devtools-local-toolbox");
|
||||
bootstrap(React, ReactDOM).then(onConnect);
|
||||
});
|
@ -16,7 +16,6 @@
|
||||
src="chrome://devtools/content/shared/theme-switching.js"></script>
|
||||
<script type="application/javascript;version=1.8"
|
||||
src="chrome://devtools/content/sourceeditor/codemirror/codemirror.bundle.js"></script>
|
||||
|
||||
</head>
|
||||
<body class="theme-body devtools-monospace" role="application">
|
||||
|
||||
|
17
devtools/client/inspector/package.json
Normal file
17
devtools/client/inspector/package.json
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "inspector.html",
|
||||
"version": "0.0.1",
|
||||
"description": "The Firefox Inspector",
|
||||
"scripts": {
|
||||
"start": "node bin/dev-server"
|
||||
},
|
||||
"author": "",
|
||||
"dependencies": {
|
||||
"devtools-local-toolbox": "0.0.10",
|
||||
"devtools-modules": "0.0.9",
|
||||
"devtools-sham-modules": "0.0.9",
|
||||
"devtools-config": "0.0.9",
|
||||
"raw-loader": "^0.5.1",
|
||||
"json-loader": "^0.5.4"
|
||||
}
|
||||
}
|
136
devtools/client/inspector/webpack.config.js
Normal file
136
devtools/client/inspector/webpack.config.js
Normal file
@ -0,0 +1,136 @@
|
||||
/* 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/. */
|
||||
|
||||
/* global __dirname */
|
||||
|
||||
"use strict";
|
||||
|
||||
const {toolboxConfig} = require("devtools-local-toolbox/index");
|
||||
|
||||
const path = require("path");
|
||||
const webpack = require("webpack");
|
||||
|
||||
module.exports = envConfig => {
|
||||
let webpackConfig = {
|
||||
bail: true,
|
||||
entry: [
|
||||
path.join(__dirname, "local-toolbox.js")
|
||||
],
|
||||
output: {
|
||||
path: path.join(__dirname, "assets/build"),
|
||||
filename: "inspector.js",
|
||||
publicPath: "/"
|
||||
},
|
||||
module: {
|
||||
// Disable handling of unknown requires
|
||||
unknownContextRegExp: /$^/,
|
||||
unknownContextCritical: false,
|
||||
|
||||
// Disable handling of requires with a single expression
|
||||
exprContextRegExp: /$^/,
|
||||
exprContextCritical: false,
|
||||
|
||||
// Warn for every expression in require
|
||||
wrappedContextCritical: true,
|
||||
|
||||
loaders: [
|
||||
{
|
||||
test: /event-emitter/,
|
||||
exclude: /node_modules/,
|
||||
loaders: [path.join(__dirname, "./webpack/rewrite-event-emitter")],
|
||||
}, {
|
||||
// Replace all references to this.browserRequire() by require() in
|
||||
// client/inspector/*.js files
|
||||
test: /client\/inspector\/.*\.js$/,
|
||||
loaders: [path.join(__dirname, "./webpack/rewrite-browser-require")],
|
||||
}
|
||||
]
|
||||
},
|
||||
resolveLoader: {
|
||||
root: [
|
||||
path.resolve("./node_modules"),
|
||||
path.resolve("./webpack"),
|
||||
]
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
"acorn/util/walk": path.join(__dirname, "../../shared/acorn/walk"),
|
||||
"acorn": path.join(__dirname, "../../shared/acorn"),
|
||||
"devtools/client/framework/about-devtools-toolbox":
|
||||
path.join(__dirname, "./webpack/about-devtools-sham.js"),
|
||||
"devtools/client/framework/attach-thread":
|
||||
path.join(__dirname, "./webpack/attach-thread-sham.js"),
|
||||
"devtools/client/framework/target-from-url":
|
||||
path.join(__dirname, "./webpack/target-from-url-sham.js"),
|
||||
"devtools/client/jsonview/main":
|
||||
path.join(__dirname, "./webpack/jsonview-sham.js"),
|
||||
"devtools/client/sourceeditor/editor":
|
||||
path.join(__dirname, "./webpack/editor-sham.js"),
|
||||
"devtools/client/locales": path.join(__dirname, "../locales/en-US"),
|
||||
"devtools/shared/DevToolsUtils":
|
||||
path.join(__dirname, "./webpack/devtools-utils-sham.js"),
|
||||
"devtools/shared/locales": path.join(__dirname, "../../shared/locales/en-US"),
|
||||
"devtools/shared/platform": path.join(__dirname, "../../shared/platform/content"),
|
||||
"devtools": path.join(__dirname, "../../"),
|
||||
"gcli": path.join(__dirname, "../../shared/gcli/source/lib/gcli"),
|
||||
"method": path.join(__dirname, "../../../addon-sdk/source/lib/method"),
|
||||
"modules/libpref/init/all":
|
||||
path.join(__dirname, "../../../modules/libpref/init/all.js"),
|
||||
"sdk/system/unload": path.join(__dirname, "./webpack/system-unload-sham.js"),
|
||||
"sdk": path.join(__dirname, "../../../addon-sdk/source/lib/sdk"),
|
||||
"Services": path.join(__dirname, "../shared/shim/Services.js"),
|
||||
"toolkit/locales":
|
||||
path.join(__dirname, "../../../toolkit/locales/en-US/chrome/global"),
|
||||
},
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new webpack.DefinePlugin({
|
||||
"isWorker": JSON.stringify(false),
|
||||
"reportError": "console.error",
|
||||
"AppConstants": "{ DEBUG: true, DEBUG_JS_MODULES: true }",
|
||||
"loader": `{
|
||||
lazyRequireGetter: () => {},
|
||||
lazyGetter: () => {}
|
||||
}`,
|
||||
"dump": "console.log",
|
||||
}),
|
||||
]
|
||||
};
|
||||
|
||||
webpackConfig.externals = [
|
||||
/codemirror\//,
|
||||
{
|
||||
"promise": "var Promise",
|
||||
"devtools/server/main": "{}",
|
||||
|
||||
// Just trying to get build to work. These should be removed eventually:
|
||||
"chrome": "{}",
|
||||
|
||||
// In case you end up in chrome-land you can use this to help track down issues.
|
||||
// SDK for instance does a bunch of this so if you somehow end up importing an SDK
|
||||
// dependency this might help for debugging:
|
||||
// "chrome": `{
|
||||
// Cc: {
|
||||
// "@mozilla.org/uuid-generator;1": { getService: () => { return {} } },
|
||||
// "@mozilla.org/observer-service;1": { getService: () => { return {} } },
|
||||
// },
|
||||
// Ci: {},
|
||||
// Cr: {},
|
||||
// Cm: {},
|
||||
// components: { classesByID: () => {} , ID: () => {} }
|
||||
// }`,
|
||||
|
||||
"resource://gre/modules/XPCOMUtils.jsm": "{}",
|
||||
"resource://devtools/client/styleeditor/StyleEditorUI.jsm": "{}",
|
||||
"resource://devtools/client/styleeditor/StyleEditorUtil.jsm": "{}",
|
||||
"devtools/client/shared/developer-toolbar": "{}",
|
||||
},
|
||||
];
|
||||
|
||||
// Exclude all files from devtools/ or addon-sdk/ or modules/ .
|
||||
webpackConfig.babelExcludes = /(devtools\/|addon-sdk\/|modules\/)/;
|
||||
|
||||
return toolboxConfig(webpackConfig, envConfig);
|
||||
};
|
12
devtools/client/inspector/webpack/about-devtools-sham.js
Normal file
12
devtools/client/inspector/webpack/about-devtools-sham.js
Normal file
@ -0,0 +1,12 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
register: () => {},
|
||||
unregister: () => {},
|
||||
};
|
11
devtools/client/inspector/webpack/attach-thread-sham.js
Normal file
11
devtools/client/inspector/webpack/attach-thread-sham.js
Normal file
@ -0,0 +1,11 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
attachThread: () => {},
|
||||
};
|
13
devtools/client/inspector/webpack/devtools-utils-sham.js
Normal file
13
devtools/client/inspector/webpack/devtools-utils-sham.js
Normal file
@ -0,0 +1,13 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* global setImmediate */
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
executeSoon: setImmediate,
|
||||
};
|
13
devtools/client/inspector/webpack/editor-sham.js
Normal file
13
devtools/client/inspector/webpack/editor-sham.js
Normal file
@ -0,0 +1,13 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
function Editor() {}
|
||||
Editor.modes = {};
|
||||
Editor.prototype.appendToLocalElement = () => {};
|
||||
|
||||
module.exports = Editor;
|
14
devtools/client/inspector/webpack/jsonview-sham.js
Normal file
14
devtools/client/inspector/webpack/jsonview-sham.js
Normal file
@ -0,0 +1,14 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
JsonView: {
|
||||
initialize: () => {},
|
||||
destroy: () => {},
|
||||
}
|
||||
};
|
71
devtools/client/inspector/webpack/prefs-loader.js
Normal file
71
devtools/client/inspector/webpack/prefs-loader.js
Normal file
@ -0,0 +1,71 @@
|
||||
/* 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/. */
|
||||
|
||||
// Rewrite devtools.js or all.js, leaving just the relevant pref() calls.
|
||||
|
||||
"use strict";
|
||||
|
||||
const PREF_WHITELIST = [
|
||||
"devtools",
|
||||
"layout.css.grid.enabled"
|
||||
];
|
||||
|
||||
const acceptLine = function (line) {
|
||||
let matches = line.match(/^ *pref\("([^"]+)"/);
|
||||
if (!matches || !matches[1]) {
|
||||
return false;
|
||||
}
|
||||
|
||||
let [, prefName] = matches;
|
||||
return PREF_WHITELIST.some(filter => prefName.startsWith(filter));
|
||||
};
|
||||
|
||||
module.exports = function (content) {
|
||||
this.cacheable && this.cacheable();
|
||||
|
||||
// If we're reading devtools.js we have to do some preprocessing.
|
||||
// If we're reading all.js we just assume we can dump all the
|
||||
// conditionals.
|
||||
let isDevtools = this.request.endsWith("/devtools.js");
|
||||
|
||||
// This maps the text of a "#if" to its truth value. This has to
|
||||
// cover all uses of #if in devtools.js.
|
||||
const ifMap = {
|
||||
"#if MOZ_UPDATE_CHANNEL == beta": false,
|
||||
"#if defined(NIGHTLY_BUILD)": false,
|
||||
"#ifdef NIGHTLY_BUILD": false,
|
||||
"#ifdef MOZ_DEV_EDITION": false,
|
||||
"#ifdef RELEASE_OR_BETA": true,
|
||||
"#ifdef RELEASE_BUILD": true,
|
||||
};
|
||||
|
||||
let lines = content.split("\n");
|
||||
let ignoring = false;
|
||||
let newLines = [];
|
||||
let continuation = false;
|
||||
for (let line of lines) {
|
||||
if (line.startsWith("sticky_pref")) {
|
||||
line = line.slice(7);
|
||||
}
|
||||
|
||||
if (isDevtools) {
|
||||
if (line.startsWith("#if")) {
|
||||
if (!(line in ifMap)) {
|
||||
throw new Error("missing line in ifMap: " + line);
|
||||
}
|
||||
ignoring = !ifMap[line];
|
||||
} else if (line.startsWith("#else")) {
|
||||
ignoring = !ignoring;
|
||||
}
|
||||
}
|
||||
|
||||
if (continuation || (!ignoring && acceptLine(line))) {
|
||||
newLines.push(line);
|
||||
|
||||
// The call to pref(...); might span more than one line.
|
||||
continuation = !/\);/.test(line);
|
||||
}
|
||||
}
|
||||
return newLines.join("\n");
|
||||
};
|
12
devtools/client/inspector/webpack/rewrite-browser-require.js
Normal file
12
devtools/client/inspector/webpack/rewrite-browser-require.js
Normal file
@ -0,0 +1,12 @@
|
||||
/* 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/. */
|
||||
|
||||
// Replace all occurrences of "this.browserRequire(" by "require(".
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = function (content) {
|
||||
this.cacheable && this.cacheable();
|
||||
return content.replace(/this\.browserRequire\(/g, "require(");
|
||||
};
|
26
devtools/client/inspector/webpack/rewrite-event-emitter.js
Normal file
26
devtools/client/inspector/webpack/rewrite-event-emitter.js
Normal file
@ -0,0 +1,26 @@
|
||||
/* 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/. */
|
||||
|
||||
// Remove the header code from event-emitter.js. This code confuses
|
||||
// webpack.
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = function (content) {
|
||||
this.cacheable && this.cacheable();
|
||||
|
||||
let lines = content.split("\n");
|
||||
let ignoring = false;
|
||||
let newLines = [];
|
||||
for (let line of lines) {
|
||||
if (/function \(factory\)/.test(line)) {
|
||||
ignoring = true;
|
||||
} else if (/call\(this, function /.test(line)) {
|
||||
ignoring = false;
|
||||
} else if (!ignoring && line !== "});") {
|
||||
newLines.push(line);
|
||||
}
|
||||
}
|
||||
return newLines.join("\n");
|
||||
};
|
11
devtools/client/inspector/webpack/system-unload-sham.js
Normal file
11
devtools/client/inspector/webpack/system-unload-sham.js
Normal file
@ -0,0 +1,11 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
when: () => {},
|
||||
};
|
11
devtools/client/inspector/webpack/target-from-url-sham.js
Normal file
11
devtools/client/inspector/webpack/target-from-url-sham.js
Normal file
@ -0,0 +1,11 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
targetFromURL: () => {},
|
||||
};
|
@ -606,6 +606,14 @@ const Services = {
|
||||
};
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Shims for Services.obs.add/removeObserver.
|
||||
*/
|
||||
obs: {
|
||||
addObserver: () => {},
|
||||
removeObserver: () => {},
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -153,8 +153,14 @@ UndoStack.prototype = {
|
||||
* Install this object as a command controller.
|
||||
*/
|
||||
installController: function (controllerWindow) {
|
||||
let controllers = controllerWindow.controllers;
|
||||
// Only available when running in a Firefox panel.
|
||||
if (!controllers || !controllers.appendController) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._controllerWindow = controllerWindow;
|
||||
controllerWindow.controllers.appendController(this);
|
||||
controllers.appendController(this);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "devtools",
|
||||
"name": "sourceeditor",
|
||||
"version": "0.0.1",
|
||||
"description": "",
|
||||
"main": "",
|
39
devtools/client/sourceeditor/webpack.config.js
Normal file
39
devtools/client/sourceeditor/webpack.config.js
Normal file
@ -0,0 +1,39 @@
|
||||
/* 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";
|
||||
|
||||
module.exports = [{
|
||||
bail: true,
|
||||
entry: [
|
||||
"./codemirror/addon/dialog/dialog.js",
|
||||
"./codemirror/addon/search/searchcursor.js",
|
||||
"./codemirror/addon/search/search.js",
|
||||
"./codemirror/addon/edit/matchbrackets.js",
|
||||
"./codemirror/addon/edit/closebrackets.js",
|
||||
"./codemirror/addon/comment/comment.js",
|
||||
"./codemirror/mode/javascript/javascript.js",
|
||||
"./codemirror/mode/xml/xml.js",
|
||||
"./codemirror/mode/css/css.js",
|
||||
"./codemirror/mode/htmlmixed/htmlmixed.js",
|
||||
"./codemirror/mode/clike/clike.js",
|
||||
"./codemirror/mode/wasm/wasm.js",
|
||||
"./codemirror/addon/selection/active-line.js",
|
||||
"./codemirror/addon/edit/trailingspace.js",
|
||||
"./codemirror/keymap/emacs.js",
|
||||
"./codemirror/keymap/vim.js",
|
||||
"./codemirror/keymap/sublime.js",
|
||||
"./codemirror/addon/fold/foldcode.js",
|
||||
"./codemirror/addon/fold/brace-fold.js",
|
||||
"./codemirror/addon/fold/comment-fold.js",
|
||||
"./codemirror/addon/fold/xml-fold.js",
|
||||
"./codemirror/addon/fold/foldgutter.js",
|
||||
"./codemirror/lib/codemirror.js",
|
||||
],
|
||||
output: {
|
||||
filename: "./codemirror/codemirror.bundle.js",
|
||||
libraryTarget: "var",
|
||||
library: "CodeMirror",
|
||||
},
|
||||
}];
|
@ -1,39 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = [{
|
||||
bail: true,
|
||||
entry: [
|
||||
"./sourceeditor/codemirror/addon/dialog/dialog.js",
|
||||
"./sourceeditor/codemirror/addon/search/searchcursor.js",
|
||||
"./sourceeditor/codemirror/addon/search/search.js",
|
||||
"./sourceeditor/codemirror/addon/edit/matchbrackets.js",
|
||||
"./sourceeditor/codemirror/addon/edit/closebrackets.js",
|
||||
"./sourceeditor/codemirror/addon/comment/comment.js",
|
||||
"./sourceeditor/codemirror/mode/javascript/javascript.js",
|
||||
"./sourceeditor/codemirror/mode/xml/xml.js",
|
||||
"./sourceeditor/codemirror/mode/css/css.js",
|
||||
"./sourceeditor/codemirror/mode/htmlmixed/htmlmixed.js",
|
||||
"./sourceeditor/codemirror/mode/clike/clike.js",
|
||||
"./sourceeditor/codemirror/mode/wasm/wasm.js",
|
||||
"./sourceeditor/codemirror/addon/selection/active-line.js",
|
||||
"./sourceeditor/codemirror/addon/edit/trailingspace.js",
|
||||
"./sourceeditor/codemirror/keymap/emacs.js",
|
||||
"./sourceeditor/codemirror/keymap/vim.js",
|
||||
"./sourceeditor/codemirror/keymap/sublime.js",
|
||||
"./sourceeditor/codemirror/addon/fold/foldcode.js",
|
||||
"./sourceeditor/codemirror/addon/fold/brace-fold.js",
|
||||
"./sourceeditor/codemirror/addon/fold/comment-fold.js",
|
||||
"./sourceeditor/codemirror/addon/fold/xml-fold.js",
|
||||
"./sourceeditor/codemirror/addon/fold/foldgutter.js",
|
||||
"./sourceeditor/codemirror/lib/codemirror.js",
|
||||
],
|
||||
output: {
|
||||
filename: "./sourceeditor/codemirror/codemirror.bundle.js",
|
||||
libraryTarget: "var",
|
||||
library: "CodeMirror",
|
||||
},
|
||||
}];
|
@ -792,7 +792,7 @@ private:
|
||||
void
|
||||
Resume()
|
||||
{
|
||||
if (!IsSuspended() && mOwner->Paused()) {
|
||||
if (!IsSuspended()) {
|
||||
MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
|
||||
("HTMLMediaElement::AudioChannelAgentCallback, ResumeFromAudioChannel, "
|
||||
"this = %p, Error : resume without suspended!\n", this));
|
||||
|
@ -139,6 +139,28 @@ VideoData::~VideoData()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
VideoData::SetListener(UniquePtr<Listener> aListener)
|
||||
{
|
||||
MOZ_ASSERT(!mSentToCompositor, "Listener should be registered before sending data");
|
||||
|
||||
mListener = Move(aListener);
|
||||
}
|
||||
|
||||
void
|
||||
VideoData::MarkSentToCompositor()
|
||||
{
|
||||
if (mSentToCompositor) {
|
||||
return;
|
||||
}
|
||||
|
||||
mSentToCompositor = true;
|
||||
if (mListener != nullptr) {
|
||||
mListener->OnSentToCompositor();
|
||||
mListener = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
size_t
|
||||
VideoData::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
|
||||
{
|
||||
|
@ -447,6 +447,12 @@ public:
|
||||
YUVColorSpace mYUVColorSpace = YUVColorSpace::BT601;
|
||||
};
|
||||
|
||||
class Listener {
|
||||
public:
|
||||
virtual void OnSentToCompositor() = 0;
|
||||
virtual ~Listener() {}
|
||||
};
|
||||
|
||||
// Constructs a VideoData object. If aImage is nullptr, creates a new Image
|
||||
// holding a copy of the YCbCr data passed in aBuffer. If aImage is not
|
||||
// nullptr, it's stored as the underlying video image and aBuffer is assumed
|
||||
@ -530,8 +536,6 @@ public:
|
||||
|
||||
int32_t mFrameID;
|
||||
|
||||
bool mSentToCompositor;
|
||||
|
||||
VideoData(int64_t aOffset,
|
||||
int64_t aTime,
|
||||
int64_t aDuration,
|
||||
@ -540,8 +544,15 @@ public:
|
||||
IntSize aDisplay,
|
||||
uint32_t aFrameID);
|
||||
|
||||
void SetListener(UniquePtr<Listener> aListener);
|
||||
void MarkSentToCompositor();
|
||||
bool IsSentToCompositor() { return mSentToCompositor; }
|
||||
|
||||
protected:
|
||||
~VideoData();
|
||||
|
||||
bool mSentToCompositor;
|
||||
UniquePtr<Listener> mListener;
|
||||
};
|
||||
|
||||
class CryptoTrack
|
||||
|
@ -259,7 +259,7 @@ VideoSink::OnVideoQueuePushed(RefPtr<MediaData>&& aSample)
|
||||
// Listen to push event, VideoSink should try rendering ASAP if first frame
|
||||
// arrives but update scheduler is not triggered yet.
|
||||
VideoData* v = aSample->As<VideoData>();
|
||||
if (!v->mSentToCompositor) {
|
||||
if (!v->IsSentToCompositor()) {
|
||||
// Since we push rendered frames back to the queue, we will receive
|
||||
// push events for them. We only need to trigger render loop
|
||||
// when this frame is not rendered yet.
|
||||
@ -359,7 +359,7 @@ VideoSink::RenderVideoFrames(int32_t aMaxFrames,
|
||||
for (uint32_t i = 0; i < frames.Length(); ++i) {
|
||||
VideoData* frame = frames[i]->As<VideoData>();
|
||||
|
||||
frame->mSentToCompositor = true;
|
||||
frame->MarkSentToCompositor();
|
||||
|
||||
if (!frame->mImage || !frame->mImage->IsValid() ||
|
||||
!frame->mImage->GetSize().width || !frame->mImage->GetSize().height) {
|
||||
@ -417,7 +417,7 @@ VideoSink::UpdateRenderedVideoFrames()
|
||||
clockTime >= VideoQueue().PeekFront()->GetEndTime()) {
|
||||
RefPtr<MediaData> frame = VideoQueue().PopFront();
|
||||
lastFrameEndTime = frame->GetEndTime();
|
||||
if (frame->As<VideoData>()->mSentToCompositor) {
|
||||
if (frame->As<VideoData>()->IsSentToCompositor()) {
|
||||
mFrameStats.NotifyPresentedFrame();
|
||||
} else {
|
||||
mFrameStats.NotifyDecodedFrames({ 0, 0, 1 });
|
||||
|
@ -114,6 +114,40 @@ struct SampleTime final
|
||||
class RemoteVideoDecoder final : public RemoteDataDecoder
|
||||
{
|
||||
public:
|
||||
// Hold an output buffer and render it to the surface when the frame is sent to compositor, or
|
||||
// release it if not presented.
|
||||
class RenderOrReleaseOutput : public VideoData::Listener
|
||||
{
|
||||
public:
|
||||
RenderOrReleaseOutput(java::CodecProxy::Param aCodec, java::Sample::Param aSample)
|
||||
: mCodec(aCodec),
|
||||
mSample(aSample)
|
||||
{}
|
||||
|
||||
~RenderOrReleaseOutput()
|
||||
{
|
||||
ReleaseOutput(false);
|
||||
}
|
||||
|
||||
void OnSentToCompositor() override
|
||||
{
|
||||
ReleaseOutput(true);
|
||||
mCodec = nullptr;
|
||||
mSample = nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
void ReleaseOutput(bool aToRender)
|
||||
{
|
||||
if (mCodec && mSample) {
|
||||
mCodec->ReleaseOutput(mSample, aToRender);
|
||||
}
|
||||
}
|
||||
|
||||
java::CodecProxy::GlobalRef mCodec;
|
||||
java::Sample::GlobalRef mSample;
|
||||
};
|
||||
|
||||
class CallbacksSupport final : public JavaCallbacksSupport
|
||||
{
|
||||
public:
|
||||
@ -168,6 +202,9 @@ public:
|
||||
mDecoder->mConfig.mDisplay.width,
|
||||
mDecoder->mConfig.mDisplay.height));
|
||||
|
||||
UniquePtr<VideoData::Listener> listener(new RenderOrReleaseOutput(mDecoder->mJavaDecoder, aSample));
|
||||
v->SetListener(Move(listener));
|
||||
|
||||
mDecoderCallback->Output(v);
|
||||
}
|
||||
|
||||
|
@ -3958,7 +3958,7 @@ STATIC_ASSERT_FIELD_OFFSET_MATCHES(nsSize, nsSize_Simple, width);
|
||||
STATIC_ASSERT_FIELD_OFFSET_MATCHES(nsSize, nsSize_Simple, height);
|
||||
|
||||
/**
|
||||
* <div rustbindgen="true" replaces="mozilla_UniquePtr">
|
||||
* <div rustbindgen="true" replaces="mozilla::UniquePtr">
|
||||
*
|
||||
* TODO(Emilio): This is a workaround and we should be able to get rid of this
|
||||
* one.
|
||||
|
@ -683,6 +683,24 @@ nsSVGEffects::EffectProperties::GetMaskFrames()
|
||||
return result;
|
||||
}
|
||||
|
||||
bool
|
||||
nsSVGEffects::EffectProperties::MightHaveNoneSVGMask() const
|
||||
{
|
||||
if (!mMask) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const nsTArray<RefPtr<nsSVGPaintingProperty>>& props = mMask->GetProps();
|
||||
for (size_t i = 0; i < props.Length(); i++) {
|
||||
if (!props[i] ||
|
||||
!props[i]->GetReferencedFrame(nsGkAtoms::svgMaskFrame, nullptr)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
nsSVGEffects::UpdateEffects(nsIFrame* aFrame)
|
||||
{
|
||||
|
@ -493,6 +493,7 @@ public:
|
||||
*/
|
||||
nsTArray<nsSVGMaskFrame*> GetMaskFrames();
|
||||
|
||||
bool MightHaveNoneSVGMask() const;
|
||||
bool HasValidFilter() {
|
||||
return mFilter && mFilter->ReferencesValidResources();
|
||||
}
|
||||
|
@ -110,9 +110,18 @@ private:
|
||||
// property set, that would be bad, since then our GetVisualOverflowRect()
|
||||
// call would give us the post-effects, and post-transform, overflow rect.
|
||||
//
|
||||
NS_ASSERTION(aFrame->GetParent()->StyleContext()->GetPseudo() ==
|
||||
// With image masks, there is one more exception.
|
||||
//
|
||||
// In nsStyleImageLayers::Layer::CalcDifference, we do not add
|
||||
// nsChangeHint_UpdateOverflow hint when image mask(not SVG mask) property
|
||||
// value changed, since replace image mask does not cause layout change.
|
||||
// So even if we apply a new mask image to this frame,
|
||||
// PreEffectsBBoxProperty might still left empty.
|
||||
NS_ASSERTION(nsSVGEffects::GetEffectProperties(aFrame).MightHaveNoneSVGMask() ||
|
||||
aFrame->GetParent()->StyleContext()->GetPseudo() ==
|
||||
nsCSSAnonBoxes::mozAnonymousBlock,
|
||||
"How did we getting here, then?");
|
||||
|
||||
NS_ASSERTION(!aFrame->Properties().Get(
|
||||
aFrame->PreTransformOverflowAreasProperty()),
|
||||
"GetVisualOverflowRect() won't return the pre-effects rect!");
|
||||
|
@ -333,6 +333,47 @@ AnnexB::HasSPS(const mozilla::MediaByteBuffer* aExtraData)
|
||||
return numSps > 0;
|
||||
}
|
||||
|
||||
bool
|
||||
AnnexB::HasPPS(const mozilla::MediaRawData* aSample)
|
||||
{
|
||||
return HasPPS(aSample->mExtraData);
|
||||
}
|
||||
|
||||
bool
|
||||
AnnexB::HasPPS(const mozilla::MediaByteBuffer* aExtraData)
|
||||
{
|
||||
if (!aExtraData) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ByteReader reader(aExtraData);
|
||||
const uint8_t* ptr = reader.Read(5);
|
||||
if (!ptr || !reader.CanRead8()) {
|
||||
return false;
|
||||
}
|
||||
uint8_t numSps = reader.ReadU8() & 0x1f;
|
||||
// Skip over the included SPS.
|
||||
for (uint8_t i = 0; i < numSps; i++) {
|
||||
if (reader.Remaining() < 3) {
|
||||
return false;
|
||||
}
|
||||
uint16_t length = reader.ReadU16();
|
||||
if ((reader.PeekU8() & 0x1f) != 7) {
|
||||
// Not an SPS NAL type.
|
||||
return false;
|
||||
}
|
||||
if (!reader.Read(length)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!reader.CanRead8()) {
|
||||
return false;
|
||||
}
|
||||
uint8_t numPps = reader.ReadU8();
|
||||
|
||||
return numPps > 0;
|
||||
}
|
||||
|
||||
bool
|
||||
AnnexB::ConvertSampleTo4BytesAVCC(mozilla::MediaRawData* aSample)
|
||||
{
|
||||
|
@ -101,4 +101,10 @@ BitReader::BitCount() const
|
||||
return mSize * 8 - mBitReader->numBitsLeft();
|
||||
}
|
||||
|
||||
size_t
|
||||
BitReader::BitsLeft() const
|
||||
{
|
||||
return mBitReader->numBitsLeft();
|
||||
}
|
||||
|
||||
} // namespace mp4_demuxer
|
||||
|
@ -11,11 +11,98 @@
|
||||
#include "mp4_demuxer/H264.h"
|
||||
#include <media/stagefright/foundation/ABitReader.h>
|
||||
#include <limits>
|
||||
#include <cmath>
|
||||
|
||||
using namespace mozilla;
|
||||
|
||||
namespace mp4_demuxer
|
||||
namespace mp4_demuxer {
|
||||
|
||||
// Default scaling lists (per spec).
|
||||
// ITU H264:
|
||||
// Table 7-2 – Assignment of mnemonic names to scaling list indices and
|
||||
// specification of fall-back rule
|
||||
static const uint8_t Default_4x4_Intra[16] = {
|
||||
6, 13, 13, 20,
|
||||
20, 20, 28, 28,
|
||||
28, 28, 32, 32,
|
||||
32, 37, 37, 42
|
||||
};
|
||||
|
||||
static const uint8_t Default_4x4_Inter[16] = {
|
||||
10, 14, 14, 20,
|
||||
20, 20, 24, 24,
|
||||
24, 24, 27, 27,
|
||||
27, 30, 30, 34
|
||||
};
|
||||
|
||||
static const uint8_t Default_8x8_Intra[64] = {
|
||||
6, 10, 10, 13, 11, 13, 16, 16,
|
||||
16, 16, 18, 18, 18, 18, 18, 23,
|
||||
23, 23, 23, 23, 23, 25, 25, 25,
|
||||
25, 25, 25, 25, 27, 27, 27, 27,
|
||||
27, 27, 27, 27, 29, 29, 29, 29,
|
||||
29, 29, 29, 31, 31, 31, 31, 31,
|
||||
31, 33, 33, 33, 33, 33, 36, 36,
|
||||
36, 36, 38, 38, 38, 40, 40, 42
|
||||
};
|
||||
|
||||
static const uint8_t Default_8x8_Inter[64] = {
|
||||
9, 13, 13, 15, 13, 15, 17, 17,
|
||||
17, 17, 19, 19, 19, 19, 19, 21,
|
||||
21, 21, 21, 21, 21, 22, 22, 22,
|
||||
22, 22, 22, 22, 24, 24, 24, 24,
|
||||
24, 24, 24, 24, 25, 25, 25, 25,
|
||||
25, 25, 25, 27, 27, 27, 27, 27,
|
||||
27, 28, 28, 28, 28, 28, 30, 30,
|
||||
30, 30, 32, 32, 32, 33, 33, 35
|
||||
};
|
||||
|
||||
namespace detail {
|
||||
static void
|
||||
scaling_list(BitReader& aBr, uint8_t* aScalingList, int aSizeOfScalingList,
|
||||
const uint8_t* aDefaultList, const uint8_t* aFallbackList)
|
||||
{
|
||||
int32_t lastScale = 8;
|
||||
int32_t nextScale = 8;
|
||||
int32_t deltaScale;
|
||||
|
||||
// (pic|seq)_scaling_list_present_flag[i]
|
||||
if (!aBr.ReadBit()) {
|
||||
if (aFallbackList) {
|
||||
memcpy(aScalingList, aFallbackList, aSizeOfScalingList);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < aSizeOfScalingList; i++) {
|
||||
if (nextScale != 0) {
|
||||
deltaScale = aBr.ReadSE();
|
||||
nextScale = (lastScale + deltaScale + 256) % 256;
|
||||
if (!i && !nextScale) {
|
||||
memcpy(aScalingList, aDefaultList, aSizeOfScalingList);
|
||||
return;
|
||||
}
|
||||
}
|
||||
aScalingList[i] = (nextScale == 0) ? lastScale : nextScale;
|
||||
lastScale = aScalingList[i];
|
||||
}
|
||||
}
|
||||
} // namespace detail.
|
||||
|
||||
template <size_t N>
|
||||
static void
|
||||
scaling_list(BitReader& aBr, uint8_t (&aScalingList)[N],
|
||||
const uint8_t (&aDefaultList)[N], const uint8_t (&aFallbackList)[N])
|
||||
{
|
||||
detail::scaling_list(aBr, aScalingList, N, aDefaultList, aFallbackList);
|
||||
}
|
||||
|
||||
template <size_t N>
|
||||
static void
|
||||
scaling_list(BitReader& aBr, uint8_t (&aScalingList)[N], const uint8_t (&aDefaultList)[N])
|
||||
{
|
||||
detail::scaling_list(aBr, aScalingList, N, aDefaultList, nullptr);
|
||||
}
|
||||
|
||||
SPSData::SPSData()
|
||||
{
|
||||
@ -26,8 +113,31 @@ SPSData::SPSData()
|
||||
colour_primaries = 2;
|
||||
transfer_characteristics = 2;
|
||||
sample_ratio = 1.0;
|
||||
memset(scaling_matrix4x4, 16, sizeof(scaling_matrix4x4));
|
||||
memset(scaling_matrix8x8, 16, sizeof(scaling_matrix8x8));
|
||||
}
|
||||
|
||||
PPSData::PPSData()
|
||||
{
|
||||
PodZero(this);
|
||||
memset(scaling_matrix4x4, 16, sizeof(scaling_matrix4x4));
|
||||
memset(scaling_matrix8x8, 16, sizeof(scaling_matrix8x8));
|
||||
}
|
||||
|
||||
const uint8_t H264::ZZ_SCAN[16] = { 0, 1, 4, 8,
|
||||
5, 2, 3, 6,
|
||||
9, 12, 13, 10,
|
||||
7, 11, 14, 15 };
|
||||
|
||||
const uint8_t H264::ZZ_SCAN8[64] = { 0, 1, 8, 16, 9, 2, 3, 10,
|
||||
17, 24, 32, 25, 18, 11, 4, 5,
|
||||
12, 19, 26, 33, 40, 48, 41, 34,
|
||||
27, 20, 13, 6, 7, 14, 21, 28,
|
||||
35, 42, 49, 56, 57, 50, 43, 36,
|
||||
29, 22, 15, 23, 30, 37, 44, 51,
|
||||
58, 59, 52, 45, 38, 31, 39, 46,
|
||||
53, 60, 61, 54, 47, 55, 62, 63 };
|
||||
|
||||
/* static */ already_AddRefed<mozilla::MediaByteBuffer>
|
||||
H264::DecodeNALUnit(const mozilla::MediaByteBuffer* aNAL)
|
||||
{
|
||||
@ -91,10 +201,6 @@ H264::DecodeSPS(const mozilla::MediaByteBuffer* aSPS, SPSData& aDest)
|
||||
}
|
||||
BitReader br(aSPS);
|
||||
|
||||
int32_t lastScale;
|
||||
int32_t nextScale;
|
||||
int32_t deltaScale;
|
||||
|
||||
aDest.profile_idc = br.ReadBits(8);
|
||||
aDest.constraint_set0_flag = br.ReadBit();
|
||||
aDest.constraint_set1_flag = br.ReadBit();
|
||||
@ -108,32 +214,47 @@ H264::DecodeSPS(const mozilla::MediaByteBuffer* aSPS, SPSData& aDest)
|
||||
if (aDest.profile_idc == 100 || aDest.profile_idc == 110 ||
|
||||
aDest.profile_idc == 122 || aDest.profile_idc == 244 ||
|
||||
aDest.profile_idc == 44 || aDest.profile_idc == 83 ||
|
||||
aDest.profile_idc == 86 || aDest.profile_idc == 118 ||
|
||||
aDest.profile_idc == 86 || aDest.profile_idc == 118 ||
|
||||
aDest.profile_idc == 128 || aDest.profile_idc == 138 ||
|
||||
aDest.profile_idc == 139 || aDest.profile_idc == 134) {
|
||||
if ((aDest.chroma_format_idc = br.ReadUE()) == 3) {
|
||||
aDest.separate_colour_plane_flag = br.ReadBit();
|
||||
}
|
||||
br.ReadUE(); // bit_depth_luma_minus8
|
||||
br.ReadUE(); // bit_depth_chroma_minus8
|
||||
br.ReadBit(); // qpprime_y_zero_transform_bypass_flag
|
||||
if (br.ReadBit()) { // seq_scaling_matrix_present_flag
|
||||
for (int idx = 0; idx < ((aDest.chroma_format_idc != 3) ? 8 : 12); ++idx) {
|
||||
if (br.ReadBit()) { // Scaling list present
|
||||
lastScale = nextScale = 8;
|
||||
int sl_n = (idx < 6) ? 16 : 64;
|
||||
for (int sl_i = 0; sl_i < sl_n; sl_i++) {
|
||||
if (nextScale) {
|
||||
deltaScale = br.ReadSE();
|
||||
nextScale = (lastScale + deltaScale + 256) % 256;
|
||||
}
|
||||
lastScale = (nextScale == 0) ? lastScale : nextScale;
|
||||
}
|
||||
}
|
||||
aDest.bit_depth_luma_minus8 = br.ReadUE();
|
||||
aDest.bit_depth_chroma_minus8 = br.ReadUE();
|
||||
br.ReadBit(); // qpprime_y_zero_transform_bypass_flag
|
||||
aDest.seq_scaling_matrix_present_flag = br.ReadBit();
|
||||
if (aDest.seq_scaling_matrix_present_flag) {
|
||||
scaling_list(br, aDest.scaling_matrix4x4[0], Default_4x4_Intra,
|
||||
Default_4x4_Intra);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[1], Default_4x4_Intra,
|
||||
aDest.scaling_matrix4x4[0]);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[2], Default_4x4_Intra,
|
||||
aDest.scaling_matrix4x4[1]);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[3], Default_4x4_Inter,
|
||||
Default_4x4_Inter);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[4], Default_4x4_Inter,
|
||||
aDest.scaling_matrix4x4[3]);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[5], Default_4x4_Inter,
|
||||
aDest.scaling_matrix4x4[4]);
|
||||
|
||||
scaling_list(br, aDest.scaling_matrix8x8[0], Default_8x8_Intra,
|
||||
Default_8x8_Intra);
|
||||
scaling_list(br, aDest.scaling_matrix8x8[1], Default_8x8_Inter,
|
||||
Default_8x8_Inter);
|
||||
if (aDest.chroma_format_idc == 3) {
|
||||
scaling_list(br, aDest.scaling_matrix8x8[2], Default_8x8_Intra,
|
||||
aDest.scaling_matrix8x8[0]);
|
||||
scaling_list(br, aDest.scaling_matrix8x8[3], Default_8x8_Inter,
|
||||
aDest.scaling_matrix8x8[1]);
|
||||
scaling_list(br, aDest.scaling_matrix8x8[4], Default_8x8_Intra,
|
||||
aDest.scaling_matrix8x8[2]);
|
||||
scaling_list(br, aDest.scaling_matrix8x8[5], Default_8x8_Inter,
|
||||
aDest.scaling_matrix8x8[3]);
|
||||
}
|
||||
}
|
||||
} else if (aDest.profile_idc == 183) {
|
||||
aDest.chroma_format_idc = 0;
|
||||
aDest.chroma_format_idc = 0;
|
||||
} else {
|
||||
// default value if chroma_format_idc isn't set.
|
||||
aDest.chroma_format_idc = 1;
|
||||
@ -160,7 +281,7 @@ H264::DecodeSPS(const mozilla::MediaByteBuffer* aSPS, SPSData& aDest)
|
||||
aDest.pic_height_in_map_units *= 2;
|
||||
aDest.mb_adaptive_frame_field_flag = br.ReadBit();
|
||||
}
|
||||
br.ReadBit(); // direct_8x8_inference_flag
|
||||
aDest.direct_8x8_inference_flag = br.ReadBit();
|
||||
aDest.frame_cropping_flag = br.ReadBit();
|
||||
if (aDest.frame_cropping_flag) {
|
||||
aDest.frame_crop_left_offset = br.ReadUE();
|
||||
@ -240,7 +361,7 @@ H264::vui_parameters(BitReader& aBr, SPSData& aDest)
|
||||
aDest.sar_width = aDest.sar_height = 0;
|
||||
|
||||
// From E.2.1 VUI parameters semantics (ITU-T H.264 02/2014)
|
||||
switch (aDest.aspect_ratio_idc) {
|
||||
switch (aDest.aspect_ratio_idc) {
|
||||
case 0:
|
||||
// Unspecified
|
||||
break;
|
||||
@ -368,7 +489,7 @@ H264::vui_parameters(BitReader& aBr, SPSData& aDest)
|
||||
break;
|
||||
case 255:
|
||||
/* Extended_SAR */
|
||||
aDest.sar_width = aBr.ReadBits(16);
|
||||
aDest.sar_width = aBr.ReadBits(16);
|
||||
aDest.sar_height = aBr.ReadBits(16);
|
||||
if (aDest.sar_width && aDest.sar_height) {
|
||||
aDest.sample_ratio = float(aDest.sar_width) / float(aDest.sar_height);
|
||||
@ -401,7 +522,7 @@ H264::vui_parameters(BitReader& aBr, SPSData& aDest)
|
||||
}
|
||||
|
||||
aDest.timing_info_present_flag = aBr.ReadBit();
|
||||
if (aDest.timing_info_present_flag ) {
|
||||
if (aDest.timing_info_present_flag) {
|
||||
aDest.num_units_in_tick = aBr.ReadBits(32);
|
||||
aDest.time_scale = aBr.ReadBits(32);
|
||||
aDest.fixed_frame_rate_flag = aBr.ReadBit();
|
||||
@ -409,7 +530,8 @@ H264::vui_parameters(BitReader& aBr, SPSData& aDest)
|
||||
}
|
||||
|
||||
/* static */ bool
|
||||
H264::DecodeSPSFromExtraData(const mozilla::MediaByteBuffer* aExtraData, SPSData& aDest)
|
||||
H264::DecodeSPSFromExtraData(const mozilla::MediaByteBuffer* aExtraData,
|
||||
SPSData& aDest)
|
||||
{
|
||||
if (!AnnexB::HasSPS(aExtraData)) {
|
||||
return false;
|
||||
@ -420,17 +542,19 @@ H264::DecodeSPSFromExtraData(const mozilla::MediaByteBuffer* aExtraData, SPSData
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(reader.ReadU8() & 0x1f)) {
|
||||
uint8_t numSps = reader.ReadU8() & 0x1f;
|
||||
if (!numSps) {
|
||||
// No SPS.
|
||||
return false;
|
||||
}
|
||||
NS_ASSERTION(numSps == 1, "More than one SPS in extradata");
|
||||
|
||||
uint16_t length = reader.ReadU16();
|
||||
|
||||
if ((reader.PeekU8() & 0x1f) != 7) {
|
||||
// Not a SPS NAL type.
|
||||
return false;
|
||||
}
|
||||
|
||||
const uint8_t* ptr = reader.Read(length);
|
||||
if (!ptr) {
|
||||
return false;
|
||||
@ -455,8 +579,7 @@ H264::EnsureSPSIsSane(SPSData& aSPS)
|
||||
static const float default_aspect = 4.0f / 3.0f;
|
||||
if (aSPS.sample_ratio <= 0.0f || aSPS.sample_ratio > 6.0f) {
|
||||
if (aSPS.pic_width && aSPS.pic_height) {
|
||||
aSPS.sample_ratio =
|
||||
(float) aSPS.pic_width / (float) aSPS.pic_height;
|
||||
aSPS.sample_ratio = (float)aSPS.pic_width / (float)aSPS.pic_height;
|
||||
} else {
|
||||
aSPS.sample_ratio = default_aspect;
|
||||
}
|
||||
@ -471,6 +594,189 @@ H264::EnsureSPSIsSane(SPSData& aSPS)
|
||||
return valid;
|
||||
}
|
||||
|
||||
/* static */ bool
|
||||
H264::DecodePPSFromExtraData(const mozilla::MediaByteBuffer* aExtraData,
|
||||
const SPSData& aSPS, PPSData& aDest)
|
||||
{
|
||||
if (!AnnexB::HasPPS(aExtraData)) {
|
||||
return false;
|
||||
}
|
||||
ByteReader reader(aExtraData);
|
||||
|
||||
if (!reader.Read(5)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t numSps = reader.ReadU8() & 0x1f;
|
||||
if (!numSps) {
|
||||
// No SPS.
|
||||
return false;
|
||||
}
|
||||
NS_ASSERTION(numSps == 1, "More than one SPS in extradata");
|
||||
for (uint8_t i = 0; i < numSps; i++) {
|
||||
uint16_t length = reader.ReadU16();
|
||||
|
||||
if ((reader.PeekU8() & 0x1f) != 7) {
|
||||
// Not a SPS NAL type.
|
||||
return false;
|
||||
}
|
||||
const uint8_t* ptr = reader.Read(length);
|
||||
if (!ptr) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
uint8_t numPps = reader.ReadU8();
|
||||
if (!numPps) {
|
||||
// No PPs.
|
||||
return false;
|
||||
}
|
||||
NS_ASSERTION(numPps == 1, "More than one PPS in extradata");
|
||||
uint16_t length = reader.ReadU16();
|
||||
|
||||
if ((reader.PeekU8() & 0x1f) != 8) {
|
||||
// Not a PPS NAL type.
|
||||
return false;
|
||||
}
|
||||
const uint8_t* ptr = reader.Read(length);
|
||||
if (!ptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
RefPtr<mozilla::MediaByteBuffer> rawNAL = new mozilla::MediaByteBuffer;
|
||||
rawNAL->AppendElements(ptr, length);
|
||||
|
||||
RefPtr<mozilla::MediaByteBuffer> pps = DecodeNALUnit(rawNAL);
|
||||
|
||||
if (!pps) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return DecodePPS(pps, aSPS, aDest);
|
||||
}
|
||||
|
||||
/* static */ bool
|
||||
H264::DecodePPS(const mozilla::MediaByteBuffer* aPPS,const SPSData& aSPS,
|
||||
PPSData& aDest)
|
||||
{
|
||||
if (!aPPS) {
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(aDest.scaling_matrix4x4, aSPS.scaling_matrix4x4,
|
||||
sizeof(aDest.scaling_matrix4x4));
|
||||
memcpy(aDest.scaling_matrix8x8, aSPS.scaling_matrix8x8,
|
||||
sizeof(aDest.scaling_matrix8x8));
|
||||
|
||||
BitReader br(aPPS);
|
||||
|
||||
aDest.pic_parameter_set_id = br.ReadUE();
|
||||
aDest.seq_parameter_set_id = br.ReadUE();
|
||||
aDest.entropy_coding_mode_flag = br.ReadBit();
|
||||
aDest.bottom_field_pic_order_in_frame_present_flag = br.ReadBit();
|
||||
aDest.num_slice_groups_minus1 = br.ReadUE();
|
||||
if (aDest.num_slice_groups_minus1 > 0) {
|
||||
aDest.slice_group_map_type = br.ReadUE();
|
||||
switch (aDest.slice_group_map_type) {
|
||||
case 0:
|
||||
for (uint8_t iGroup = 0; iGroup <= aDest.num_slice_groups_minus1;
|
||||
iGroup++) {
|
||||
aDest.run_length_minus1[iGroup] = br.ReadUE();
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
for (uint8_t iGroup = 0; iGroup < aDest.num_slice_groups_minus1;
|
||||
iGroup++) {
|
||||
aDest.top_left[iGroup] = br.ReadUE();
|
||||
aDest.bottom_right[iGroup] = br.ReadUE();
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
aDest.slice_group_change_direction_flag = br.ReadBit();
|
||||
aDest.slice_group_change_rate_minus1 = br.ReadUE();
|
||||
break;
|
||||
case 6:
|
||||
aDest.pic_size_in_map_units_minus1 = br.ReadUE();
|
||||
for (uint32_t i = 0; i <= aDest.pic_size_in_map_units_minus1; i++) {
|
||||
/* slice_group_id[ i ] identifies a slice group of the i-th slice group map
|
||||
unit in raster scan order. The length of the slice_group_id[i] syntax
|
||||
element is Ceil(Log2(num_slice_groups_minus1+1)) bits. The value of
|
||||
slice_group_id[i] shall be in the range of 0 to num_slice_groups_minus1,
|
||||
inclusive. */
|
||||
br.ReadBits(std::ceil(std::log2(aDest.num_slice_groups_minus1 + 1)));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
aDest.num_ref_idx_l0_default_active_minus1 = br.ReadUE();
|
||||
aDest.num_ref_idx_l1_default_active_minus1 = br.ReadUE();
|
||||
if (aDest.num_ref_idx_l0_default_active_minus1 > 32 ||
|
||||
aDest.num_ref_idx_l1_default_active_minus1 > 32) {
|
||||
// reference overflow.
|
||||
return false;
|
||||
}
|
||||
aDest.weighted_pred_flag = br.ReadBit();
|
||||
aDest.weighted_bipred_idc = br.ReadBits(2);
|
||||
aDest.pic_init_qp_minus26 = br.ReadSE();
|
||||
aDest.pic_init_qs_minus26 = br.ReadSE();
|
||||
aDest.chroma_qp_index_offset = br.ReadSE();
|
||||
aDest.deblocking_filter_control_present_flag = br.ReadBit();
|
||||
aDest.constrained_intra_pred_flag = br.ReadBit();
|
||||
aDest.redundant_pic_cnt_present_flag = br.ReadBit();
|
||||
if (br.BitsLeft()) {
|
||||
aDest.transform_8x8_mode_flag = br.ReadBit();
|
||||
if (br.ReadBit()) { // pic_scaling_matrix_present_flag
|
||||
if (aSPS.seq_scaling_matrix_present_flag) {
|
||||
scaling_list(br, aDest.scaling_matrix4x4[0], Default_4x4_Intra);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[1], Default_4x4_Intra,
|
||||
aDest.scaling_matrix4x4[0]);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[2], Default_4x4_Intra,
|
||||
aDest.scaling_matrix4x4[1]);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[3], Default_4x4_Inter);
|
||||
} else {
|
||||
scaling_list(br, aDest.scaling_matrix4x4[0], Default_4x4_Intra,
|
||||
Default_4x4_Intra);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[1], Default_4x4_Intra,
|
||||
aDest.scaling_matrix4x4[0]);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[2], Default_4x4_Intra,
|
||||
aDest.scaling_matrix4x4[1]);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[3], Default_4x4_Inter,
|
||||
Default_4x4_Inter);
|
||||
}
|
||||
scaling_list(br, aDest.scaling_matrix4x4[4], Default_4x4_Inter,
|
||||
aDest.scaling_matrix4x4[3]);
|
||||
scaling_list(br, aDest.scaling_matrix4x4[5], Default_4x4_Inter,
|
||||
aDest.scaling_matrix4x4[4]);
|
||||
if (aDest.transform_8x8_mode_flag) {
|
||||
if (aSPS.seq_scaling_matrix_present_flag) {
|
||||
scaling_list(br, aDest.scaling_matrix8x8[0], Default_8x8_Intra);
|
||||
scaling_list(br, aDest.scaling_matrix8x8[1], Default_8x8_Inter);
|
||||
} else {
|
||||
scaling_list(br, aDest.scaling_matrix8x8[0], Default_8x8_Intra,
|
||||
Default_8x8_Intra);
|
||||
scaling_list(br, aDest.scaling_matrix8x8[1], Default_8x8_Inter,
|
||||
Default_8x8_Inter);
|
||||
}
|
||||
if (aSPS.chroma_format_idc == 3) {
|
||||
scaling_list(br, aDest.scaling_matrix8x8[2], Default_8x8_Intra,
|
||||
aDest.scaling_matrix8x8[0]);
|
||||
scaling_list(br, aDest.scaling_matrix8x8[3], Default_8x8_Inter,
|
||||
aDest.scaling_matrix8x8[1]);
|
||||
scaling_list(br, aDest.scaling_matrix8x8[4], Default_8x8_Intra,
|
||||
aDest.scaling_matrix8x8[2]);
|
||||
scaling_list(br, aDest.scaling_matrix8x8[5], Default_8x8_Inter,
|
||||
aDest.scaling_matrix8x8[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
aDest.second_chroma_qp_index_offset = br.ReadSE();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* static */ uint32_t
|
||||
H264::ComputeMaxRefFrames(const mozilla::MediaByteBuffer* aExtraData)
|
||||
{
|
||||
|
@ -36,6 +36,8 @@ public:
|
||||
const mozilla::MediaRawData* aSample);
|
||||
static bool HasSPS(const mozilla::MediaRawData* aSample);
|
||||
static bool HasSPS(const mozilla::MediaByteBuffer* aExtraData);
|
||||
static bool HasPPS(const mozilla::MediaRawData* aSample);
|
||||
static bool HasPPS(const mozilla::MediaByteBuffer* aExtraData);
|
||||
// Returns true if format is AVCC and sample has valid extradata.
|
||||
static bool IsAVCC(const mozilla::MediaRawData* aSample);
|
||||
// Returns true if format is AnnexB.
|
||||
|
@ -34,6 +34,8 @@ public:
|
||||
|
||||
// Return the number of bits parsed so far;
|
||||
size_t BitCount() const;
|
||||
// Return the number of bits left.
|
||||
size_t BitsLeft() const;
|
||||
|
||||
private:
|
||||
nsAutoPtr<stagefright::ABitReader> mBitReader;
|
||||
|
@ -7,8 +7,7 @@
|
||||
|
||||
#include "mp4_demuxer/DecoderData.h"
|
||||
|
||||
namespace mp4_demuxer
|
||||
{
|
||||
namespace mp4_demuxer {
|
||||
|
||||
class BitReader;
|
||||
|
||||
@ -82,6 +81,28 @@ struct SPSData
|
||||
*/
|
||||
uint8_t chroma_format_idc;
|
||||
|
||||
/*
|
||||
bit_depth_luma_minus8 specifies the bit depth of the samples of the luma
|
||||
array and the value of the luma quantisation parameter range offset
|
||||
QpBdOffset Y , as specified by
|
||||
BitDepth Y = 8 + bit_depth_luma_minus8 (7-3)
|
||||
QpBdOffset Y = 6 * bit_depth_luma_minus8 (7-4)
|
||||
When bit_depth_luma_minus8 is not present, it shall be inferred to be equal
|
||||
to 0. bit_depth_luma_minus8 shall be in the range of 0 to 6, inclusive.
|
||||
*/
|
||||
uint8_t bit_depth_luma_minus8;
|
||||
|
||||
/*
|
||||
bit_depth_chroma_minus8 specifies the bit depth of the samples of the chroma
|
||||
arrays and the value of the chroma quantisation parameter range offset
|
||||
QpBdOffset C , as specified by
|
||||
BitDepth C = 8 + bit_depth_chroma_minus8 (7-5)
|
||||
QpBdOffset C = 6 * bit_depth_chroma_minus8 (7-6)
|
||||
When bit_depth_chroma_minus8 is not present, it shall be inferred to be
|
||||
equal to 0. bit_depth_chroma_minus8 shall be in the range of 0 to 6, inclusive.
|
||||
*/
|
||||
uint8_t bit_depth_chroma_minus8;
|
||||
|
||||
/*
|
||||
separate_colour_plane_flag equal to 1 specifies that the three colour
|
||||
components of the 4:4:4 chroma format are coded separately.
|
||||
@ -95,6 +116,18 @@ struct SPSData
|
||||
*/
|
||||
bool separate_colour_plane_flag;
|
||||
|
||||
/*
|
||||
seq_scaling_matrix_present_flag equal to 1 specifies that the flags
|
||||
seq_scaling_list_present_flag[ i ] for i = 0..7 or
|
||||
i = 0..11 are present. seq_scaling_matrix_present_flag equal to 0 specifies
|
||||
that these flags are not present and the sequence-level scaling list
|
||||
specified by Flat_4x4_16 shall be inferred for i = 0..5 and the
|
||||
sequence-level scaling list specified by Flat_8x8_16 shall be inferred for
|
||||
i = 6..11. When seq_scaling_matrix_present_flag is not present, it shall be
|
||||
inferred to be equal to 0.
|
||||
*/
|
||||
bool seq_scaling_matrix_present_flag;
|
||||
|
||||
/*
|
||||
log2_max_frame_num_minus4 specifies the value of the variable
|
||||
MaxFrameNum that is used in frame_num related derivations as
|
||||
@ -201,6 +234,14 @@ struct SPSData
|
||||
*/
|
||||
bool mb_adaptive_frame_field_flag;
|
||||
|
||||
/*
|
||||
direct_8x8_inference_flag specifies the method used in the derivation
|
||||
process for luma motion vectors for B_Skip, B_Direct_16x16 and B_Direct_8x8
|
||||
as specified in clause 8.4.1.2. When frame_mbs_only_flag is equal to 0,
|
||||
direct_8x8_inference_flag shall be equal to 1.
|
||||
*/
|
||||
bool direct_8x8_inference_flag;
|
||||
|
||||
/*
|
||||
frame_cropping_flag equal to 1 specifies that the frame cropping
|
||||
offset parameters follow next in the sequence parameter
|
||||
@ -208,7 +249,7 @@ struct SPSData
|
||||
cropping offset parameters are not present.
|
||||
*/
|
||||
bool frame_cropping_flag;
|
||||
uint32_t frame_crop_left_offset;;
|
||||
uint32_t frame_crop_left_offset;
|
||||
uint32_t frame_crop_right_offset;
|
||||
uint32_t frame_crop_top_offset;
|
||||
uint32_t frame_crop_bottom_offset;
|
||||
@ -325,30 +366,224 @@ struct SPSData
|
||||
uint32_t time_scale;
|
||||
bool fixed_frame_rate_flag;
|
||||
|
||||
bool scaling_matrix_present;
|
||||
uint8_t scaling_matrix4x4[6][16];
|
||||
uint8_t scaling_matrix8x8[6][64];
|
||||
|
||||
SPSData();
|
||||
};
|
||||
|
||||
struct PPSData
|
||||
{
|
||||
/*
|
||||
H264 decoding parameters according to ITU-T H.264 (T-REC-H.264-201402-I/en)
|
||||
http://www.itu.int/rec/T-REC-H.264-201402-I/en
|
||||
7.3.2.2 Picture parameter set RBSP syntax
|
||||
*/
|
||||
/* pic_parameter_set_id identifies the picture parameter set that is referred
|
||||
to in the slice header. The value of pic_parameter_set_id shall be in the
|
||||
range of 0 to 255, inclusive. */
|
||||
uint8_t pic_parameter_set_id;
|
||||
|
||||
/* seq_parameter_set_id refers to the active sequence parameter set. The value
|
||||
of seq_parameter_set_id shall be in the range of 0 to 31, inclusive. */
|
||||
uint8_t seq_parameter_set_id;
|
||||
|
||||
/* entropy_coding_mode_flag selects the entropy decoding method to be applied
|
||||
for the syntax elements for which two descriptors appear in the syntax tables
|
||||
as follows:
|
||||
– If entropy_coding_mode_flag is equal to 0, the method specified by the
|
||||
left descriptor in the syntax table is applied (Exp-Golomb coded, see
|
||||
clause 9.1 or CAVLC, see clause 9.2).
|
||||
– Otherwise (entropy_coding_mode_flag is equal to 1), the method specified
|
||||
by the right descriptor in the syntax table is applied (CABAC, see clause
|
||||
9.3) */
|
||||
bool entropy_coding_mode_flag;
|
||||
|
||||
/* bottom_field_pic_order_in_frame_present_flag equal to 1 specifies that the
|
||||
syntax elements delta_pic_order_cnt_bottom (when pic_order_cnt_type is
|
||||
equal to 0) or delta_pic_order_cnt[ 1 ] (when pic_order_cnt_type is equal to
|
||||
1), which are related to picture order counts for the bottom field of a
|
||||
coded frame, are present in the slice headers for coded frames as specified
|
||||
in clause 7.3.3. bottom_field_pic_order_in_frame_present_flag equal to 0
|
||||
specifies that the syntax elements delta_pic_order_cnt_bottom and
|
||||
delta_pic_order_cnt[ 1 ] are not present in the slice headers.
|
||||
Also known has pic_order_present_flag. */
|
||||
bool bottom_field_pic_order_in_frame_present_flag;
|
||||
|
||||
/* num_slice_groups_minus1 plus 1 specifies the number of slice groups for a
|
||||
picture. When num_slice_groups_minus1 is equal to 0, all slices of the
|
||||
picture belong to the same slice group. The allowed range of
|
||||
num_slice_groups_minus1 is specified in Annex A. */
|
||||
uint8_t num_slice_groups_minus1;
|
||||
|
||||
/* slice_group_map_type specifies how the mapping of slice group map units to
|
||||
slice groups is coded. The value of slice_group_map_type shall be in the
|
||||
range of 0 to 6, inclusive. */
|
||||
uint8_t slice_group_map_type;
|
||||
|
||||
/* run_length_minus1[i] is used to specify the number of consecutive slice
|
||||
group map units to be assigned to the i-th slice group in raster scan order
|
||||
of slice group map units. The value of run_length_minus1[ i ] shall be in
|
||||
the range of 0 to PicSizeInMapUnits − 1, inclusive. */
|
||||
uint32_t run_length_minus1[8];
|
||||
|
||||
/* top_left[i] and bottom_right[i] specify the top-left and bottom-right
|
||||
corners of a rectangle, respectively. top_left[i] and bottom_right[i] are
|
||||
slice group map unit positions in a raster scan of the picture for the slice
|
||||
group map units. For each rectangle i, all of the following constraints
|
||||
shall be obeyed by the values of the syntax elements top_left[i] and
|
||||
bottom_right[i]:
|
||||
– top_left[ i ] shall be less than or equal to bottom_right[i] and
|
||||
bottom_right[i] shall be less than PicSizeInMapUnits.
|
||||
– (top_left[i] % PicWidthInMbs) shall be less than or equal to the value
|
||||
of (bottom_right[i] % PicWidthInMbs). */
|
||||
uint32_t top_left[8];
|
||||
uint32_t bottom_right[8];
|
||||
|
||||
/* slice_group_change_direction_flag is used with slice_group_map_type to
|
||||
specify the refined map type when slice_group_map_type is 3, 4, or 5. */
|
||||
bool slice_group_change_direction_flag;
|
||||
|
||||
/* slice_group_change_rate_minus1 is used to specify the variable
|
||||
SliceGroupChangeRate. SliceGroupChangeRate specifies the multiple in number
|
||||
of slice group map units by which the size of a slice group can change from
|
||||
one picture to the next. The value of slice_group_change_rate_minus1 shall
|
||||
be in the range of 0 to PicSizeInMapUnits − 1, inclusive.
|
||||
The SliceGroupChangeRate variable is specified as follows:
|
||||
SliceGroupChangeRate = slice_group_change_rate_minus1 + 1 */
|
||||
uint32_t slice_group_change_rate_minus1;
|
||||
|
||||
/* pic_size_in_map_units_minus1 is used to specify the number of slice group
|
||||
map units in the picture. pic_size_in_map_units_minus1 shall be equal to
|
||||
PicSizeInMapUnits − 1. */
|
||||
uint32_t pic_size_in_map_units_minus1;
|
||||
|
||||
/* num_ref_idx_l0_default_active_minus1 specifies how
|
||||
num_ref_idx_l0_active_minus1 is inferred for P, SP, and B slices
|
||||
with num_ref_idx_active_override_flag equal to 0. The value of
|
||||
num_ref_idx_l0_default_active_minus1 shall be in the
|
||||
range of 0 to 31, inclusive. */
|
||||
uint8_t num_ref_idx_l0_default_active_minus1;
|
||||
|
||||
/* num_ref_idx_l1_default_active_minus1 specifies how
|
||||
num_ref_idx_l1_active_minus1 is inferred for B slices with
|
||||
num_ref_idx_active_override_flag equal to 0. The value of
|
||||
num_ref_idx_l1_default_active_minus1 shall be in the range
|
||||
of 0 to 31, inclusive. */
|
||||
uint8_t num_ref_idx_l1_default_active_minus1;
|
||||
|
||||
/* weighted_pred_flag equal to 0 specifies that the default weighted
|
||||
prediction shall be applied to P and SP slices.
|
||||
weighted_pred_flag equal to 1 specifies that explicit weighted prediction
|
||||
shall be applied to P and SP slices.weighted_pred_flag 1 */
|
||||
bool weighted_pred_flag;
|
||||
|
||||
/* weighted_bipred_idc equal to 0 specifies that the default weighted
|
||||
prediction shall be applied to B slices.
|
||||
weighted_bipred_idc equal to 1 specifies that explicit weighted prediction
|
||||
shall be applied to B slices. weighted_bipred_idc equal to 2 specifies that
|
||||
implicit weighted prediction shall be applied to B slices. The value of
|
||||
weighted_bipred_idc shall be in the range of 0 to 2, inclusive. */
|
||||
uint8_t weighted_bipred_idc;
|
||||
|
||||
/* pic_init_qp_minus26 specifies the initial value minus 26 of SliceQP Y for
|
||||
each slice. The initial value is modified at the slice layer when a
|
||||
non-zero value of slice_qp_delta is decoded, and is modified further when a
|
||||
non-zero value of mb_qp_delta is decoded at the macroblock layer.
|
||||
The value of pic_init_qp_minus26 shall be in the range of
|
||||
−(26 + QpBdOffset Y ) to +25, inclusive. */
|
||||
int8_t pic_init_qp_minus26;
|
||||
|
||||
/* pic_init_qs_minus26 specifies the initial value minus 26 of SliceQS Y for
|
||||
all macroblocks in SP or SI slices. The initial value is modified at the
|
||||
slice layer when a non-zero value of slice_qs_delta is decoded.
|
||||
The value of pic_init_qs_minus26 shall be in the range of −26 to +25,
|
||||
inclusive. */
|
||||
int8_t pic_init_qs_minus26;
|
||||
|
||||
/* chroma_qp_index_offset specifies the offset that shall be added to QP Y and
|
||||
QS Y for addressing the table of QP C values for the Cb chroma component.
|
||||
The value of chroma_qp_index_offset shall be in the range of −12 to +12,
|
||||
inclusive. */
|
||||
int8_t chroma_qp_index_offset;
|
||||
|
||||
/* deblocking_filter_control_present_flag equal to 1 specifies that a set of
|
||||
syntax elements controlling the characteristics of the deblocking filter is
|
||||
present in the slice header. deblocking_filter_control_present_flag equal to
|
||||
0 specifies that the set of syntax elements controlling the characteristics
|
||||
of the deblocking filter is not present in the slice headers and their
|
||||
inferred values are in effect. */
|
||||
bool deblocking_filter_control_present_flag;
|
||||
|
||||
/* constrained_intra_pred_flag equal to 0 specifies that intra prediction
|
||||
allows usage of residual data and decoded samples of neighbouring
|
||||
macroblocks coded using Inter macroblock prediction modes for the prediction
|
||||
of macroblocks coded using Intra macroblock prediction modes.
|
||||
constrained_intra_pred_flag equal to 1 specifies constrained intra
|
||||
prediction, in which case prediction of macroblocks coded using Intra
|
||||
macroblock prediction modes only uses residual data and decoded samples from
|
||||
I or SI macroblock types. */
|
||||
bool constrained_intra_pred_flag;
|
||||
|
||||
/* redundant_pic_cnt_present_flag equal to 0 specifies that the
|
||||
redundant_pic_cnt syntax element is not present in slice headers, coded
|
||||
slice data partition B NAL units, and coded slice data partition C NAL units
|
||||
that refer (either directly or by association with a corresponding coded
|
||||
slice data partition A NAL unit) to the picture parameter set.
|
||||
redundant_pic_cnt_present_flag equal to 1 specifies that the
|
||||
redundant_pic_cnt syntax element is present in all slice headers, coded
|
||||
slice data partition B NAL units, and coded slice data partition C NAL units
|
||||
that refer (either directly or by association with a corresponding coded
|
||||
slice data partition A NAL unit) to the picture parameter set. */
|
||||
bool redundant_pic_cnt_present_flag;
|
||||
|
||||
/* transform_8x8_mode_flag equal to 1 specifies that the 8x8 transform
|
||||
decoding process may be in use (see clause 8.5).
|
||||
transform_8x8_mode_flag equal to 0 specifies that the 8x8 transform decoding
|
||||
process is not in use. When transform_8x8_mode_flag is not present, it shall
|
||||
be inferred to be 0. */
|
||||
bool transform_8x8_mode_flag;
|
||||
|
||||
/* second_chroma_qp_index_offset specifies the offset that shall be added to
|
||||
QP Y and QS Y for addressing the table of QP C values for the Cr chroma
|
||||
component.
|
||||
The value of second_chroma_qp_index_offset shall be in the range of
|
||||
−12 to +12, inclusive.
|
||||
When second_chroma_qp_index_offset is not present, it shall be inferred to
|
||||
be equal to chroma_qp_index_offset. */
|
||||
int8_t second_chroma_qp_index_offset;
|
||||
|
||||
uint8_t scaling_matrix4x4[6][16];
|
||||
uint8_t scaling_matrix8x8[6][64];
|
||||
|
||||
PPSData();
|
||||
};
|
||||
|
||||
class H264
|
||||
{
|
||||
public:
|
||||
static bool DecodeSPSFromExtraData(const mozilla::MediaByteBuffer* aExtraData, SPSData& aDest);
|
||||
static bool DecodeSPSFromExtraData(const mozilla::MediaByteBuffer* aExtraData,
|
||||
SPSData& aDest);
|
||||
|
||||
/* Extract RAW BYTE SEQUENCE PAYLOAD from NAL content.
|
||||
Returns nullptr if invalid content.
|
||||
This is compliant to ITU H.264 7.3.1 Syntax in tabular form NAL unit syntax
|
||||
*/
|
||||
static already_AddRefed<mozilla::MediaByteBuffer> DecodeNALUnit(const mozilla::MediaByteBuffer* aNAL);
|
||||
|
||||
/* Decode SPS NAL RBSP and fill SPSData structure */
|
||||
static bool DecodeSPS(const mozilla::MediaByteBuffer* aSPS, SPSData& aDest);
|
||||
static already_AddRefed<mozilla::MediaByteBuffer> DecodeNALUnit(
|
||||
const mozilla::MediaByteBuffer* aNAL);
|
||||
|
||||
// Ensure that SPS data makes sense, Return true if SPS data was, and false
|
||||
// otherwise. If false, then content will be adjusted accordingly.
|
||||
static bool EnsureSPSIsSane(SPSData& aSPS);
|
||||
|
||||
static bool DecodePPSFromExtraData(const mozilla::MediaByteBuffer* aExtraData,
|
||||
const SPSData& aSPS, PPSData& aDest);
|
||||
|
||||
// If the given aExtraData is valid, return the aExtraData.max_num_ref_frames
|
||||
// clamped to be in the range of [4, 16]; otherwise return 4.
|
||||
static uint32_t ComputeMaxRefFrames(const mozilla::MediaByteBuffer* aExtraData);
|
||||
static uint32_t ComputeMaxRefFrames(
|
||||
const mozilla::MediaByteBuffer* aExtraData);
|
||||
|
||||
enum class FrameType
|
||||
{
|
||||
@ -361,7 +596,20 @@ public:
|
||||
// (Instantaneous Decoding Refresh) Picture.
|
||||
static FrameType GetFrameType(const mozilla::MediaRawData* aSample);
|
||||
|
||||
// ZigZag index taBles.
|
||||
// Some hardware requires the tables to be in zigzag order.
|
||||
// Use ZZ_SCAN table for the scaling_matrix4x4.
|
||||
// Use ZZ_SCAN8 table for the scaling_matrix8x8.
|
||||
// e.g. dest_scaling_matrix4x4[i,j] = scaling_matrix4x4[ZZ_SCAN(i,j)]
|
||||
static const uint8_t ZZ_SCAN[16];
|
||||
static const uint8_t ZZ_SCAN8[64];
|
||||
|
||||
private:
|
||||
/* Decode SPS NAL RBSP and fill SPSData structure */
|
||||
static bool DecodeSPS(const mozilla::MediaByteBuffer* aSPS, SPSData& aDest);
|
||||
/* Decode PPS NAL RBSP and fill PPSData structure */
|
||||
static bool DecodePPS(const mozilla::MediaByteBuffer* aPPS, const SPSData& aSPS,
|
||||
PPSData& aDest);
|
||||
static void vui_parameters(BitReader& aBr, SPSData& aDest);
|
||||
// Read HRD parameters, all data is ignored.
|
||||
static void hrd_parameters(BitReader& aBr);
|
||||
|
@ -614,6 +614,10 @@ pref("media.cache_readahead_limit", 30);
|
||||
// chronically starved of video frames. All decoders seen so far have a value
|
||||
// of at least 4.
|
||||
pref("media.video-queue.default-size", 3);
|
||||
// The maximum number of queued frames to send to the compositor.
|
||||
// On Android, it needs to be throttled because SurfaceTexture contains only one
|
||||
// (the most recent) image data.
|
||||
pref("media.video-queue.send-to-compositor-size", 1);
|
||||
|
||||
#ifdef NIGHTLY_BUILD
|
||||
// Allow to check if the decoder supports recycling only on Fennec nightly build.
|
||||
|
@ -23,5 +23,5 @@ interface ICodec {
|
||||
Sample dequeueInput(int size);
|
||||
oneway void queueInput(in Sample sample);
|
||||
|
||||
oneway void releaseOutput(in Sample sample);
|
||||
oneway void releaseOutput(in Sample sample, in boolean render);
|
||||
}
|
||||
|
@ -18,7 +18,6 @@ import android.view.Surface;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.LinkedList;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
@ -28,33 +27,17 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
public enum Error {
|
||||
DECODE, FATAL
|
||||
};
|
||||
}
|
||||
|
||||
private final class Callbacks implements AsyncCodec.Callbacks {
|
||||
private ICodecCallbacks mRemote;
|
||||
private boolean mHasInputCapacitySet;
|
||||
private boolean mHasOutputCapacitySet;
|
||||
|
||||
public Callbacks(ICodecCallbacks remote) {
|
||||
mRemote = remote;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInputBufferAvailable(AsyncCodec codec, int index) {
|
||||
if (mFlushing) {
|
||||
// Flush invalidates all buffers.
|
||||
return;
|
||||
}
|
||||
if (!mHasInputCapacitySet) {
|
||||
int capacity = codec.getInputBuffer(index).capacity();
|
||||
if (capacity > 0) {
|
||||
mSamplePool.setInputBufferSize(capacity);
|
||||
mHasInputCapacitySet = true;
|
||||
}
|
||||
}
|
||||
if (!mInputProcessor.onBuffer(index)) {
|
||||
reportError(Error.FATAL, new Exception("FAIL: input buffer queue is full"));
|
||||
}
|
||||
|
||||
mInputProcessor.onBuffer(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -63,47 +46,8 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
// Flush invalidates all buffers.
|
||||
return;
|
||||
}
|
||||
ByteBuffer output = codec.getOutputBuffer(index);
|
||||
if (!mHasOutputCapacitySet) {
|
||||
int capacity = output.capacity();
|
||||
if (capacity > 0) {
|
||||
mSamplePool.setOutputBufferSize(capacity);
|
||||
mHasOutputCapacitySet = true;
|
||||
}
|
||||
}
|
||||
Sample copy = mSamplePool.obtainOutput(info);
|
||||
try {
|
||||
if (info.size > 0) {
|
||||
copy.buffer.readFromByteBuffer(output, info.offset, info.size);
|
||||
}
|
||||
mSentOutputs.add(copy);
|
||||
mRemote.onOutput(copy);
|
||||
} catch (IOException e) {
|
||||
Log.e(LOGTAG, "Fail to read output buffer:" + e.getMessage());
|
||||
outputDummy(info);
|
||||
} catch (TransactionTooLargeException ttle) {
|
||||
Log.e(LOGTAG, "Output is too large:" + ttle.getMessage());
|
||||
outputDummy(info);
|
||||
} catch (RemoteException e) {
|
||||
// Dead recipient.
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
mCodec.releaseOutputBuffer(index, true);
|
||||
boolean eos = (info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0;
|
||||
if (DEBUG && eos) {
|
||||
Log.d(LOGTAG, "output EOS");
|
||||
}
|
||||
}
|
||||
|
||||
private void outputDummy(MediaCodec.BufferInfo info) {
|
||||
try {
|
||||
if (DEBUG) Log.d(LOGTAG, "return dummy sample");
|
||||
mRemote.onOutput(Sample.create(null, info, null));
|
||||
} catch (RemoteException e) {
|
||||
// Dead recipient.
|
||||
e.printStackTrace();
|
||||
}
|
||||
mOutputProcessor.onBuffer(index, info);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -113,19 +57,15 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
@Override
|
||||
public void onOutputFormatChanged(AsyncCodec codec, MediaFormat format) {
|
||||
try {
|
||||
mRemote.onOutputFormatChanged(new FormatParam(format));
|
||||
} catch (RemoteException re) {
|
||||
// Dead recipient.
|
||||
re.printStackTrace();
|
||||
}
|
||||
mOutputProcessor.onFormatChanged(format);
|
||||
}
|
||||
}
|
||||
|
||||
private final class InputProcessor {
|
||||
private Queue<Sample> mInputSamples = new LinkedList<>();
|
||||
private boolean mHasInputCapacitySet;
|
||||
private Queue<Integer> mAvailableInputBuffers = new LinkedList<>();
|
||||
private Queue<Sample> mDequeuedSamples = new LinkedList<>();
|
||||
private Queue<Sample> mInputSamples = new LinkedList<>();
|
||||
|
||||
private synchronized Sample onAllocate(int size) {
|
||||
Sample sample = mSamplePool.obtainInput(size);
|
||||
@ -133,9 +73,10 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
return sample;
|
||||
}
|
||||
|
||||
private synchronized boolean onSample(Sample sample) {
|
||||
private synchronized void onSample(Sample sample) {
|
||||
if (sample == null) {
|
||||
return false;
|
||||
Log.w(LOGTAG, "WARN: null input sample");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!sample.isEOS()) {
|
||||
@ -146,19 +87,28 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
temp.dispose();
|
||||
}
|
||||
|
||||
if (!mInputSamples.offer(sample)) {
|
||||
return false;
|
||||
if (mInputSamples.offer(sample)) {
|
||||
feedSampleToBuffer();
|
||||
} else {
|
||||
reportError(Error.FATAL, new Exception("FAIL: input sample queue is full"));
|
||||
}
|
||||
feedSampleToBuffer();
|
||||
return true;
|
||||
}
|
||||
|
||||
private synchronized boolean onBuffer(int index) {
|
||||
if (!mAvailableInputBuffers.offer(index)) {
|
||||
return false;
|
||||
private synchronized void onBuffer(int index) {
|
||||
if (!mHasInputCapacitySet) {
|
||||
int capacity = mCodec.getInputBuffer(index).capacity();
|
||||
if (capacity > 0) {
|
||||
mSamplePool.setInputBufferSize(capacity);
|
||||
mHasInputCapacitySet = true;
|
||||
}
|
||||
}
|
||||
feedSampleToBuffer();
|
||||
return true;
|
||||
|
||||
if (mAvailableInputBuffers.offer(index)) {
|
||||
feedSampleToBuffer();
|
||||
} else {
|
||||
reportError(Error.FATAL, new Exception("FAIL: input buffer queue is full"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void feedSampleToBuffer() {
|
||||
@ -192,14 +142,108 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
}
|
||||
|
||||
private synchronized void reset() {
|
||||
for (Sample s : mInputSamples) {
|
||||
mSamplePool.recycleInput(s);
|
||||
}
|
||||
mInputSamples.clear();
|
||||
|
||||
for (Sample s : mDequeuedSamples) {
|
||||
mSamplePool.recycleInput(s);
|
||||
}
|
||||
mDequeuedSamples.clear();
|
||||
|
||||
mAvailableInputBuffers.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class OutputProcessor {
|
||||
private boolean mHasOutputCapacitySet;
|
||||
private Queue<Integer> mSentIndices = new LinkedList<>();
|
||||
private Queue<Sample> mSentOutputs = new LinkedList<>();
|
||||
|
||||
|
||||
private synchronized void onBuffer(int index, MediaCodec.BufferInfo info) {
|
||||
ByteBuffer output = mCodec.getOutputBuffer(index);
|
||||
if (!mHasOutputCapacitySet) {
|
||||
int capacity = output.capacity();
|
||||
if (capacity > 0) {
|
||||
mSamplePool.setOutputBufferSize(capacity);
|
||||
mHasOutputCapacitySet = true;
|
||||
}
|
||||
}
|
||||
Sample copy = mSamplePool.obtainOutput(info);
|
||||
try {
|
||||
if (info.size > 0) {
|
||||
copy.buffer.readFromByteBuffer(output, info.offset, info.size);
|
||||
}
|
||||
mSentIndices.add(index);
|
||||
mSentOutputs.add(copy);
|
||||
mCallbacks.onOutput(copy);
|
||||
} catch (IOException e) {
|
||||
Log.e(LOGTAG, "Fail to read output buffer:" + e.getMessage());
|
||||
outputDummy(info);
|
||||
} catch (TransactionTooLargeException ttle) {
|
||||
Log.e(LOGTAG, "Output is too large:" + ttle.getMessage());
|
||||
outputDummy(info);
|
||||
} catch (RemoteException e) {
|
||||
// Dead recipient.
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
boolean eos = (info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0;
|
||||
if (DEBUG && eos) {
|
||||
Log.d(LOGTAG, "output EOS");
|
||||
}
|
||||
}
|
||||
|
||||
private void outputDummy(MediaCodec.BufferInfo info) {
|
||||
try {
|
||||
if (DEBUG) Log.d(LOGTAG, "return dummy sample");
|
||||
mCallbacks.onOutput(Sample.create(null, info, null));
|
||||
} catch (RemoteException e) {
|
||||
// Dead recipient.
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized void onRelease(Sample sample, boolean render) {
|
||||
Integer i = mSentIndices.poll();
|
||||
Sample output = mSentOutputs.poll();
|
||||
if (i == null || output == null) {
|
||||
Log.d(LOGTAG, "output buffer#" + i + "(" + output + ")" + ": " + sample + " already released");
|
||||
return;
|
||||
}
|
||||
mCodec.releaseOutputBuffer(i, render);
|
||||
mSamplePool.recycleOutput(output);
|
||||
|
||||
sample.dispose();
|
||||
}
|
||||
|
||||
private void onFormatChanged(MediaFormat format) {
|
||||
try {
|
||||
mCallbacks.onOutputFormatChanged(new FormatParam(format));
|
||||
} catch (RemoteException re) {
|
||||
// Dead recipient.
|
||||
re.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized void reset() {
|
||||
for (int i : mSentIndices) {
|
||||
mCodec.releaseOutputBuffer(i, false);
|
||||
}
|
||||
mSentIndices.clear();
|
||||
for (Sample s : mSentOutputs) {
|
||||
mSamplePool.recycleOutput(s);
|
||||
}
|
||||
mSentOutputs.clear();
|
||||
}
|
||||
}
|
||||
|
||||
private volatile ICodecCallbacks mCallbacks;
|
||||
private AsyncCodec mCodec;
|
||||
private InputProcessor mInputProcessor;
|
||||
private OutputProcessor mOutputProcessor;
|
||||
private volatile boolean mFlushing = false;
|
||||
private SamplePool mSamplePool;
|
||||
private Queue<Sample> mSentOutputs = new ConcurrentLinkedQueue<>();
|
||||
@ -255,7 +299,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
Log.d(LOGTAG, "configure mediacodec with crypto(" + hasCrypto + ") / Id :" + drmStubId);
|
||||
}
|
||||
|
||||
codec.setCallbacks(new Callbacks(mCallbacks), null);
|
||||
codec.setCallbacks(new Callbacks(), null);
|
||||
|
||||
// Video decoder should config with adaptive playback capability.
|
||||
if (surface != null) {
|
||||
@ -272,6 +316,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
codec.configure(fmt, surface, crypto, flags);
|
||||
mCodec = codec;
|
||||
mInputProcessor = new InputProcessor();
|
||||
mOutputProcessor = new OutputProcessor();
|
||||
mSamplePool = new SamplePool(codecName);
|
||||
if (DEBUG) Log.d(LOGTAG, codec.toString() + " created");
|
||||
return true;
|
||||
@ -289,6 +334,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
private void releaseCodec() {
|
||||
mInputProcessor.reset();
|
||||
mOutputProcessor.reset();
|
||||
try {
|
||||
mCodec.release();
|
||||
} catch (Exception e) {
|
||||
@ -358,6 +404,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
mFlushing = true;
|
||||
if (DEBUG) Log.d(LOGTAG, "flush " + this);
|
||||
mInputProcessor.reset();
|
||||
mOutputProcessor.reset();
|
||||
try {
|
||||
mCodec.flush();
|
||||
} catch (Exception e) {
|
||||
@ -375,20 +422,12 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
@Override
|
||||
public synchronized void queueInput(Sample sample) throws RemoteException {
|
||||
if (!mInputProcessor.onSample(sample)) {
|
||||
reportError(Error.FATAL, new Exception("FAIL: input sample queue is full"));
|
||||
}
|
||||
mInputProcessor.onSample(sample);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void releaseOutput(Sample sample) {
|
||||
try {
|
||||
mSamplePool.recycleOutput(mSentOutputs.remove());
|
||||
} catch (Exception e) {
|
||||
Log.e(LOGTAG, "failed to release output:" + sample);
|
||||
e.printStackTrace();
|
||||
}
|
||||
sample.dispose();
|
||||
public synchronized void releaseOutput(Sample sample, boolean render) {
|
||||
mOutputProcessor.onRelease(sample, render);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -18,6 +18,8 @@ import org.mozilla.gecko.mozglue.JNIObject;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
// Proxy class of ICodec binder.
|
||||
public final class CodecProxy {
|
||||
@ -29,6 +31,7 @@ public final class CodecProxy {
|
||||
private Surface mOutputSurface;
|
||||
private CallbacksForwarder mCallbacks;
|
||||
private String mRemoteDrmStubId;
|
||||
private Queue<Sample> mSurfaceOutputs = new ConcurrentLinkedQueue<>();
|
||||
|
||||
public interface Callbacks {
|
||||
void onInputExhausted();
|
||||
@ -67,9 +70,18 @@ public final class CodecProxy {
|
||||
|
||||
@Override
|
||||
public void onOutput(Sample sample) throws RemoteException {
|
||||
mCallbacks.onOutput(sample);
|
||||
mRemote.releaseOutput(sample);
|
||||
sample.dispose();
|
||||
if (mOutputSurface != null) {
|
||||
// Don't render to surface just yet. Callback will make that happen when it's time.
|
||||
if (!sample.isEOS() || sample.info.size > 0) {
|
||||
mSurfaceOutputs.offer(sample);
|
||||
}
|
||||
mCallbacks.onOutput(sample);
|
||||
} else {
|
||||
// Non-surface output needs no rendering.
|
||||
mCallbacks.onOutput(sample);
|
||||
mRemote.releaseOutput(sample, false);
|
||||
sample.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -77,7 +89,7 @@ public final class CodecProxy {
|
||||
reportError(fatal);
|
||||
}
|
||||
|
||||
public void reportError(boolean fatal) {
|
||||
private void reportError(boolean fatal) {
|
||||
mCallbacks.onError(fatal);
|
||||
}
|
||||
}
|
||||
@ -196,6 +208,21 @@ public final class CodecProxy {
|
||||
return true;
|
||||
}
|
||||
if (DEBUG) Log.d(LOGTAG, "release " + this);
|
||||
|
||||
if (!mSurfaceOutputs.isEmpty()) {
|
||||
// Flushing output buffers to surface may cause some frames to be skipped and
|
||||
// should not happen unless caller release codec before processing all buffers.
|
||||
Log.w(LOGTAG, "release codec when " + mSurfaceOutputs.size() + " output buffers unhandled");
|
||||
try {
|
||||
for (Sample s : mSurfaceOutputs) {
|
||||
mRemote.releaseOutput(s, true);
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
mSurfaceOutputs.clear();
|
||||
}
|
||||
|
||||
try {
|
||||
RemoteManager.getInstance().releaseCodec(this);
|
||||
} catch (DeadObjectException e) {
|
||||
@ -207,7 +234,32 @@ public final class CodecProxy {
|
||||
return true;
|
||||
}
|
||||
|
||||
public synchronized void reportError(boolean fatal) {
|
||||
@WrapForJNI
|
||||
public synchronized boolean releaseOutput(Sample sample, boolean render) {
|
||||
if (!mSurfaceOutputs.remove(sample)) {
|
||||
if (mRemote != null) Log.w(LOGTAG, "already released: " + sample);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mRemote == null) {
|
||||
Log.w(LOGTAG, "codec already ended");
|
||||
sample.dispose();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (DEBUG && !render) Log.d(LOGTAG, "drop output:" + sample.info.presentationTimeUs);
|
||||
|
||||
try {
|
||||
mRemote.releaseOutput(sample, render);
|
||||
} catch (RemoteException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
sample.dispose();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* package */ synchronized void reportError(boolean fatal) {
|
||||
mCallbacks.reportError(fatal);
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ from ..frontend.data import (
|
||||
FinalTargetPreprocessedFiles,
|
||||
GeneratedFile,
|
||||
HostDefines,
|
||||
ObjdirPreprocessedFiles,
|
||||
ObjdirFiles,
|
||||
)
|
||||
from ..util import (
|
||||
FileAvoidWrite,
|
||||
@ -187,8 +187,6 @@ class TupOnly(CommonBackend, PartialBackend):
|
||||
self._process_final_target_files(obj)
|
||||
elif isinstance(obj, FinalTargetPreprocessedFiles):
|
||||
self._process_final_target_pp_files(obj, backend_file)
|
||||
elif isinstance(obj, ObjdirPreprocessedFiles):
|
||||
self._process_final_target_pp_files(obj, backend_file)
|
||||
|
||||
return True
|
||||
|
||||
@ -245,6 +243,7 @@ class TupOnly(CommonBackend, PartialBackend):
|
||||
])
|
||||
full_inputs = [f.full_path for f in obj.inputs]
|
||||
cmd.extend(full_inputs)
|
||||
cmd.extend(shell_quote(f) for f in obj.flags)
|
||||
|
||||
outputs = []
|
||||
outputs.extend(obj.outputs)
|
||||
@ -267,24 +266,22 @@ class TupOnly(CommonBackend, PartialBackend):
|
||||
|
||||
def _process_final_target_files(self, obj):
|
||||
target = obj.install_target
|
||||
path = mozpath.basedir(target, (
|
||||
'dist/bin',
|
||||
'dist/xpi-stage',
|
||||
'_tests',
|
||||
'dist/include',
|
||||
'dist/branding',
|
||||
'dist/sdk',
|
||||
))
|
||||
if not path:
|
||||
raise Exception("Cannot install to " + target)
|
||||
|
||||
reltarget = mozpath.relpath(target, path)
|
||||
if not isinstance(obj, ObjdirFiles):
|
||||
path = mozpath.basedir(target, (
|
||||
'dist/bin',
|
||||
'dist/xpi-stage',
|
||||
'_tests',
|
||||
'dist/include',
|
||||
'dist/branding',
|
||||
'dist/sdk',
|
||||
))
|
||||
if not path:
|
||||
raise Exception("Cannot install to " + target)
|
||||
|
||||
for path, files in obj.files.walk():
|
||||
backend_file = self._get_backend_file(mozpath.join(target, path))
|
||||
for f in files:
|
||||
assert not isinstance(f, RenamedSourcePath)
|
||||
dest = mozpath.join(reltarget, path, f.target_basename)
|
||||
if not isinstance(f, ObjDirPath):
|
||||
if '*' in f:
|
||||
if f.startswith('/') or isinstance(f, AbsolutePath):
|
||||
|
@ -1149,4 +1149,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
||||
|
||||
static const int32_t kUnknownId = -1;
|
||||
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1489505883092000);
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1489674148138000);
|
||||
|
@ -25,6 +25,7 @@
|
||||
360gradus.com: did not receive HSTS header
|
||||
365.or.jp: did not receive HSTS header
|
||||
3chit.cf: could not connect to host
|
||||
404.sh: max-age too low: 0
|
||||
420dongstorm.com: could not connect to host
|
||||
42ms.org: could not connect to host
|
||||
4455software.com: did not receive HSTS header
|
||||
@ -53,7 +54,6 @@ aaeblog.org: did not receive HSTS header
|
||||
aapp.space: could not connect to host
|
||||
abearofsoap.com: did not receive HSTS header
|
||||
abecodes.net: did not receive HSTS header
|
||||
abeestrada.com: did not receive HSTS header
|
||||
abilitylist.org: did not receive HSTS header
|
||||
abioniere.de: could not connect to host
|
||||
about.ge: could not connect to host
|
||||
@ -179,6 +179,7 @@ ancientkarma.com: could not connect to host
|
||||
andere-gedanken.net: max-age too low: 10
|
||||
andreasbreitenlohner.de: did not receive HSTS header
|
||||
andreasolsson.se: could not connect to host
|
||||
andreastoneman.com: could not connect to host
|
||||
andreigec.net: did not receive HSTS header
|
||||
andrewmichaud.beer: could not connect to host
|
||||
andreypopp.com: could not connect to host
|
||||
@ -215,7 +216,6 @@ aojiao.org: did not receive HSTS header
|
||||
aosc.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
apachelounge.com: did not receive HSTS header
|
||||
apeasternpower.com: max-age too low: 0
|
||||
apervita.net: could not connect to host
|
||||
api.lookout.com: could not connect to host
|
||||
api.mega.co.nz: could not connect to host
|
||||
apibot.de: could not connect to host
|
||||
@ -251,6 +251,7 @@ ars.toscana.it: max-age too low: 0
|
||||
artegusto.ru: could not connect to host
|
||||
artistnetwork.nl: did not receive HSTS header
|
||||
arturkohut.com: could not connect to host
|
||||
arvamus.eu: could not connect to host
|
||||
as.se: could not connect to host
|
||||
as9178.net: could not connect to host
|
||||
asandu.eu: could not connect to host
|
||||
@ -275,7 +276,6 @@ atbeckett.com: did not receive HSTS header
|
||||
athaliasoft.com: did not receive HSTS header
|
||||
athenelive.com: could not connect to host
|
||||
athul.xyz: did not receive HSTS header
|
||||
atlantischild.hu: could not connect to host
|
||||
atlex.nl: did not receive HSTS header
|
||||
atomik.pro: could not connect to host
|
||||
atop.io: could not connect to host
|
||||
@ -298,8 +298,8 @@ autokovrik-diskont.ru: did not receive HSTS header
|
||||
autotsum.com: could not connect to host
|
||||
autumnwindsagility.com: could not connect to host
|
||||
auverbox.ovh: did not receive HSTS header
|
||||
auxiliumincrementum.co.uk: did not receive HSTS header
|
||||
av.de: did not receive HSTS header
|
||||
avantmfg.com: could not connect to host
|
||||
avec-ou-sans-ordonnance.fr: could not connect to host
|
||||
avinet.com: max-age too low: 0
|
||||
awg-mode.de: did not receive HSTS header
|
||||
@ -307,6 +307,7 @@ axado.com.br: did not receive HSTS header
|
||||
axeny.com: did not receive HSTS header
|
||||
az.search.yahoo.com: did not receive HSTS header
|
||||
azprep.us: could not connect to host
|
||||
azuxul.fr: could not connect to host
|
||||
b3orion.com: max-age too low: 0
|
||||
babak.de: did not receive HSTS header
|
||||
baby-click.de: did not receive HSTS header
|
||||
@ -372,6 +373,7 @@ betnet.fr: could not connect to host
|
||||
betplanning.it: did not receive HSTS header
|
||||
bets.de: did not receive HSTS header
|
||||
bettercrypto.org: could not connect to host
|
||||
bettertest.it: could not connect to host
|
||||
bettween.com: could not connect to host
|
||||
betz.ro: did not receive HSTS header
|
||||
beulahtabernacle.com: could not connect to host
|
||||
@ -449,7 +451,6 @@ bodyweightsolution.com: did not receive HSTS header
|
||||
boensou.com: did not receive HSTS header
|
||||
bogosity.se: could not connect to host
|
||||
bohan.life: did not receive HSTS header
|
||||
boltdata.io: did not receive HSTS header
|
||||
bonapp.restaurant: could not connect to host
|
||||
bonfi.net: did not receive HSTS header
|
||||
bonigo.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]
|
||||
@ -478,7 +479,6 @@ brandnewdays.nl: could not connect to host
|
||||
brandon.so: could not connect to host
|
||||
brandred.net: did not receive HSTS header
|
||||
brandspray.com: did not receive HSTS header
|
||||
brewtrackr.com: could not connect to host
|
||||
brianmwaters.net: could not connect to host
|
||||
brickoo.com: could not connect to host
|
||||
brideandgroomdirect.ie: did not receive HSTS header
|
||||
@ -523,7 +523,6 @@ bypro.xyz: could not connect to host
|
||||
bysymphony.com: max-age too low: 0
|
||||
byte.wtf: could not connect to host
|
||||
bytepark.de: did not receive HSTS header
|
||||
bytesystems.com: could not connect to host
|
||||
c1yd3i.me: could not connect to host
|
||||
c3b.info: could not connect to host
|
||||
cabarave.com: could not connect to host
|
||||
@ -667,11 +666,11 @@ clouddesktop.co.nz: could not connect to host
|
||||
cloudey.net: did not receive HSTS header
|
||||
cloudflare.com: did not receive HSTS header
|
||||
cloudimag.es: could not connect to host
|
||||
cloudlink.club: could not connect to host
|
||||
cloudns.com.au: could not connect to host
|
||||
cloudstoragemaus.com: could not connect to host
|
||||
cloudwalk.io: did not receive HSTS header
|
||||
cloverleaf.net: max-age too low: 0
|
||||
clubmate.rocks: could not connect to host
|
||||
clywedogmaths.co.uk: could not connect to host
|
||||
cmacacias.ch: did not receive HSTS header
|
||||
cmc-versand.de: did not receive HSTS header
|
||||
@ -691,7 +690,6 @@ codabix.net: could not connect to host
|
||||
code.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
codeco.pw: could not connect to host
|
||||
codeforce.io: did not receive HSTS header
|
||||
codepult.com: could not connect to host
|
||||
codepx.com: did not receive HSTS header
|
||||
codiva.io: max-age too low: 2592000
|
||||
coffeeetc.co.uk: did not receive HSTS header
|
||||
@ -728,7 +726,6 @@ continuumgaming.com: could not connect to host
|
||||
controlcenter.gigahost.dk: did not receive HSTS header
|
||||
coolchevy.org.ua: could not connect to host
|
||||
coralproject.net: did not receive HSTS header
|
||||
coralrosado.com.br: could not connect to host
|
||||
cordial-restaurant.com: did not receive HSTS header
|
||||
core.mx: could not connect to host
|
||||
core4system.de: did not receive HSTS header
|
||||
@ -758,7 +755,6 @@ crazyhotseeds.com: did not receive HSTS header
|
||||
create-test-publish.co.uk: could not connect to host
|
||||
creativephysics.ml: could not connect to host
|
||||
creativeplayuk.com: did not receive HSTS header
|
||||
creep.im: could not connect to host
|
||||
crendontech.com: could not connect to host
|
||||
crestoncottage.com: could not connect to host
|
||||
criena.net: could not connect to host
|
||||
@ -806,7 +802,6 @@ cydia-search.io: could not connect to host
|
||||
cyphertite.com: could not connect to host
|
||||
czechamlp.com: could not connect to host
|
||||
d3xt3r01.tk: could not connect to host
|
||||
d42.no: could not connect to host
|
||||
dad256.tk: could not connect to host
|
||||
dah5.com: did not receive HSTS header
|
||||
dailystormerpodcasts.com: did not receive HSTS header
|
||||
@ -827,6 +822,7 @@ darkengine.io: could not connect to host
|
||||
darkhole.cn: could not connect to host
|
||||
darknebula.space: could not connect to host
|
||||
darkpony.ru: could not connect to host
|
||||
darksideof.it: could not connect to host
|
||||
dashburst.com: did not receive HSTS header
|
||||
dashnimorad.com: did not receive HSTS header
|
||||
data-abundance.com: could not connect to host
|
||||
@ -847,6 +843,7 @@ datewon.net: did not receive HSTS header
|
||||
davidglidden.eu: could not connect to host
|
||||
davidhunter.scot: did not receive HSTS header
|
||||
davidmessenger.co.uk: could not connect to host
|
||||
davidnoren.com: did not receive HSTS header
|
||||
davidreinhardt.de: could not connect to host
|
||||
davidscherzer.at: could not connect to host
|
||||
daylightcompany.com: did not receive HSTS header
|
||||
@ -854,7 +851,7 @@ db.gy: did not receive HSTS header
|
||||
dbx.ovh: did not receive HSTS header
|
||||
dccode.gov: could not connect to host
|
||||
dcurt.is: did not receive HSTS header
|
||||
ddatsh.com: did not receive HSTS header
|
||||
ddatsh.com: could not connect to host
|
||||
dden.ca: could not connect to host
|
||||
debank.tv: did not receive HSTS header
|
||||
debatch.se: could not connect to host
|
||||
@ -873,7 +870,6 @@ delayrefunds.co.uk: could not connect to host
|
||||
deliverance.co.uk: could not connect to host
|
||||
deltaconcepts.de: did not receive HSTS header
|
||||
deltanet-production.de: did not receive HSTS header
|
||||
demdis.org: could not connect to host
|
||||
demilitarized.ninja: could not connect to host
|
||||
democracychronicles.com: did not receive HSTS header
|
||||
denh.am: did not receive HSTS header
|
||||
@ -919,6 +915,8 @@ dizorg.net: could not connect to host
|
||||
dj4et.de: did not receive HSTS header
|
||||
dl.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
dlouwrink.nl: could not connect to host
|
||||
dmarc.dk: did not receive HSTS header
|
||||
dmi.es: could not connect to host
|
||||
dmxledlights.com: could not connect to host
|
||||
dn42.eu: could not connect to host
|
||||
dns.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
@ -946,7 +944,6 @@ doridian.de: could not connect to host
|
||||
doridian.net: did not receive HSTS header
|
||||
doridian.org: could not connect to host
|
||||
dossplumbing.co.za: did not receive HSTS header
|
||||
dot42.no: could not connect to host
|
||||
dotadata.me: could not connect to host
|
||||
dougferris.id.au: could not connect to host
|
||||
download.jitsi.org: did not receive HSTS header
|
||||
@ -958,6 +955,7 @@ dragonisles.net: could not connect to host
|
||||
dragons-of-highlands.cz: could not connect to host
|
||||
dragontrainingmobilezoo.com.au: max-age too low: 0
|
||||
draw.uy: could not connect to host
|
||||
drawingcode.net: could not connect to host
|
||||
drbethanybarnes.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
drdevil.ru: could not connect to host
|
||||
drdim.ru: could not connect to host
|
||||
@ -978,6 +976,7 @@ duesee.org: could not connect to host
|
||||
dullsir.com: did not receive HSTS header
|
||||
duria.de: max-age too low: 3600
|
||||
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]
|
||||
dworzak.ch: could not connect to host
|
||||
dxa.io: could not connect to host
|
||||
dycontrol.de: could not connect to host
|
||||
dylanscott.com.au: did not receive HSTS header
|
||||
@ -1013,7 +1012,6 @@ edk.com.tr: did not receive HSTS header
|
||||
edmodo.com: did not receive HSTS header
|
||||
edp-collaborative.com: max-age too low: 2500
|
||||
eduvance.in: did not receive HSTS header
|
||||
edwards.me.uk: could not connect to host
|
||||
eeqj.com: could not connect to host
|
||||
efficienthealth.com: did not receive HSTS header
|
||||
effortlesshr.com: did not receive HSTS header
|
||||
@ -1114,7 +1112,6 @@ evasion-energie.com: could not connect to host
|
||||
evdenevenakliyatankara.pw: did not receive HSTS header
|
||||
everybooks.com: max-age too low: 60
|
||||
everylab.org: could not connect to host
|
||||
evilsay.com: did not receive HSTS header
|
||||
evin.ml: could not connect to host
|
||||
evomon.com: could not connect to host
|
||||
evossd.tk: could not connect to host
|
||||
@ -1171,6 +1168,7 @@ fedux.com.ar: could not connect to host
|
||||
feezmodo.com: max-age too low: 0
|
||||
felisslovakia.sk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
feliwyn.fr: did not receive HSTS header
|
||||
felixsanz.com: could not connect to host
|
||||
feminists.co: could not connect to host
|
||||
fenteo.com: could not connect to host
|
||||
feragon.net: max-age too low: 84600
|
||||
@ -1185,6 +1183,7 @@ fiftyshadesofluca.ml: could not connect to host
|
||||
fig.co: did not receive HSTS header
|
||||
fightr.co: could not connect to host
|
||||
fikt.space: could not connect to host
|
||||
filestar.io: did not receive HSTS header
|
||||
filmipop.com: max-age too low: 0
|
||||
finalgear.com: did not receive HSTS header
|
||||
financieringsportaal.nl: did not receive HSTS header
|
||||
@ -1205,7 +1204,6 @@ fitnesswerk.de: could not connect to host
|
||||
fivestarsitters.com: did not receive HSTS header
|
||||
fixatom.com: did not receive HSTS header
|
||||
fixingdns.com: did not receive HSTS header
|
||||
fizz.buzz: could not connect to host
|
||||
fj.search.yahoo.com: did not receive HSTS header
|
||||
fjruiz.es: could not connect to host
|
||||
flags.ninja: could not connect to host
|
||||
@ -1229,7 +1227,6 @@ fndout.com: did not receive HSTS header
|
||||
fnvsecurity.com: could not connect to host
|
||||
fonetiq.io: could not connect to host
|
||||
food4health.guide: could not connect to host
|
||||
foodblogger.club: did not receive HSTS header
|
||||
footballmapped.com: could not connect to host
|
||||
foraje-profesionale.ro: did not receive HSTS header
|
||||
forbook.net: could not connect to host
|
||||
@ -1272,7 +1269,6 @@ frontmin.com: did not receive HSTS header
|
||||
frost-ci.xyz: could not connect to host
|
||||
fruitusers.com: could not connect to host
|
||||
frusky.net: could not connect to host
|
||||
fs-gamenet.de: could not connect to host
|
||||
ftctele.com: did not receive HSTS header
|
||||
fuckgfw233.org: could not connect to host
|
||||
fugle.de: could not connect to host
|
||||
@ -1330,13 +1326,13 @@ genuu.com: could not connect to host
|
||||
genuxation.com: could not connect to host
|
||||
genyaa.com: could not connect to host
|
||||
gerencianet.com.br: did not receive HSTS header
|
||||
gesiwista.net: could not connect to host
|
||||
get.zenpayroll.com: did not receive HSTS header
|
||||
getable.com: did not receive HSTS header
|
||||
getblys.com.au: did not receive HSTS header
|
||||
getbooks.co.il: did not receive HSTS header
|
||||
getcarefirst.com: did not receive HSTS header
|
||||
getcolor.com: did not receive HSTS header
|
||||
getfirepress.com: could not connect to host
|
||||
getinternet.de: max-age too low: 0
|
||||
getlantern.org: did not receive HSTS header
|
||||
getlifti.com: did not receive HSTS header
|
||||
@ -1364,7 +1360,6 @@ gistfy.com: could not connect to host
|
||||
github.party: could not connect to host
|
||||
givemyanswer.com: did not receive HSTS header
|
||||
gizzo.sk: could not connect to host
|
||||
gjspunk.de: did not receive HSTS header
|
||||
gl.search.yahoo.com: did not receive HSTS header
|
||||
glass.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
glentakahashi.com: max-age too low: 0
|
||||
@ -1390,6 +1385,7 @@ goerner.me: did not receive HSTS header
|
||||
goge.site: could not connect to host
|
||||
gogenenglish.com: could not connect to host
|
||||
gogetssl.com: did not receive HSTS header
|
||||
goggs.eu: could not connect to host
|
||||
gogold-g.com: could not connect to host
|
||||
gold24.in: did not receive HSTS header
|
||||
goldendata.io: could not connect to host
|
||||
@ -1411,7 +1407,6 @@ gparent.org: did not receive HSTS header
|
||||
gpsfix.cz: could not connect to host
|
||||
gpstuner.com: did not receive HSTS header
|
||||
gracesofgrief.com: max-age too low: 86400
|
||||
graffen.dk: did not receive HSTS header
|
||||
grandmascookieblog.com: did not receive HSTS header
|
||||
graph.no: did not receive HSTS header
|
||||
gravity-net.de: could not connect to host
|
||||
@ -1458,7 +1453,7 @@ hackerforever.com: did not receive HSTS header
|
||||
hackerone-ext-adroll.com: could not connect to host
|
||||
hackit.im: could not connect to host
|
||||
hadzic.co: could not connect to host
|
||||
haeckdesign.com: could not connect to host
|
||||
haeckdesign.com: did not receive HSTS header
|
||||
hahayidu.org: could not connect to host
|
||||
haitschi.com: could not connect to host
|
||||
haitschi.de: could not connect to host
|
||||
@ -1472,7 +1467,7 @@ hancc.net: did not receive HSTS header
|
||||
hanfu.la: could not connect to host
|
||||
hannover-banditen.de: did not receive HSTS header
|
||||
hao2taiwan.com: max-age too low: 0
|
||||
haozi.me: could not connect to host
|
||||
haozi.me: did not receive HSTS header
|
||||
happycoder.net: could not connect to host
|
||||
happyfabric.me: did not receive HSTS header
|
||||
happygadget.me: could not connect to host
|
||||
@ -1500,6 +1495,7 @@ haydenhill.us: could not connect to host
|
||||
hazcod.com: could not connect to host
|
||||
hcie.pl: could not connect to host
|
||||
hdm.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
hdsmigrationtool.com: could not connect to host
|
||||
hduin.xyz: did not receive HSTS header
|
||||
hdwallpapers.net: did not receive HSTS header
|
||||
healtious.com: did not receive HSTS header
|
||||
@ -1516,7 +1512,6 @@ henriknoerr.com: could not connect to host
|
||||
hermes-net.de: did not receive HSTS header
|
||||
herpaderp.net: did not receive HSTS header
|
||||
herzbotschaft.de: did not receive HSTS header
|
||||
heutger.net: did not receive HSTS header
|
||||
heyguevara.com: could not connect to host
|
||||
hibilog.com: could not connect to host
|
||||
hicn.gq: could not connect to host
|
||||
@ -1527,6 +1522,7 @@ highsurf-miyazaki.com: did not receive HSTS header
|
||||
hiitcentre.com: did not receive HSTS header
|
||||
hikariempire.com: could not connect to host
|
||||
hillcity.org.nz: did not receive HSTS header
|
||||
hilnu.tk: could not connect to host
|
||||
hiphopconvention.nl: could not connect to host
|
||||
hitoy.org: did not receive HSTS header
|
||||
hittipps.com: did not receive HSTS header
|
||||
@ -1549,7 +1545,6 @@ horosho.in: could not connect to host
|
||||
horseboners.xxx: did not receive HSTS header
|
||||
hortifarm.ro: did not receive HSTS header
|
||||
hosmussynergie.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]
|
||||
hostam.link: could not connect to host
|
||||
hosted-service.com: did not receive HSTS header
|
||||
hostedtalkgadget.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
hostgarou.com: did not receive HSTS header
|
||||
@ -1613,7 +1608,6 @@ ihrlotto.de: could not connect to host
|
||||
ihrnationalrat.ch: could not connect to host
|
||||
ihsbsd.me: could not connect to host
|
||||
ihuanmeng.com: did not receive HSTS header
|
||||
ikk.me: did not receive HSTS header
|
||||
ikujii.com: max-age too low: 0
|
||||
ikwilguidobellen.nl: did not receive HSTS header
|
||||
ilbuongiorno.it: did not receive HSTS header
|
||||
@ -1622,10 +1616,10 @@ ilikerainbows.co.uk: could not connect to host
|
||||
ilmconpm.de: did not receive HSTS header
|
||||
ilona.graphics: max-age too low: 3600
|
||||
iluvscotland.co.uk: did not receive HSTS header
|
||||
imakepoems.net: could not connect to host
|
||||
ime.moe: could not connect to host
|
||||
imguoguo.com: did not receive HSTS header
|
||||
imim.pw: did not receive HSTS header
|
||||
imjiangtao.com: could not connect to host
|
||||
immoprotect.ca: did not receive HSTS header
|
||||
immortals-co.com: did not receive HSTS header
|
||||
immoverkauf24.at: did not receive HSTS header
|
||||
@ -1717,7 +1711,6 @@ itshost.ru: could not connect to host
|
||||
ivi-fertility.com: max-age too low: 0
|
||||
ivi.es: max-age too low: 0
|
||||
ivk.website: could not connect to host
|
||||
iwannarefill.com: could not connect to host
|
||||
iww.mx: could not connect to host
|
||||
izdiwho.com: could not connect to host
|
||||
izoox.com: did not receive HSTS header
|
||||
@ -1796,12 +1789,12 @@ jmdekker.it: could not connect to host
|
||||
joakimalgroy.com: could not connect to host
|
||||
jobmedic.com: did not receive HSTS header
|
||||
joedavison.me: could not connect to host
|
||||
joepitt.co.uk: could not connect to host
|
||||
jogi-server.de: did not receive HSTS header
|
||||
johners.me: could not connect to host
|
||||
johners.tech: did not receive HSTS header
|
||||
johnhgaunt.com: did not receive HSTS header
|
||||
johnrom.com: did not receive HSTS header
|
||||
jokewignand.nl: did not receive HSTS header
|
||||
jonas-keidel.de: did not receive HSTS header
|
||||
jonasgroth.se: max-age too low: 2592000
|
||||
jonathan.ir: could not connect to host
|
||||
@ -1858,7 +1851,6 @@ kausch.at: could not connect to host
|
||||
kawaii.io: could not connect to host
|
||||
kawaiiku.com: could not connect to host
|
||||
kawaiiku.de: could not connect to host
|
||||
kaylyn.ink: could not connect to host
|
||||
kayon.cf: could not connect to host
|
||||
kdata.it: did not receive HSTS header
|
||||
kdm-online.de: did not receive HSTS header
|
||||
@ -1866,11 +1858,13 @@ keeley.gq: could not connect to host
|
||||
keeley.ml: could not connect to host
|
||||
keeleysam.me: could not connect to host
|
||||
keepclean.me: could not connect to host
|
||||
ken.fm: did not receive HSTS header
|
||||
kerangalam.com: did not receive HSTS header
|
||||
kerksanders.nl: did not receive HSTS header
|
||||
kermadec.net: could not connect to host
|
||||
kernl.us: did not receive HSTS header
|
||||
kevinapease.com: could not connect to host
|
||||
kevinmeijer.nl: could not connect to host
|
||||
keymaster.lookout.com: did not receive HSTS header
|
||||
kg-rating.com: did not receive HSTS header
|
||||
kgxtech.com: max-age too low: 2592000
|
||||
@ -1925,7 +1919,6 @@ korsanparti.org: could not connect to host
|
||||
kotonehoko.net: could not connect to host
|
||||
kotovstyle.ru: could not connect to host
|
||||
kr.search.yahoo.com: did not receive HSTS header
|
||||
kraynik.com: could not connect to host
|
||||
kredite.sale: could not connect to host
|
||||
kriegt.es: could not connect to host
|
||||
krmela.com: could not connect to host
|
||||
@ -1982,6 +1975,7 @@ lbrt.xyz: could not connect to host
|
||||
ldarby.me.uk: could not connect to host
|
||||
leadership9.com: could not connect to host
|
||||
leardev.de: did not receive HSTS header
|
||||
learnedovo.com: could not connect to host
|
||||
learnfrenchfluently.com: did not receive HSTS header
|
||||
learningorder.com: could not connect to host
|
||||
ledgerscope.net: could not connect to host
|
||||
@ -2026,7 +2020,6 @@ libertyrp.org: could not connect to host
|
||||
library.linode.com: did not receive HSTS header
|
||||
librechan.net: could not connect to host
|
||||
libscode.com: did not receive HSTS header
|
||||
liceserv.com: could not connect to host
|
||||
lifeguard.aecom.com: did not receive HSTS header
|
||||
lifeinitsownway.com: did not receive HSTS header
|
||||
lifeskillsdirect.com: did not receive HSTS header
|
||||
@ -2065,7 +2058,6 @@ loginseite.com: could not connect to host
|
||||
loli.bz: could not connect to host
|
||||
lonal.com: could not connect to host
|
||||
londonlanguageexchange.com: could not connect to host
|
||||
longboarding-ulm.de: could not connect to host
|
||||
look-at-my.site: could not connect to host
|
||||
lookastic.co.uk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
lookastic.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]
|
||||
@ -2104,6 +2096,7 @@ lukeng.net: could not connect to host
|
||||
lukonet.com: did not receive HSTS header
|
||||
lumi.do: did not receive HSTS header
|
||||
lunix.io: did not receive HSTS header
|
||||
luody.info: did not receive HSTS header
|
||||
luoe.ml: could not connect to host
|
||||
luoxiao.im: could not connect to host
|
||||
lusis.fr: did not receive HSTS header
|
||||
@ -2125,6 +2118,7 @@ macchaberrycream.com: could not connect to host
|
||||
macchedil.com: did not receive HSTS header
|
||||
macgeneral.de: did not receive HSTS header
|
||||
machon.biz: could not connect to host
|
||||
macker.io: could not connect to host
|
||||
maclemon.at: could not connect to host
|
||||
macosxfilerecovery.com: did not receive HSTS header
|
||||
madars.org: did not receive HSTS header
|
||||
@ -2190,10 +2184,8 @@ maya.mg: did not receive HSTS header
|
||||
mbinformatik.de: could not connect to host
|
||||
mca2017.org: did not receive HSTS header
|
||||
mcc.re: could not connect to host
|
||||
mccarty.io: could not connect to host
|
||||
mcdonalds.ru: did not receive HSTS header
|
||||
mclab.su: could not connect to host
|
||||
mcpart.land: could not connect to host
|
||||
mdewendt.de: could not connect to host
|
||||
mdfnet.se: did not receive HSTS header
|
||||
mdscomp.net: did not receive HSTS header
|
||||
@ -2237,6 +2229,7 @@ mexbt.com: could not connect to host
|
||||
mfcatalin.com: could not connect to host
|
||||
mfiles.pl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
mhealthdemocamp.com: could not connect to host
|
||||
mhertel.com: did not receive HSTS header
|
||||
mhict.nl: max-age too low: 0
|
||||
mia.to: could not connect to host
|
||||
michaelfitzpatrickruth.com: could not connect to host
|
||||
@ -2262,7 +2255,6 @@ mikonmaa.fi: could not connect to host
|
||||
miku.be: could not connect to host
|
||||
miku.hatsune.my: max-age too low: 5184000
|
||||
milesgeek.com: did not receive HSTS header
|
||||
millenniumweb.com: did not receive HSTS header
|
||||
mindoktor.se: did not receive HSTS header
|
||||
minecraftserverz.com: could not connect to host
|
||||
minecraftvoter.com: could not connect to host
|
||||
@ -2283,6 +2275,7 @@ 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
|
||||
mjcaffarattilaw.com: could not connect to host
|
||||
mlpepilepsy.org: could not connect to host
|
||||
mmgazhomeloans.com: did not receive HSTS header
|
||||
mnemotiv.com: could not connect to host
|
||||
@ -2296,7 +2289,6 @@ mobilpass.no: could not connect to host
|
||||
mocloud.eu: could not connect to host
|
||||
moddedark.com: could not connect to host
|
||||
modemagazines.co.uk: could not connect to host
|
||||
modydev.club: could not connect to host
|
||||
moebel-nagel.de: did not receive HSTS header
|
||||
moelord.org: could not connect to host
|
||||
moen.io: did not receive HSTS header
|
||||
@ -2308,7 +2300,6 @@ mondar.io: could not connect to host
|
||||
mondopoint.com: could not connect to host
|
||||
moneycrownmedia.com: did not receive HSTS header
|
||||
monitman.com: could not connect to host
|
||||
monpc-pro.fr: did not receive HSTS header
|
||||
moon.lc: could not connect to host
|
||||
moparisthebest.biz: could not connect to host
|
||||
moparisthebest.info: could not connect to host
|
||||
@ -2336,6 +2327,7 @@ mqas.net: could not connect to host
|
||||
mrnonz.com: max-age too low: 0
|
||||
mrpopat.in: did not receive HSTS header
|
||||
mrs-shop.com: did not receive HSTS header
|
||||
ms-alternativ.de: could not connect to host
|
||||
msc-seereisen.net: could not connect to host
|
||||
mszaki.com: did not receive HSTS header
|
||||
mt.me.uk: could not connect to host
|
||||
@ -2417,7 +2409,6 @@ neel.ch: could not connect to host
|
||||
neftaly.com: did not receive HSTS header
|
||||
negai.moe: could not connect to host
|
||||
negativecurvature.net: could not connect to host
|
||||
neilgreen.net: did not receive HSTS header
|
||||
neko-life.com: did not receive HSTS header
|
||||
neko-system.com: did not receive HSTS header
|
||||
nella-project.org: could not connect to host
|
||||
@ -2430,7 +2421,6 @@ neonisi.com: could not connect to host
|
||||
nepustil.net: did not receive HSTS header
|
||||
neris.io: could not connect to host
|
||||
nerven.se: could not connect to host
|
||||
nestedquotes.ca: could not connect to host
|
||||
netbox.cc: could not connect to host
|
||||
netherwind.eu: did not receive HSTS header
|
||||
netlilo.com: did not receive HSTS header
|
||||
@ -2442,7 +2432,7 @@ netztest.at: did not receive HSTS header
|
||||
neueonlinecasino2016.com: could not connect to host
|
||||
neuralgic.net: could not connect to host
|
||||
neutralox.com: max-age too low: 3600
|
||||
never-afk.de: could not connect to host
|
||||
never-afk.de: did not receive HSTS header
|
||||
neveta.com: could not connect to host
|
||||
newcitygas.ca: max-age too low: 0
|
||||
newlooknow.com: did not receive HSTS header
|
||||
@ -2462,26 +2452,25 @@ nicky.io: did not receive HSTS header
|
||||
nicoborghuis.nl: could not connect to host
|
||||
nicolasbettag.me: could not connect to host
|
||||
niconiconi.xyz: could not connect to host
|
||||
niconode.com: could not connect to host
|
||||
niconode.com: did not receive HSTS header
|
||||
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
|
||||
nikomo.fi: could not connect to host
|
||||
nilrem.org: did not receive HSTS header
|
||||
ninchisho-online.com: did not receive HSTS header
|
||||
ninhs.org: could not connect to host
|
||||
nippler.org: did not receive HSTS header
|
||||
nippombashi.net: did not receive HSTS header
|
||||
nipponcareers.com: did not receive HSTS header
|
||||
nixien.fr: could not connect to host
|
||||
nixmag.net: could not connect to host
|
||||
nkinka.de: did not receive HSTS header
|
||||
nmctest.net: could not connect to host
|
||||
nnya.cat: did not receive HSTS header
|
||||
no17sifangjie.cc: could not connect to host
|
||||
nocallaghan.com: could not connect to host
|
||||
nocs.cn: did not receive HSTS header
|
||||
noctinus.tk: could not connect to host
|
||||
nodebrewery.com: could not connect to host
|
||||
nodecompat.com: did not receive HSTS header
|
||||
nodetemple.com: could not connect to host
|
||||
@ -2507,7 +2496,6 @@ novatrucking.de: could not connect to host
|
||||
nowak.ninja: did not receive HSTS header
|
||||
noworrywp.com: could not connect to host
|
||||
np.search.yahoo.com: did not receive HSTS header
|
||||
npm.li: could not connect to host
|
||||
npol.de: did not receive HSTS header
|
||||
ntbs.pro: could not connect to host
|
||||
nu3.at: did not receive HSTS header
|
||||
@ -2521,7 +2509,6 @@ nu3.fr: did not receive HSTS header
|
||||
nu3.no: did not receive HSTS header
|
||||
nu3.se: did not receive HSTS header
|
||||
nufla.de: could not connect to host
|
||||
nukenet.se: could not connect to host
|
||||
null-sec.ru: could not connect to host
|
||||
null.cat: could not connect to host
|
||||
null.tips: could not connect to host
|
||||
@ -2562,8 +2549,6 @@ oliver-pietsch.de: did not receive HSTS header
|
||||
oliverdunk.com: did not receive HSTS header
|
||||
ollehbizev.co.kr: could not connect to host
|
||||
ollie.io: did not receive HSTS header
|
||||
ollies.cloud: could not connect to host
|
||||
olliespage.net: could not connect to host
|
||||
omgaanmetidealen.com: could not connect to host
|
||||
ominto.com: max-age too low: 0
|
||||
omniti.com: max-age too low: 1
|
||||
@ -2588,6 +2573,7 @@ onlyshopstation.com: did not receive HSTS header
|
||||
ononpay.com: did not receive HSTS header
|
||||
onovlena.dn.ua: could not connect to host
|
||||
ontras.com: could not connect to host
|
||||
onyxwall.com: could not connect to host
|
||||
onyxwall.net: could not connect to host
|
||||
ookjesprookje.nl: could not connect to host
|
||||
ooonja.de: could not connect to host
|
||||
@ -2623,7 +2609,6 @@ ossan-kobe-gourmet.com: did not receive HSTS header
|
||||
ossbinaries.com: could not connect to host
|
||||
osteammate.com: did not receive HSTS header
|
||||
osticketawesome.com: did not receive HSTS header
|
||||
ostr.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
otakuworld.de: could not connect to host
|
||||
othercode.nl: could not connect to host
|
||||
othermedia.cc: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
@ -2647,9 +2632,9 @@ ownmovies.fr: could not connect to host
|
||||
oxygenabsorbers.com: did not receive HSTS header
|
||||
oxynux.fr: could not connect to host
|
||||
p.linode.com: could not connect to host
|
||||
p3in.com: could not connect to host
|
||||
p8r.de: did not receive HSTS header
|
||||
pa.search.yahoo.com: did not receive HSTS header
|
||||
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
|
||||
@ -2699,6 +2684,7 @@ pbprint.ru: max-age too low: 0
|
||||
pc-nf.de: did not receive HSTS header
|
||||
pcfun.net: did not receive HSTS header
|
||||
pchax.net: could not connect to host
|
||||
pebbles.net.in: could not connect to host
|
||||
pebblesdemo.com: could not connect to host
|
||||
peissen.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
pekkapikkarainen.fi: could not connect to host
|
||||
@ -2726,6 +2712,7 @@ petrolplus.ru: did not receive HSTS header
|
||||
pettsy.com: could not connect to host
|
||||
pewboards.com: could not connect to host
|
||||
pgpm.io: could not connect to host
|
||||
pharmgkb.org: could not connect to host
|
||||
phillprice.com: could not connect to host
|
||||
phonenumberinfo.co.uk: could not connect to host
|
||||
phongmay24h.com: could not connect to host
|
||||
@ -2741,7 +2728,7 @@ pippen.io: could not connect to host
|
||||
pir9.com: max-age too low: 2592000
|
||||
piratedb.com: could not connect to host
|
||||
piratedot.com: could not connect to host
|
||||
piratelist.online: could not connect to host
|
||||
piratelist.online: did not receive HSTS header
|
||||
piratenlogin.de: could not connect to host
|
||||
pirati.cz: max-age too low: 604800
|
||||
pirlitu.com: did not receive HSTS header
|
||||
@ -2752,6 +2739,7 @@ piwko.co: could not connect to host
|
||||
pixel.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
pixelcode.com.au: max-age too low: 0
|
||||
pixelhero.co.uk: did not receive HSTS header
|
||||
pixelminers.net: could not connect to host
|
||||
pixi.me: could not connect to host
|
||||
pj83.duckdns.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]
|
||||
pk.search.yahoo.com: did not receive HSTS header
|
||||
@ -2774,6 +2762,7 @@ ploup.net: could not connect to host
|
||||
pmnts.io: could not connect to host
|
||||
po.gl: did not receive HSTS header
|
||||
poiema.com.sg: did not receive HSTS header
|
||||
poinsot.info: could not connect to host
|
||||
pol.in.th: could not connect to host
|
||||
pole.net.nz: did not receive HSTS header
|
||||
poleartschool.com: could not connect to host
|
||||
@ -2831,7 +2820,6 @@ prontomovers.co.uk: could not connect to host
|
||||
prosocialmachines.com: could not connect to host
|
||||
prosoft.sk: did not receive HSTS header
|
||||
prosperident.com: did not receive HSTS header
|
||||
protoyou.de: did not receive HSTS header
|
||||
prowhisky.de: did not receive HSTS header
|
||||
proximato.com: could not connect to host
|
||||
proxybay.al: could not connect to host
|
||||
@ -2871,8 +2859,8 @@ quantacloud.ch: could not connect to host
|
||||
quantenteranik.eu: could not connect to host
|
||||
quantumcourse.org: did not receive HSTS header
|
||||
queercoders.com: did not receive HSTS header
|
||||
quemmeliga.com: could not connect to host
|
||||
questsandrewards.com: could not connect to host
|
||||
quotehex.com: could not connect to host
|
||||
quranserver.net: could not connect to host
|
||||
qvi.st: did not receive HSTS header
|
||||
qwaser.fr: could not connect to host
|
||||
@ -2914,6 +2902,7 @@ reddiseals.com: [Exception... "Component returned failure code: 0x80004005 (NS_E
|
||||
reddit.com: did not receive HSTS header
|
||||
rede.ca: did not receive HSTS header
|
||||
redicabo.de: could not connect to host
|
||||
redirectman.com: did not receive HSTS header
|
||||
redlatam.org: did not receive HSTS header
|
||||
redmbk.com: did not receive HSTS header
|
||||
regaloaks.com: did not receive HSTS header
|
||||
@ -2928,6 +2917,7 @@ rem.pe: could not connect to host
|
||||
remitatm.com: could not connect to host
|
||||
remodela.com.ve: could not connect to host
|
||||
renem.net: did not receive HSTS header
|
||||
renkhosting.com: did not receive HSTS header
|
||||
renlong.org: could not connect to host
|
||||
renrenss.com: did not receive HSTS header
|
||||
rent-a-coder.de: did not receive HSTS header
|
||||
@ -2975,6 +2965,7 @@ rme.li: did not receive HSTS header
|
||||
roan24.pl: did not receive HSTS header
|
||||
robertglastra.com: could not connect to host
|
||||
robigalia.org: did not receive HSTS header
|
||||
robtex.com: did not receive HSTS header
|
||||
robtex.net: did not receive HSTS header
|
||||
robtex.org: did not receive HSTS header
|
||||
rochman.id: could not connect to host
|
||||
@ -2983,6 +2974,7 @@ roddis.net: did not receive HSTS header
|
||||
rodney.id.au: did not receive HSTS header
|
||||
rodosto.com: did not receive HSTS header
|
||||
roeper.party: could not connect to host
|
||||
rointe.online: could not connect to host
|
||||
romans-place.me.uk: did not receive HSTS header
|
||||
ronvandordt.info: did not receive HSTS header
|
||||
ronwo.de: max-age too low: 1
|
||||
@ -3009,10 +3001,10 @@ rubecodeberg.com: could not connect to host
|
||||
rubenschulz.nl: did not receive HSTS header
|
||||
ruborr.se: did not receive HSTS header
|
||||
rubyshop.nl: max-age too low: 604800
|
||||
rudeotter.com: did not receive HSTS header
|
||||
rudeotter.com: could not connect to host
|
||||
rudloff.pro: did not receive HSTS header
|
||||
rugirlfriend.com: could not connect to host
|
||||
ruiming.me: did not receive HSTS header
|
||||
ruiming.me: max-age too low: 86400
|
||||
runawebinar.nl: could not connect to host
|
||||
runementors.com: could not connect to host
|
||||
runtondev.com: did not receive HSTS header
|
||||
@ -3043,7 +3035,6 @@ saml2.com: could not connect to host
|
||||
sampoznay.ru: did not receive HSTS header
|
||||
samraskauskas.com: could not connect to host
|
||||
samsen.club: did not receive HSTS header
|
||||
sanatfilan.com: could not connect to host
|
||||
sandviks.com: did not receive HSTS header
|
||||
sansemea.com: could not connect to host
|
||||
sapk.fr: could not connect to host
|
||||
@ -3060,7 +3051,6 @@ saunasandstuff.com: did not receive HSTS header
|
||||
save.gov: could not connect to host
|
||||
saveaward.gov: could not connect to host
|
||||
saveyour.biz: did not receive HSTS header
|
||||
savingrecipe.com: did not receive HSTS header
|
||||
sawamura-rental.com: did not receive HSTS header
|
||||
sb-group.dk: did not receive HSTS header
|
||||
sbox-archives.com: could not connect to host
|
||||
@ -3071,7 +3061,7 @@ schnell-gold.com: could not connect to host
|
||||
schoop.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
schreiber-netzwerk.eu: did not receive HSTS header
|
||||
schrodinger.io: could not connect to host
|
||||
schwarzkopfforyou.de: could not connect to host
|
||||
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
|
||||
@ -3079,11 +3069,11 @@ scrambl.is: could not connect to host
|
||||
scrambler.in: could not connect to host
|
||||
scrapings.net: could not connect to host
|
||||
screencaster.io: did not receive HSTS header
|
||||
screenlight.tv: did not receive HSTS header
|
||||
screenresolution.space: could not connect to host
|
||||
scribe.systems: could not connect to host
|
||||
script.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
scriptict.nl: could not connect to host
|
||||
scriptjunkie.us: could not connect to host
|
||||
sdmoscow.ru: could not connect to host
|
||||
sdrobs.com: did not receive HSTS header
|
||||
sdsl-speedtest.de: could not connect to host
|
||||
@ -3092,7 +3082,7 @@ sebastian-lutsch.de: could not connect to host
|
||||
secandtech.com: could not connect to host
|
||||
secondpay.nl: did not receive HSTS header
|
||||
sectia22.ro: could not connect to host
|
||||
sectun.com: could not connect to host
|
||||
sectun.com: did not receive HSTS header
|
||||
secure-games.us: could not connect to host
|
||||
secureradio.net: could not connect to host
|
||||
security-carpet.com: could not connect to host
|
||||
@ -3137,7 +3127,6 @@ setphaserstostun.org: could not connect to host
|
||||
setuid.de: could not connect to host
|
||||
setuid.io: did not receive HSTS header
|
||||
seyahatsagliksigortalari.com: could not connect to host
|
||||
sgtcodfish.com: did not receive HSTS header
|
||||
shadoom.com: did not receive HSTS header
|
||||
shadowmorph.info: did not receive HSTS header
|
||||
shadowsocks.net: could not connect to host
|
||||
@ -3150,7 +3139,6 @@ sharescope.co.uk: max-age too low: 14400
|
||||
shauncrowley.co.uk: could not connect to host
|
||||
shaunwheelhou.se: could not connect to host
|
||||
shawnh.net: could not connect to host
|
||||
sheilasdrivingschool.com: could not connect to host
|
||||
shellsec.pw: did not receive HSTS header
|
||||
shibe.club: could not connect to host
|
||||
shiftins.com: did not receive HSTS header
|
||||
@ -3165,12 +3153,12 @@ shoprose.ru: could not connect to host
|
||||
shops.neonisi.com: could not connect to host
|
||||
shortr.li: could not connect to host
|
||||
showkeeper.tv: did not receive HSTS header
|
||||
shtorku.com: could not connect to host
|
||||
shukatsu-note.com: could not connect to host
|
||||
shv25.se: could not connect to host
|
||||
shwongacc.com: could not connect to host
|
||||
siammedia.co: could not connect to host
|
||||
siddhant.me: could not connect to host
|
||||
siebens.net: could not connect to host
|
||||
sifls.com: could not connect to host
|
||||
silentcircle.org: could not connect to host
|
||||
silicagelpackets.ca: did not receive HSTS header
|
||||
@ -3200,6 +3188,7 @@ skoda-im-dialog.de: could not connect to host
|
||||
skullhouse.nyc: did not receive HSTS header
|
||||
skyflix.me: did not receive HSTS header
|
||||
skyoy.com: did not receive HSTS header
|
||||
slainvet.net: could not connect to host
|
||||
slash-dev.de: did not receive HSTS header
|
||||
slashem.me: did not receive HSTS header
|
||||
slattery.co: could not connect to host
|
||||
@ -3256,6 +3245,7 @@ somethingnew.xyz: did not receive HSTS header
|
||||
songzhuolun.com: did not receive HSTS header
|
||||
sonic.sk: max-age too low: 0
|
||||
sonicrainboom.rocks: did not receive HSTS header
|
||||
soondy.com: could not connect to host
|
||||
sotar.us: [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]
|
||||
sotor.de: did not receive HSTS header
|
||||
soulboy.io: did not receive HSTS header
|
||||
@ -3270,6 +3260,7 @@ souyar.us: could not connect to host
|
||||
sovereignshare.com: could not connect to host
|
||||
sown.dyndns.org: could not connect to host
|
||||
spacehq.org: max-age too low: 0
|
||||
sparelib.com: could not connect to host
|
||||
spark.team: could not connect to host
|
||||
sparklingsparklers.com: did not receive HSTS header
|
||||
sparsa.army: could not connect to host
|
||||
@ -3280,6 +3271,7 @@ speculor.net: could not connect to host
|
||||
speed-mailer.com: could not connect to host
|
||||
speedcounter.net: did not receive HSTS header
|
||||
speedmann.de: could not connect to host
|
||||
speeds.vip: could not connect to host
|
||||
speedtest-russia.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]
|
||||
speidel.com.tr: did not receive HSTS header
|
||||
spencerbaer.com: could not connect to host
|
||||
@ -3289,7 +3281,6 @@ spideroak.com: did not receive HSTS header
|
||||
spiegels.nl: could not connect to host
|
||||
spikeykc.me: did not receive HSTS header
|
||||
spilsbury.io: could not connect to host
|
||||
spitefultowel.com: could not connect to host
|
||||
sportwette.eu: did not receive HSTS header
|
||||
spot-events.com: could not connect to host
|
||||
spotlightsrule.ddns.net: could not connect to host
|
||||
@ -3313,8 +3304,6 @@ sss3s.com: did not receive HSTS header
|
||||
stabletoken.com: could not connect to host
|
||||
stadjerspasonline.nl: could not connect to host
|
||||
stahl.xyz: could not connect to host
|
||||
starsam80.net: could not connect to host
|
||||
starttraffic.com: did not receive HSTS header
|
||||
stateofexception.io: could not connect to host
|
||||
static.or.at: did not receive HSTS header
|
||||
staticanime.net: could not connect to host
|
||||
@ -3364,7 +3353,7 @@ studydrive.net: did not receive HSTS header
|
||||
stugb.de: did not receive HSTS header
|
||||
stw-group.at: could not connect to host
|
||||
subbing.work: could not connect to host
|
||||
subdimension.org: did not receive HSTS header
|
||||
subdimension.org: could not connect to host
|
||||
subrosa.io: could not connect to host
|
||||
subtitle.rip: could not connect to host
|
||||
sudo.li: did not receive HSTS header
|
||||
@ -3374,7 +3363,6 @@ suksit.com: could not connect to host
|
||||
sumoatm.com: did not receive HSTS header
|
||||
sumoscout.de: did not receive HSTS header
|
||||
suncountrymarine.com: did not receive HSTS header
|
||||
sunflyer.cn: did not receive HSTS header
|
||||
sunnyfruit.ru: did not receive HSTS header
|
||||
sunshinepress.org: could not connect to host
|
||||
superbabysitting.ch: could not connect to host
|
||||
@ -3386,7 +3374,7 @@ superwally.org: could not connect to host
|
||||
suprlink.net: could not connect to host
|
||||
supweb.ovh: did not receive HSTS header
|
||||
surfeasy.com: did not receive HSTS header
|
||||
sushi101tempe.com: could not connect to host
|
||||
sushi101tempe.com: did not receive HSTS header
|
||||
suzukikenichi.com: did not receive HSTS header
|
||||
sv.search.yahoo.com: did not receive HSTS header
|
||||
svatba-frantovi.cz: did not receive HSTS header
|
||||
@ -3411,6 +3399,7 @@ szaszm.tk: max-age too low: 0
|
||||
t.facebook.com: did not receive HSTS header
|
||||
taabe.xyz: could not connect to host
|
||||
tablet.facebook.com: did not receive HSTS header
|
||||
taboragroup.com: could not connect to host
|
||||
tacomafia.net: did not receive HSTS header
|
||||
tadigitalstore.com: could not connect to host
|
||||
tafoma.com: did not receive HSTS header
|
||||
@ -3426,6 +3415,7 @@ tangibilizing.com: could not connect to host
|
||||
tanzhijun.com: did not receive HSTS header
|
||||
tapfinder.ca: could not connect to host
|
||||
tapka.cz: did not receive HSTS header
|
||||
tappublisher.com: did not receive HSTS header
|
||||
taravancil.com: did not receive HSTS header
|
||||
tarhauskielto.fi: did not receive HSTS header
|
||||
tartaros.fi: could not connect to host
|
||||
@ -3443,6 +3433,7 @@ tcby45.xyz: did not receive HSTS header
|
||||
tcdw.net: did not receive HSTS header
|
||||
tcl.ath.cx: did not receive HSTS header
|
||||
tcomms.org: max-age too low: 0
|
||||
tcp.expert: max-age too low: 0
|
||||
teachforcanada.ca: did not receive HSTS header
|
||||
team-pancake.eu: could not connect to host
|
||||
teamblueridge.org: could not connect to host
|
||||
@ -3491,6 +3482,7 @@ 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
|
||||
theeyeopener.com: did not receive HSTS header
|
||||
thefootballanalyst.com: could not connect to host
|
||||
thehiddenbay.me: could not connect to host
|
||||
thehiddenbay.net: could not connect to host
|
||||
@ -3519,6 +3511,7 @@ thinkcoding.de: could not connect to host
|
||||
thinlyveiledcontempt.com: could not connect to host
|
||||
thirdpartytrade.com: did not receive HSTS header
|
||||
thirty5.net: did not receive HSTS header
|
||||
thisisacompletetest.ga: could not connect to host
|
||||
thiswebhost.com: did not receive HSTS header
|
||||
thomaswoo.com: could not connect to host
|
||||
thorncreek.net: did not receive HSTS header
|
||||
@ -3550,16 +3543,17 @@ tlo.hosting: could not connect to host
|
||||
tlo.network: could not connect to host
|
||||
tls.li: could not connect to host
|
||||
tm-solutions.eu: did not receive HSTS header
|
||||
tmaward.net: could not connect to host
|
||||
tmitchell.io: could not connect to host
|
||||
tmprod.com: did not receive HSTS header
|
||||
tncnanet.com.br: could not connect to host
|
||||
tnrsca.jp: did not receive HSTS header
|
||||
tobias-bielefeld.de: could not connect to host
|
||||
tobiasmathes.com: could not connect to host
|
||||
tobiasmathes.name: could not connect to host
|
||||
tobiasofficial.at: could not connect to host
|
||||
todo.is: did not receive HSTS header
|
||||
todobazar.es: could not connect to host
|
||||
tokke.dk: could not connect to host
|
||||
tokyopopline.com: did not receive HSTS header
|
||||
tollmanz.com: did not receive HSTS header
|
||||
tomberek.info: could not connect to host
|
||||
@ -3569,6 +3563,7 @@ tomharling.uk: max-age too low: 86400
|
||||
tomharris.tech: could not connect to host
|
||||
tomlankhorst.nl: did not receive HSTS header
|
||||
tommsy.com: did not receive HSTS header
|
||||
tonage.de: could not connect to host
|
||||
tonburi.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]
|
||||
tonyfantjr.com: could not connect to host
|
||||
toomanypillows.com: could not connect to host
|
||||
@ -3589,7 +3584,6 @@ tpbcdn.com: could not connect to host
|
||||
tpe-edu.com: could not connect to host
|
||||
track.plus: could not connect to host
|
||||
tracktivity.com.au: did not receive HSTS header
|
||||
tradeinvent.co.uk: could not connect to host
|
||||
tradingcentre.com.au: did not receive HSTS header
|
||||
tradinghope.com: could not connect to host
|
||||
traeningsprojekt.dk: did not receive HSTS header
|
||||
@ -3603,8 +3597,10 @@ trinityaffirmations.com: max-age too low: 0
|
||||
trinitycore.org: max-age too low: 2592000
|
||||
tripdelta.com: did not receive HSTS header
|
||||
trixies-wish.nz: could not connect to host
|
||||
trollme.me: could not connect to host
|
||||
trusitio.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]
|
||||
trustmeimfancy.com: could not connect to host
|
||||
truthmessages.pw: could not connect to host
|
||||
trybind.com: could not connect to host
|
||||
ts2.se: did not receive HSTS header
|
||||
tsecy.com: did not receive HSTS header
|
||||
@ -3643,6 +3639,7 @@ tyroproducts.eu: did not receive HSTS header
|
||||
tzappa.net: could not connect to host
|
||||
u-blox.com: did not receive HSTS header
|
||||
ua.search.yahoo.com: did not receive HSTS header
|
||||
uangteman.com: did not receive HSTS header
|
||||
ubicloud.de: could not connect to host
|
||||
ublox.com: did not receive HSTS header
|
||||
ubtce.com: could not connect to host
|
||||
@ -3677,10 +3674,10 @@ unknownphenomena.net: could not connect to host
|
||||
unplugg3r.dk: could not connect to host
|
||||
unravel.ie: could not connect to host
|
||||
unterschicht.tv: could not connect to host
|
||||
unun.fi: could not connect to host
|
||||
unwiredbrain.com: could not connect to host
|
||||
uonstaffhub.com: could not connect to host
|
||||
uow.ninja: could not connect to host
|
||||
up1.ca: could not connect to host
|
||||
upaknship.com: did not receive HSTS header
|
||||
upani.net: did not receive HSTS header
|
||||
upldr.pw: could not connect to host
|
||||
@ -3713,7 +3710,6 @@ valis.sx: could not connect to host
|
||||
valkyrja.xyz: did not receive HSTS header
|
||||
valleyridgepta.org: could not connect to host
|
||||
vallis.net: could not connect to host
|
||||
valshamar.is: could not connect to host
|
||||
vanderkley.it: could not connect to host
|
||||
vanestack.com: could not connect to host
|
||||
vanetv.com: could not connect to host
|
||||
@ -3728,10 +3724,12 @@ vbulletinrussia.com: could not connect to host
|
||||
vcdove.com: did not receive HSTS header
|
||||
vcr.re: could not connect to host
|
||||
veblen.com: could not connect to host
|
||||
veblr.com: did not receive HSTS header
|
||||
vechkasov.ru: did not receive HSTS header
|
||||
vemokin.net: could not connect to host
|
||||
venixplays-stream.ml: could not connect to host
|
||||
verifikatorindonesia.com: could not connect to host
|
||||
veriny.tf: did not receive HSTS header
|
||||
vermontcareergateway.org: could not connect to host
|
||||
versia.ru: did not receive HSTS header
|
||||
veryhax.de: could not connect to host
|
||||
@ -3796,8 +3794,9 @@ warhistoryonline.com: [Exception... "Component returned failure code: 0x80004005
|
||||
warmlyyours.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]
|
||||
warped.com: did not receive HSTS header
|
||||
warsentech.com: could not connect to host
|
||||
warsh.moe: could not connect to host
|
||||
wassim.is: could not connect to host
|
||||
watchium.com: did not receive HSTS header
|
||||
watertrails.io: could not connect to host
|
||||
watsonhall.uk: could not connect to host
|
||||
wave.is: could not connect to host
|
||||
wavefrontsystemstech.com: could not connect to host
|
||||
@ -3943,6 +3942,7 @@ xfive.de: did not receive HSTS header
|
||||
xiaody.me: could not connect to host
|
||||
xiaolvmu.me: could not connect to host
|
||||
xiaoxiao.im: could not connect to host
|
||||
xichtsbuch.de: could not connect to host
|
||||
ximens.me: did not receive HSTS header
|
||||
xisa.it: could not connect to host
|
||||
xiyu.moe: could not connect to host
|
||||
@ -3984,6 +3984,7 @@ yabrt.cn: could not connect to host
|
||||
yahvehyireh.com: did not receive HSTS header
|
||||
yamaken.jp: did not receive HSTS header
|
||||
yamamo10.com: could not connect to host
|
||||
yaoidreams.com: could not connect to host
|
||||
yaporn.tv: did not receive HSTS header
|
||||
yard-fu.com: did not receive HSTS header
|
||||
yasinaydin.net: max-age too low: 2592000
|
||||
@ -4012,7 +4013,7 @@ yourstrongbox.com: could not connect to host
|
||||
yout.com: max-age too low: 60000
|
||||
yu.gg: did not receive HSTS header
|
||||
yuan.ga: did not receive HSTS header
|
||||
yuhen.ru: could not connect to host
|
||||
yuhen.ru: did not receive HSTS header
|
||||
yuko.moe: could not connect to host
|
||||
yukontec.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]
|
||||
yunzhu.li: did not receive HSTS header
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -140,9 +140,14 @@ SandboxBrokerPolicyFactory::SandboxBrokerPolicyFactory()
|
||||
// Bug 1308851: NVIDIA proprietary driver when using WebGL
|
||||
policy->AddPrefix(rdwr, "/dev", "nvidia");
|
||||
|
||||
// Bug 1312678: radeonsi/Intel with DRI when using WebGL
|
||||
// Bug 1312678: radeonsi/Intel with DRI when using WebGL
|
||||
policy->AddDir(rdwr, "/dev/dri");
|
||||
|
||||
#ifdef MOZ_ALSA
|
||||
// Bug 1309098: ALSA support
|
||||
policy->AddDir(rdwr, "/dev/snd");
|
||||
#endif
|
||||
|
||||
mCommonContentPolicy.reset(policy);
|
||||
#endif
|
||||
}
|
||||
|
@ -20,6 +20,9 @@ if CONFIG['OS_TARGET'] == 'Android':
|
||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
||||
DEFINES['HAVE_ANDROID_OS'] = True
|
||||
|
||||
if CONFIG['MOZ_ALSA']:
|
||||
DEFINES['MOZ_ALSA'] = True
|
||||
|
||||
LOCAL_INCLUDES += [
|
||||
'/security/sandbox/linux', # SandboxLogging.h, SandboxInfo.h
|
||||
]
|
||||
|
@ -65,6 +65,15 @@ all-tests-opt:
|
||||
- web-platform-tests-wdspec
|
||||
- xpcshell
|
||||
- mochitest-valgrind
|
||||
- talos-chrome
|
||||
- talos-dromaeojs
|
||||
- talos-g1
|
||||
- talos-g2
|
||||
- talos-g3
|
||||
- talos-g4
|
||||
- talos-other
|
||||
- talos-svgr
|
||||
- talos-tp5o
|
||||
|
||||
stylo-tests:
|
||||
- cppunit
|
||||
|
@ -642,6 +642,195 @@ reftest-stylo:
|
||||
extra-options:
|
||||
- --reftest-suite=reftest-stylo
|
||||
|
||||
talos-chrome:
|
||||
description: "Talos chrome"
|
||||
suite: talos
|
||||
talos-try-name: chromez
|
||||
treeherder-symbol: tc-T(c)
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
linux64/opt: ['all']
|
||||
default: []
|
||||
max-run-time: 3600
|
||||
mozharness:
|
||||
script: talos_script.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
default:
|
||||
- talos/linux_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --suite=chromez
|
||||
|
||||
talos-dromaeojs:
|
||||
description: "Talos dromaeojs"
|
||||
suite: talos
|
||||
talos-try-name: dromaeojs
|
||||
treeherder-symbol: tc-T(d)
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
linux64/opt: ['all']
|
||||
default: []
|
||||
max-run-time: 3600
|
||||
mozharness:
|
||||
script: talos_script.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
default:
|
||||
- talos/linux_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --suite=dromaeojs
|
||||
|
||||
talos-g1:
|
||||
description: "Talos g1"
|
||||
suite: talos
|
||||
talos-try-name: g1
|
||||
treeherder-symbol: tc-T(g1)
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
linux64/opt: ['all']
|
||||
default: []
|
||||
max-run-time: 3600
|
||||
mozharness:
|
||||
script: talos_script.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
default:
|
||||
- talos/linux_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --suite=g1
|
||||
|
||||
talos-g2:
|
||||
description: "Talos g2"
|
||||
suite: talos
|
||||
talos-try-name: g2
|
||||
treeherder-symbol: tc-T(g2)
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
linux64/opt: ['all']
|
||||
default: []
|
||||
max-run-time: 3600
|
||||
mozharness:
|
||||
script: talos_script.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
default:
|
||||
- talos/linux_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --suite=g2
|
||||
|
||||
talos-g3:
|
||||
description: "Talos g3"
|
||||
suite: talos
|
||||
talos-try-name: g3
|
||||
treeherder-symbol: tc-T(g3)
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
linux64/opt: ['all']
|
||||
default: []
|
||||
max-run-time: 3600
|
||||
mozharness:
|
||||
script: talos_script.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
default:
|
||||
- talos/linux_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --suite=g3
|
||||
|
||||
talos-g4:
|
||||
description: "Talos g4"
|
||||
suite: talos
|
||||
talos-try-name: g4
|
||||
treeherder-symbol: tc-T(g4)
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
linux64/opt: ['all']
|
||||
default: []
|
||||
max-run-time: 3600
|
||||
mozharness:
|
||||
script: talos_script.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
default:
|
||||
- talos/linux_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --suite=g4
|
||||
|
||||
talos-other:
|
||||
description: "Talos other"
|
||||
suite: talos
|
||||
talos-try-name: other
|
||||
treeherder-symbol: tc-T(o)
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
linux64/opt: ['all']
|
||||
default: []
|
||||
max-run-time: 3600
|
||||
mozharness:
|
||||
script: talos_script.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
default:
|
||||
- talos/linux_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --suite=other
|
||||
|
||||
talos-svgr:
|
||||
description: "Talos svgr"
|
||||
suite: talos
|
||||
talos-try-name: svgr
|
||||
treeherder-symbol: tc-T(s)
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
linux64/opt: ['all']
|
||||
default: []
|
||||
max-run-time: 3600
|
||||
mozharness:
|
||||
script: talos_script.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
default:
|
||||
- talos/linux_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --suite=svgr
|
||||
|
||||
talos-tp5o:
|
||||
description: "Talos tp5o"
|
||||
suite: talos
|
||||
talos-try-name: tp5o
|
||||
treeherder-symbol: tc-T(tp)
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
linux64/opt: ['all']
|
||||
default: []
|
||||
max-run-time: 3600
|
||||
mozharness:
|
||||
script: talos_script.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
default:
|
||||
- talos/linux_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --suite=tp5o
|
||||
|
||||
web-platform-tests:
|
||||
description: "Web platform test run"
|
||||
suite: web-platform-tests
|
||||
|
@ -289,6 +289,8 @@ GROUP_NAMES = {
|
||||
'tc-M-V': 'Mochitests on Valgrind executed by TaskCluster',
|
||||
'tc-R': 'Reftests executed by TaskCluster',
|
||||
'tc-R-e10s': 'Reftests executed by TaskCluster with e10s',
|
||||
'tc-T': 'Talos performance tests executed by TaskCluster',
|
||||
'tc-T-e10s': 'Talos performance tests executed by TaskCluster with e10s',
|
||||
'tc-VP': 'VideoPuppeteer tests executed by TaskCluster',
|
||||
'tc-W': 'Web platform tests executed by TaskCluster',
|
||||
'tc-W-e10s': 'Web platform tests executed by TaskCluster with e10s',
|
||||
|
@ -338,10 +338,11 @@ class FennecInstance(GeckoInstance):
|
||||
else:
|
||||
logcat_args["logfile"] = self.gecko_log
|
||||
self.runner.device.start_logcat(**logcat_args)
|
||||
self.runner.device.setup_port_forwarding(
|
||||
local_port=self.marionette_port,
|
||||
remote_port=self.marionette_port,
|
||||
)
|
||||
|
||||
# forward marionette port (localhost:2828)
|
||||
self.runner.device.dm.forward(
|
||||
local="tcp:{}".format(self.marionette_port),
|
||||
remote="tcp:{}".format(self.marionette_port))
|
||||
|
||||
def _get_runner_args(self):
|
||||
process_args = {
|
||||
@ -369,8 +370,7 @@ class FennecInstance(GeckoInstance):
|
||||
super(FennecInstance, self).close(restart)
|
||||
if self.runner and self.runner.device.connected:
|
||||
self.runner.device.dm.remove_forward(
|
||||
"tcp:{}".format(int(self.marionette_port))
|
||||
)
|
||||
"tcp:{}".format(self.marionette_port))
|
||||
|
||||
|
||||
class DesktopInstance(GeckoInstance):
|
||||
|
@ -15,6 +15,7 @@ from argparse import ArgumentParser
|
||||
from copy import deepcopy
|
||||
|
||||
import mozinfo
|
||||
import moznetwork
|
||||
import mozprofile
|
||||
from marionette_driver.marionette import Marionette
|
||||
|
||||
@ -900,7 +901,10 @@ class BaseMarionetteTestRunner(object):
|
||||
|
||||
def start_fixture_servers(self):
|
||||
root = self.server_root or os.path.join(os.path.dirname(here), "www")
|
||||
return serve.start(root)
|
||||
if self.appName == "fennec":
|
||||
return serve.start(root, host=moznetwork.get_ip())
|
||||
else:
|
||||
return serve.start(root)
|
||||
|
||||
def add_test(self, test, expected='pass'):
|
||||
filepath = os.path.abspath(test)
|
||||
|
@ -15,8 +15,6 @@ import os
|
||||
import sys
|
||||
from collections import defaultdict
|
||||
|
||||
import moznetwork
|
||||
|
||||
import httpd
|
||||
|
||||
__all__ = ["default_doc_root",
|
||||
@ -137,15 +135,16 @@ class ServerProc(BlockingChannel):
|
||||
return False
|
||||
|
||||
|
||||
def http_server(doc_root, ssl_config, **kwargs):
|
||||
return httpd.FixtureServer(doc_root, url="http://%s:0/" % moznetwork.get_ip())
|
||||
def http_server(doc_root, ssl_config, host="127.0.0.1", **kwargs):
|
||||
return httpd.FixtureServer(doc_root, url="http://{}:0/".format(host), **kwargs)
|
||||
|
||||
|
||||
def https_server(doc_root, ssl_config, **kwargs):
|
||||
def https_server(doc_root, ssl_config, host="127.0.0.1", **kwargs):
|
||||
return httpd.FixtureServer(doc_root,
|
||||
url="https://%s:0/" % moznetwork.get_ip(),
|
||||
url="https://{}:0/".format(host),
|
||||
ssl_key=ssl_config["key_path"],
|
||||
ssl_cert=ssl_config["cert_path"])
|
||||
ssl_cert=ssl_config["cert_path"],
|
||||
**kwargs)
|
||||
|
||||
|
||||
def start_servers(doc_root, ssl_config, **kwargs):
|
||||
@ -173,7 +172,6 @@ def start(doc_root=None, **kwargs):
|
||||
|
||||
global servers
|
||||
servers = start_servers(doc_root, ssl_config, **kwargs)
|
||||
|
||||
return servers
|
||||
|
||||
|
||||
@ -212,7 +210,7 @@ def main(args):
|
||||
|
||||
servers = start(args.doc_root)
|
||||
for url in iter_url(servers):
|
||||
print >>sys.stderr, "%s: listening on %s" % (sys.argv[0], url)
|
||||
print >>sys.stderr, "{}: listening on {}".format(sys.argv[0], url)
|
||||
|
||||
try:
|
||||
while any(proc.is_alive for proc in iter_proc(servers)):
|
||||
|
@ -186,25 +186,6 @@ class Device(object):
|
||||
adb.wait()
|
||||
self.dm._verifyZip()
|
||||
|
||||
def setup_port_forwarding(self, local_port=None, remote_port=2828):
|
||||
"""
|
||||
Set up TCP port forwarding to the specified port on the device,
|
||||
using any availble local port (if none specified), and return the local port.
|
||||
|
||||
:param local_port: The local port to forward from, if unspecified a
|
||||
random port is chosen.
|
||||
:param remote_port: The remote port to forward to, defaults to 2828.
|
||||
:returns: The local_port being forwarded.
|
||||
"""
|
||||
if not local_port:
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
s.bind(("", 0))
|
||||
local_port = s.getsockname()[1]
|
||||
s.close()
|
||||
|
||||
self.dm.forward('tcp:%d' % int(local_port), 'tcp:%d' % int(remote_port))
|
||||
return local_port
|
||||
|
||||
def wait_for_net(self):
|
||||
active = False
|
||||
time_out = 0
|
||||
|
@ -30,9 +30,9 @@ config = {
|
||||
'tooltool_script': ["/builds/tooltool.py"],
|
||||
'tooltool_bootstrap': "setup.sh",
|
||||
'enable_count_ctors': True,
|
||||
'enable_talos_sendchange': False,
|
||||
# allows triggering of test jobs when --artifact try syntax is detected on buildbot
|
||||
# allows triggering of dependent jobs when --artifact try syntax is detected on buildbot
|
||||
'enable_unittest_sendchange': True,
|
||||
'enable_talos_sendchange': True,
|
||||
'perfherder_extra_options': ['artifact'],
|
||||
#########################################################################
|
||||
|
||||
|
@ -24,9 +24,9 @@ config = {
|
||||
'tooltool_script': ["/builds/tooltool.py"],
|
||||
'tooltool_bootstrap': "setup.sh",
|
||||
'enable_count_ctors': True,
|
||||
'enable_talos_sendchange': False,
|
||||
# allows triggering of test jobs when --artifact try syntax is detected on buildbot
|
||||
# allows triggering of dependent jobs when --artifact try syntax is detected on buildbot
|
||||
'enable_unittest_sendchange': True,
|
||||
'enable_talos_sendchange': True,
|
||||
'perfherder_extra_options': ['artifact'],
|
||||
#########################################################################
|
||||
|
||||
|
@ -27,9 +27,9 @@ config = {
|
||||
'tooltool_script': ["/builds/tooltool.py"],
|
||||
'tooltool_bootstrap': "setup.sh",
|
||||
'enable_count_ctors': False,
|
||||
'enable_talos_sendchange': False,
|
||||
# allows triggering of test jobs when --artifact try syntax is detected on buildbot
|
||||
# allows triggering of dependent jobs when --artifact try syntax is detected on buildbot
|
||||
'enable_unittest_sendchange': True,
|
||||
'enable_talos_sendchange': True,
|
||||
'perfherder_extra_options': ['artifact'],
|
||||
#########################################################################
|
||||
|
||||
|
@ -134,7 +134,7 @@
|
||||
border-radius: 4px;
|
||||
border: 1px solid #b5b5b5;
|
||||
border-bottom-width: 0;
|
||||
box-shadow: 0 1px 12px #666;
|
||||
box-shadow: 0 1px 3px #c1c1c1;
|
||||
}
|
||||
|
||||
.keep-open .dropdown-popup {
|
||||
@ -153,7 +153,7 @@
|
||||
position: absolute;
|
||||
top: 30px; /* offset arrow from top of popup */
|
||||
left: -16px;
|
||||
width: 24px;
|
||||
width: 16px;
|
||||
height: 24px;
|
||||
background-image: url("chrome://global/skin/reader/RM-Type-Controls-Arrow.svg");
|
||||
display: block;
|
||||
|
@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- 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/. -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<polygon opacity="0.15" points="16.583,0.015 16.569,0 4.583,12 16.569,24 16.583,23.985"/>
|
||||
<polygon fill="#fbfbfb" points="16.575,1.021 16.561,1.008 5.583,12 16.577,23.008 16.591,22.994 "/>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- 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/. -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 24">
|
||||
<polygon points="16.58 0.01 16.57 0 4.58 12 16.57 24 16.58 23.98 16.58 0.01" fill="#b5b5b5"/>
|
||||
<polyline points="16.63 1.51 6.08 12.01 16.63 22.5" fill="#fbfbfb"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 521 B After Width: | Height: | Size: 486 B |
@ -221,6 +221,14 @@ auto CodecProxy::Release() const -> bool
|
||||
return mozilla::jni::Method<Release_t>::Call(CodecProxy::mCtx, nullptr);
|
||||
}
|
||||
|
||||
constexpr char CodecProxy::ReleaseOutput_t::name[];
|
||||
constexpr char CodecProxy::ReleaseOutput_t::signature[];
|
||||
|
||||
auto CodecProxy::ReleaseOutput(mozilla::jni::Object::Param a0, bool a1) const -> bool
|
||||
{
|
||||
return mozilla::jni::Method<ReleaseOutput_t>::Call(CodecProxy::mCtx, nullptr, a0, a1);
|
||||
}
|
||||
|
||||
const char CodecProxy::NativeCallbacks::name[] =
|
||||
"org/mozilla/gecko/media/CodecProxy$NativeCallbacks";
|
||||
|
||||
|
@ -765,6 +765,27 @@ public:
|
||||
|
||||
auto Release() const -> bool;
|
||||
|
||||
struct ReleaseOutput_t {
|
||||
typedef CodecProxy Owner;
|
||||
typedef bool ReturnType;
|
||||
typedef bool SetterType;
|
||||
typedef mozilla::jni::Args<
|
||||
mozilla::jni::Object::Param,
|
||||
bool> Args;
|
||||
static constexpr char name[] = "releaseOutput";
|
||||
static constexpr char signature[] =
|
||||
"(Lorg/mozilla/gecko/media/Sample;Z)Z";
|
||||
static const bool isStatic = false;
|
||||
static const mozilla::jni::ExceptionMode exceptionMode =
|
||||
mozilla::jni::ExceptionMode::ABORT;
|
||||
static const mozilla::jni::CallingThread callingThread =
|
||||
mozilla::jni::CallingThread::ANY;
|
||||
static const mozilla::jni::DispatchTarget dispatchTarget =
|
||||
mozilla::jni::DispatchTarget::CURRENT;
|
||||
};
|
||||
|
||||
auto ReleaseOutput(mozilla::jni::Object::Param, bool) const -> bool;
|
||||
|
||||
static const mozilla::jni::CallingThread callingThread =
|
||||
mozilla::jni::CallingThread::ANY;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user