Merge m-c to autoland, a=merge

MozReview-Commit-ID: Al9lnfQMbTU
This commit is contained in:
Wes Kocher 2017-09-29 14:48:58 -07:00
Родитель 2d79871195 eb9a2ed0f2
Коммит ef10ff52f7
112 изменённых файлов: 7774 добавлений и 3086 удалений

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

@ -105,10 +105,4 @@ jobs:
target-tasks-method: nightly_file_update
run-on-projects:
- mozilla-central
when:
by-project:
# No default branch
mozilla-central:
# Buildbot start time is 10:02am UTC, until we are able to
# disable buildbot scheduling, use +12h
- {hour: 22, minute: 0}
when: [] # don't run for now due to unforeseen issues

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

@ -1,5 +1,5 @@
This is the PDF.js project output, https://github.com/mozilla/pdf.js
Current extension version is: 1.9.597
Current extension version is: 1.9.607
Taken from upstream commit: f3987bba
Taken from upstream commit: b3f84112

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

@ -1511,6 +1511,9 @@ class DOMCMapReaderFactory {
this.isCompressed = isCompressed;
}
fetch({ name }) {
if (!this.baseUrl) {
return Promise.reject(new Error('CMap baseUrl must be specified, ' + 'see "PDFJS.cMapUrl" (and also "PDFJS.cMapPacked").'));
}
if (!name) {
return Promise.reject(new Error('CMap name must be specified.'));
}
@ -1990,6 +1993,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
if (worker.destroyed) {
return Promise.reject(new Error('Worker was destroyed'));
}
let apiVersion = '1.9.607';
source.disableAutoFetch = (0, _dom_utils.getDefaultSetting)('disableAutoFetch');
source.disableStream = (0, _dom_utils.getDefaultSetting)('disableStream');
source.chunkedViewerLoading = !!pdfDataRangeTransport;
@ -1999,6 +2003,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
}
return worker.messageHandler.sendWithPromise('GetDocRequest', {
docId,
apiVersion,
source: {
data: source.data,
url: source.url,
@ -3309,8 +3314,8 @@ var _UnsupportedManager = function UnsupportedManagerClosure() {
}();
var version, build;
{
exports.version = version = '1.9.597';
exports.build = build = 'f3987bba';
exports.version = version = '1.9.607';
exports.build = build = 'b3f84112';
}
exports.getDocument = getDocument;
exports.LoopbackPort = LoopbackPort;
@ -5049,8 +5054,8 @@ exports.SVGGraphics = SVGGraphics;
"use strict";
var pdfjsVersion = '1.9.597';
var pdfjsBuild = 'f3987bba';
var pdfjsVersion = '1.9.607';
var pdfjsBuild = 'b3f84112';
var pdfjsSharedUtil = __w_pdfjs_require__(0);
var pdfjsDisplayGlobal = __w_pdfjs_require__(13);
var pdfjsDisplayAPI = __w_pdfjs_require__(3);
@ -8176,8 +8181,8 @@ if (!_global_scope2.default.PDFJS) {
}
var PDFJS = _global_scope2.default.PDFJS;
{
PDFJS.version = '1.9.597';
PDFJS.build = 'f3987bba';
PDFJS.version = '1.9.607';
PDFJS.build = 'b3f84112';
}
PDFJS.pdfBug = false;
if (PDFJS.verbosity !== undefined) {

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

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

@ -55,6 +55,11 @@
/** Begin titlebar **/
#titlebar {
/* Centrally align content items vertically */
-moz-box-pack: center;
}
#titlebar-content {
/* Ensure the the content part of the titlebar does not shrink. */
min-height: inherit;
@ -69,6 +74,8 @@
#titlebar-secondary-buttonbox {
position: relative;
z-index: 1;
/* Centrally align indicators and full screen button vertically */
-moz-box-align: center;
}
#titlebar-buttonbox-container {
@ -103,28 +110,6 @@
min-height: calc(var(--tab-min-height) + var(--space-above-tabbar) - var(--tab-toolbar-navbar-overlap));
}
/**
* We also vertically center the window buttons.
*/
#titlebar-buttonbox-container {
-moz-box-align: start;
}
#main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-buttonbox-container,
#main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > #titlebar-fullscreen-button {
/*
* To vertically center the window controls, we place them at half the
* height of the tabstrip ((tab height + drag space) / 2) - half the height
* of the window controls (16px / 2).
* */
margin-top: calc((var(--tab-min-height) + var(--space-above-tabbar)) / 2 - 8px);
}
#main-window:not([tabsintitlebar]) > #titlebar > #titlebar-content > #titlebar-buttonbox-container,
#main-window:not([tabsintitlebar]) > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > #titlebar-fullscreen-button {
margin-top: 3px;
}
/** End titlebar **/
#main-window[chromehidden~="toolbar"][chromehidden~="location"][chromehidden~="directories"] {

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

@ -15,6 +15,7 @@
"cxx": "/builds/worker/workspace/build/src/gcc/bin/g++",
"as": "/builds/worker/workspace/build/src/gcc/bin/gcc",
"patches": [
"llvm-debug-frame.patch"
"llvm-debug-frame.patch",
"hide-gcda-profiling-symbols.patch"
]
}

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

@ -0,0 +1,108 @@
diff --git a/compiler-rt/lib/profile/GCDAProfiling.c b/compiler-rt/lib/profile/GCDAProfiling.c
index 138af6ec4..f0c05075a 100644
--- a/compiler-rt/lib/profile/GCDAProfiling.c
+++ b/compiler-rt/lib/profile/GCDAProfiling.c
@@ -231,6 +231,7 @@ static void unmap_file() {
* profiling enabled will emit to a different file. Only one file may be
* started at a time.
*/
+COMPILER_RT_VISIBILITY
void llvm_gcda_start_file(const char *orig_filename, const char version[4],
uint32_t checksum) {
const char *mode = "r+b";
@@ -298,6 +299,7 @@ void llvm_gcda_start_file(const char *orig_filename, const char version[4],
/* Given an array of pointers to counters (counters), increment the n-th one,
* where we're also given a pointer to n (predecessor).
*/
+COMPILER_RT_VISIBILITY
void llvm_gcda_increment_indirect_counter(uint32_t *predecessor,
uint64_t **counters) {
uint64_t *counter;
@@ -320,6 +322,7 @@ void llvm_gcda_increment_indirect_counter(uint32_t *predecessor,
#endif
}
+COMPILER_RT_VISIBILITY
void llvm_gcda_emit_function(uint32_t ident, const char *function_name,
uint32_t func_checksum, uint8_t use_extra_checksum,
uint32_t cfg_checksum) {
@@ -346,6 +349,7 @@ void llvm_gcda_emit_function(uint32_t ident, const char *function_name,
write_string(function_name);
}
+COMPILER_RT_VISIBILITY
void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {
uint32_t i;
uint64_t *old_ctrs = NULL;
@@ -397,6 +401,7 @@ void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {
#endif
}
+COMPILER_RT_VISIBILITY
void llvm_gcda_summary_info() {
const uint32_t obj_summary_len = 9; /* Length for gcov compatibility. */
uint32_t i;
@@ -450,6 +455,7 @@ void llvm_gcda_summary_info() {
#endif
}
+COMPILER_RT_VISIBILITY
void llvm_gcda_end_file() {
/* Write out EOF record. */
if (output_file) {
@@ -474,6 +480,7 @@ void llvm_gcda_end_file() {
#endif
}
+COMPILER_RT_VISIBILITY
void llvm_register_writeout_function(writeout_fn fn) {
struct writeout_fn_node *new_node = malloc(sizeof(struct writeout_fn_node));
new_node->fn = fn;
@@ -487,6 +494,7 @@ void llvm_register_writeout_function(writeout_fn fn) {
}
}
+COMPILER_RT_VISIBILITY
void llvm_writeout_files(void) {
struct writeout_fn_node *curr = writeout_fn_head;
@@ -496,6 +504,7 @@ void llvm_writeout_files(void) {
}
}
+COMPILER_RT_VISIBILITY
void llvm_delete_writeout_function_list(void) {
while (writeout_fn_head) {
struct writeout_fn_node *node = writeout_fn_head;
@@ -506,6 +515,7 @@ void llvm_delete_writeout_function_list(void) {
writeout_fn_head = writeout_fn_tail = NULL;
}
+COMPILER_RT_VISIBILITY
void llvm_register_flush_function(flush_fn fn) {
struct flush_fn_node *new_node = malloc(sizeof(struct flush_fn_node));
new_node->fn = fn;
@@ -519,6 +529,7 @@ void llvm_register_flush_function(flush_fn fn) {
}
}
+COMPILER_RT_VISIBILITY
void __gcov_flush() {
struct flush_fn_node *curr = flush_fn_head;
@@ -528,6 +539,7 @@ void __gcov_flush() {
}
}
+COMPILER_RT_VISIBILITY
void llvm_delete_flush_function_list(void) {
while (flush_fn_head) {
struct flush_fn_node *node = flush_fn_head;
@@ -538,6 +550,7 @@ void llvm_delete_flush_function_list(void) {
flush_fn_head = flush_fn_tail = NULL;
}
+COMPILER_RT_VISIBILITY
void llvm_gcov_init(writeout_fn wfn, flush_fn ffn) {
static int atexit_ran = 0;

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

@ -409,6 +409,78 @@ body {
:root.theme-dark .CodeMirror-scrollbar-filler {
background: transparent;
}
.modal-wrapper {
position: fixed;
display: flex;
justify-content: center;
width: 100%;
height: 100%;
top: 0;
left: 0;
transition: z-index 200ms;
z-index: 100;
}
.modal {
top: 0;
height: 230px;
width: 500px;
background-color: var(--theme-codemirror-gutter-background);
transform: translateY(-250px);
transition: transform 150ms cubic-bezier(0.07, 0.95, 0, 1);
box-shadow: 2px 4px 6px var(--popup-shadow-color);
}
.modal.entering,
.modal.exited {
transform: translateY(-250px);
}
.modal.entered,
.modal.exiting {
transform: translateY(30px);
}
@media (max-width: 520px) {
.modal {
width: 80%;
left: 10%;
}
}
.shortcuts-content {
padding: 15px;
}
.shortcuts-content h2 {
margin-top: 2px;
margin-bottom: 2px;
color: var(--theme-graphs-bluegrey);
}
.shortcuts-section {
margin-bottom: 20px;
}
.shortcuts-list {
list-style: none;
margin: 0px;
padding: 0px;
overflow: auto;
width: calc(100% - 1px); /* 1px fixes the hidden right border */
}
.shortcuts-modal {
height: fit-content;
}
.shortcuts-list li {
width: 40%;
color: var(--theme-body-color);
padding-top: 5px;
display: flex;
justify-content: space-between;
border: 1px solid transparent;
}
:root.theme-light,
:root .theme-light {
--search-overlays-semitransparent: rgba(221, 225, 228, 0.66);
@ -424,6 +496,17 @@ body {
box-sizing: border-box;
}
button {
background: transparent;
outline: none;
border: none;
}
button:hover,
button:focus {
background-color: var(--theme-toolbar-background-hover);
}
.debugger {
display: flex;
flex: 1;
@ -793,6 +876,7 @@ menuseparator {
.file,
.worker,
.refresh,
.shortcut,
.add-button {
fill: var(--theme-splitter-color);
}
@ -816,6 +900,7 @@ menuseparator {
.folder svg,
.worker svg,
.refresh svg,
.shortcut svg,
.add-button svg {
width: 15px;
}
@ -828,6 +913,7 @@ menuseparator {
.domain svg,
.folder svg,
.refresh svg,
.shortcut svg,
.worker svg {
margin-inline-end: 5px;
}
@ -857,6 +943,17 @@ html .arrow.expanded svg {
.arrow.hidden {
visibility: hidden;
}
.webpack svg {
width: 15px;
height: 15px;
margin-right: 5px;
vertical-align: bottom;
}
.theme-dark .webpack {
opacity: 0.5;
}
.managed-tree .tree {
-webkit-user-select: none;
-moz-user-select: none;
@ -1301,38 +1398,6 @@ html[dir="rtl"] .managed-tree .tree .node > div {
user-select: none;
}
.sources-header {
height: 29px;
background-color: var(--theme-toolbar-background);
border-bottom: 1px solid var(--theme-splitter-color);
padding-top: 0px;
padding-bottom: 0px;
line-height: 30px;
font-size: 1.2em;
display: flex;
align-items: baseline;
-moz-user-select: none;
user-select: none;
justify-content: flex-end;
}
.theme-dark .sources-header {
background-color: var(--theme-tab-toolbar-background);
}
.sources-header {
padding-inline-start: 10px;
}
.sources-header-info {
font-size: 12px;
color: var(--theme-comment-alt);
font-weight: lighter;
white-space: nowrap;
padding-inline-end: 10px;
cursor: default;
}
.sources-list {
flex: 1;
display: flex;
@ -1347,6 +1412,14 @@ html[dir="rtl"] .managed-tree .tree .node > div {
overflow-y: auto;
}
.sources-list .managed-tree .tree .node {
padding: 0px 0px 0px 3px;
}
.sources-list .tree .arrow svg {
margin-top: 0px;
}
.theme-dark .sources-list .tree .node:not(.focused) svg {
fill: var(--theme-content-color3);
}
@ -1355,6 +1428,15 @@ html[dir="rtl"] .managed-tree .tree .node > div {
background-color: var(--theme-tab-toolbar-background);
}
.sources-list .tree .focused .label {
background-color: var(--theme-selection-background);
}
.sources-list .tree .label {
padding: 3px 0px 3px 0px;
display: inline-block;
}
.no-sources-message {
font-size: 12px;
color: var(--theme-comment-alt);
@ -1366,56 +1448,58 @@ html[dir="rtl"] .managed-tree .tree .node > div {
align-items: center;
}
.sources-panel .source-footer {
position: relative;
}
.sources-panel .outline {
display: flex;
flex: 1;
}
.sources-panel .outline.hidden {
display: none;
}
.hidden {
display: none;
}
.source-footer {
.source-outline-tabs {
width: 100%;
background: var(--theme-body-background);
border-top: 1px solid var(--theme-splitter-color);
display: flex;
-moz-user-select: none;
user-select: none;
box-sizing: border-box;
}
.source-footer .tab {
.source-outline-tabs .tab {
flex: 1;
justify-content: center;
border: 1px solid transparent;
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom: 1px solid transparent;
border-left: 1px solid transparent;
display: inline-flex;
position: relative;
transition: all 0.25s ease;
overflow: hidden;
padding: 5px;
padding: 6.5px;
margin-bottom: 0px;
margin-top: -1px;
cursor: default;
}
.source-footer .tab:hover {
.source-outline-tabs .tab:first-child {
border-left: 0;
}
.source-outline-tabs .tab:hover {
background-color: var(--theme-toolbar-background-alt);
border-color: var(--theme-splitter-color);
}
.source-footer .tab.active {
.source-outline-tabs .tab {
color: var(--theme-body-color);
background-color: var(--theme-toolbar-background);
border-color: var(--theme-splitter-color);
}
.source-footer .tab.active path,
.source-footer .tab:hover path {
.source-outline-tabs .tab.active {
background-color: var(--theme-body-background);
border-bottom-color: transparent;
}
.source-outline-tabs .tab.active path,
.source-outline-tabs .tab:hover path {
fill: var(--theme-body-color);
}
.outline {
@ -1504,14 +1588,14 @@ html[dir="rtl"] .managed-tree .tree .node > div {
}
.toggle-button-start,
.toggle-button-end {
transform: translate(0, 2px);
transform: translate(0, 0px);
transition: transform 0.25s ease-in-out;
padding: 5px 2px;
padding: 5px 5px;
}
.toggle-button-start.vertical,
.toggle-button-end.vertical {
padding: 4px 2px;
padding: 2.5px 2.5px;
}
.toggle-button-start svg,
@ -1526,12 +1610,12 @@ html[dir="rtl"] .managed-tree .tree .node > div {
}
.toggle-button-end {
margin-inline-end: 5px;
margin-inline-end: 0px;
margin-inline-start: auto;
}
.toggle-button-start {
margin-inline-start: 5px;
margin-inline-start: 0px;
}
html:not([dir="rtl"]) .toggle-button-end svg,
@ -2244,11 +2328,6 @@ html[dir="rtl"] .arrow svg,
--theme-conditional-breakpoint-color: var(--theme-body-color);
}
.paused .in-scope .CodeMirror-line,
.paused .in-scope .CodeMirror-linenumber {
opacity: 1;
}
.paused .CodeMirror-line,
.paused .CodeMirror-linenumber {
opacity: 0.7;
@ -2262,7 +2341,7 @@ html[dir="rtl"] .arrow svg,
position: absolute;
height: calc(100% - 31px);
width: calc(100% - 1.5px);
top: 30px;
top: 29px;
left: 0px;
--editor-footer-height: 24px;
}
@ -2457,7 +2536,6 @@ html[dir="rtl"] .editor-mount {
}
.breakpoints-list * {
-moz-user-select: none;
user-select: none;
}
@ -2621,8 +2699,8 @@ html .breakpoints-list .breakpoint.paused {
position: relative;
}
.expression-container .close-btn {
display: none;
.expression-content .tree-node {
overflow-x: hidden;
}
.expression-container:hover .close-btn {
@ -2679,8 +2757,9 @@ html .breakpoints-list .breakpoint.paused {
.why-paused .message.warning {
font-size: 10px;
color: var(--theme-graphs-full-red);
color: var(--theme-graphs-red);
font-weight: bold;
font-style: normal;
}
.frames ul {
list-style: none;
@ -2819,7 +2898,18 @@ html .breakpoints-list .breakpoint.paused {
.event-listeners .listener:hover .close {
display: block;
}
.workers-list * {
user-select: none;
}
.workers-list .worker {
font-size: 12px;
color: var(--theme-content-color1);
padding: 0.5em 1em 0.5em 0.5em;
line-height: 1em;
position: relative;
transition: all 0.25s ease;
}
:root {
--accordion-header-background: var(--theme-toolbar-background);
}
@ -2900,10 +2990,8 @@ html .breakpoints-list .breakpoint.paused {
flex: 0 0 29px;
border-bottom: 1px solid var(--theme-splitter-color);
display: flex;
height: 29px;
overflow: hidden;
position: sticky;
top: 0;
z-index: 1;
background-color: var(--theme-toolbar-background);
}
@ -2980,6 +3068,17 @@ html .command-bar > button:disabled {
.command-bar button.pause-exceptions.all {
color: var(--theme-highlight-blue);
}
.bottom {
border-bottom: none;
background-color: var(--theme-body-background);
border-top: 1px solid var(--theme-splitter-color);
flex: 0 0 27px;
}
.command-bar > button {
padding: 6px 5px;
}
.object-node.default-property {
opacity: 0.6;
}
@ -3062,7 +3161,7 @@ html .command-bar > button:disabled {
color: var(--theme-comment-alt);
background-color: var(--theme-toolbar-background);
font-weight: lighter;
z-index: 100;
z-index: 10;
user-select: none;
}
@ -3281,45 +3380,6 @@ html[dir="rtl"] .dropdown {
left: 0;
top: 0;
}
.modal-wrapper {
position: fixed;
display: flex;
justify-content: center;
width: 100%;
height: 100%;
top: 0;
left: 0;
transition: z-index 200ms;
z-index: 9;
}
.modal {
top: 0;
z-index: 10;
width: 500px;
height: 230px;
background-color: var(--theme-codemirror-gutter-background);
transform: translateY(-250px);
transition: transform 150ms cubic-bezier(0.07, 0.95, 0, 1);
box-shadow: 2px 4px 6px var(--popup-shadow-color);
}
.modal.entering,
.modal.exited {
transform: translateY(-250px);
}
.modal.entered,
.modal.exiting {
transform: translateY(30px);
}
@media (max-width: 520px) {
.modal {
width: 80%;
left: 10%;
}
}
.symbol-modal-wrapper {
position: fixed;
width: 100%;

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -31,11 +31,11 @@ DebuggerPanel.prototype = {
tabTarget: this.toolbox.target,
debuggerClient: this.toolbox.target.client,
sourceMaps: this.toolbox.sourceMapService,
// Open a link in a new browser tab.
toolboxActions: {
// Open a link in a new browser tab.
openLink: this.openLink.bind(this)
}
})
});
this._actions = actions;
this._store = store;

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

@ -28903,6 +28903,10 @@ var _getSymbols2 = _interopRequireDefault(_getSymbols);
var _ast = __webpack_require__(1051);
var _getScopes = __webpack_require__(1186);
var _getScopes2 = _interopRequireDefault(_getScopes);
var _sources = __webpack_require__(1171);
var _getOutOfScopeLocations = __webpack_require__(1072);
@ -28926,7 +28930,9 @@ self.onmessage = workerHandler({
getClosestExpression: _closest.getClosestExpression,
getOutOfScopeLocations: _getOutOfScopeLocations2.default,
getSymbols: _getSymbols2.default,
getScopes: _getScopes2.default,
clearSymbols: _getSymbols.clearSymbols,
clearScopes: _getScopes.clearScopes,
clearASTs: _ast.clearASTs,
hasSource: _sources.hasSource,
setSource: _sources.setSource,
@ -29397,6 +29403,15 @@ function getComments(ast) {
}));
}
function getClassName(path) {
var classDeclaration = path.findParent(_p => _p.isClassDeclaration());
if (!classDeclaration) {
return null;
}
return classDeclaration.node.id.name;
}
function extractSymbols(source) {
var functions = [];
var variables = [];
@ -29414,6 +29429,7 @@ function extractSymbols(source) {
if ((0, _helpers.isFunction)(path)) {
functions.push({
name: (0, _getFunctionName2.default)(path),
klass: getClassName(path),
location: path.node.loc,
parameterNames: getFunctionParameterNames(path),
identifier: path.node.id
@ -29671,12 +29687,7 @@ function getSnippet(path, prevPath) {
}
function formatSymbols(source) {
var _getSymbols = getSymbols(source),
objectProperties = _getSymbols.objectProperties,
memberExpressions = _getSymbols.memberExpressions,
callExpressions = _getSymbols.callExpressions,
identifiers = _getSymbols.identifiers,
variables = _getSymbols.variables;
var symbols = getSymbols(source);
function formatLocation(loc) {
if (!loc) {
@ -29696,10 +29707,11 @@ function formatSymbols(source) {
var exprLoc = formatLocation(symbol.expressionLocation);
var params = symbol.parameterNames ? symbol.parameterNames.join(", ") : "";
var expression = symbol.expression || "";
return `${loc} ${exprLoc} ${expression} ${symbol.name} ${params}`;
var klass = symbol.klass || "";
return `${loc} ${exprLoc} ${expression} ${symbol.name} ${params} ${klass}`;
}
return ["properties", objectProperties.map(summarize).join("\n"), "member expressions", memberExpressions.map(summarize).join("\n"), "call expressions", callExpressions.map(summarize).join("\n"), "identifiers", identifiers.map(summarize).join("\n"), "variables", variables.map(summarize).join("\n")].join("\n");
return Object.keys(symbols).map(name => `${name}:\n ${symbols[name].map(summarize).join("\n")}`);
}
function clearSymbols() {
@ -33056,6 +33068,301 @@ function clearSources() {
cachedSources = new Map();
}
/***/ }),
/* 1172 */,
/* 1173 */,
/* 1174 */,
/* 1175 */,
/* 1176 */,
/* 1177 */,
/* 1178 */,
/* 1179 */,
/* 1180 */,
/* 1181 */,
/* 1182 */,
/* 1183 */,
/* 1184 */,
/* 1185 */,
/* 1186 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = getScopes;
exports.clearScopes = clearScopes;
var _ast = __webpack_require__(1051);
var _sources = __webpack_require__(1171);
var _parser = __webpack_require__(1187);
var parsedScopesCache = new Map();
function getScopes(location) {
var sourceId = location.sourceId;
var parsedScopes = parsedScopesCache.get(sourceId);
if (!parsedScopes) {
var visitor = (0, _parser.createParseJSScopeVisitor)(sourceId);
(0, _ast.traverseAst)((0, _sources.getSource)(sourceId), visitor.traverseVisitor);
parsedScopes = visitor.toParsedScopes();
parsedScopesCache.set(sourceId, parsedScopes);
}
return (0, _parser.findScopes)(parsedScopes, location);
}
function clearScopes() {
parsedScopesCache = new Map();
}
/***/ }),
/* 1187 */
/***/ (function(module, exports) {
/* 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/. */
function createTempScope(type, parent, loc) {
const result = {
type,
parent,
children: [],
loc: loc,
names: Object.create(null)
};
if (parent) {
parent.children.push(result);
}
return result;
}
function isNode(node, type) {
return node ? node.type === type : false;
}
function getFunctionScope(scope) {
let s = scope;
while (s.type !== "Function" && s.type !== "Script") {
if (!s.parent) {
return s;
}
s = s.parent;
}
return s;
}
function fromBabelLocation(location, sourceId) {
return {
sourceId,
line: location.line,
column: location.column
};
}
function parseDeclarator(declaratorId, targetScope, type) {
if (isNode(declaratorId, "Identifier")) {
targetScope.names[declaratorId.name] = { type, refs: [] };
} else if (isNode(declaratorId, "ObjectPattern")) {
declaratorId.properties.forEach(prop => {
parseDeclarator(prop.value, targetScope, type);
});
} else if (isNode(declaratorId, "ArrayPattern")) {
declaratorId.elements.forEach(item => {
parseDeclarator(item, targetScope, type);
});
} else if (isNode(declaratorId, "AssignmentPattern")) {
parseDeclarator(declaratorId.left, targetScope, type);
} else if (isNode(declaratorId, "RestElement")) {
parseDeclarator(declaratorId.argument, targetScope, type);
}
}
function isLetOrConst(node) {
return node.kind === "let" || node.kind === "const";
}
function hasLetOrConst(path) {
return path.node.body.some(node => {
if (!isNode(node, "VariableDeclaration")) {
return false;
}
return isLetOrConst(node);
});
}
function findIdentifierInScopes(scope, name) {
// Find nearest outer scope with the specifed name and add reference.
for (let s = scope; s; s = s.parent) {
if (name in s.names) {
return s;
}
}
return null;
}
function toParsedScopes(children, sourceId) {
if (!children || children.length === 0) {
return undefined;
}
return children.map(scope => {
// Removing unneed information from TempScope such as parent reference and
// name types. We also need to convert BabelLocation to the Location type.
const bindings = Object.keys(scope.names).reduce((_bindings, n) => {
const nameRefs = scope.names[n];
switch (nameRefs.type) {
case "var":
case "let":
case "const":
case "param":
_bindings[n] = nameRefs.refs.map(location => {
return fromBabelLocation(location, sourceId);
});
break;
}
return _bindings;
}, Object.create(null));
return {
start: fromBabelLocation(scope.loc.start, sourceId),
end: fromBabelLocation(scope.loc.end, sourceId),
type: scope.type.toLowerCase(),
bindings,
children: toParsedScopes(scope.children, sourceId)
};
});
}
/**
* Creates at visitor for babel-traverse that will parse/extract all bindings
* information from the source. See also findScopes to perform lookup of the
* scope information for specific location.
*/
function createParseJSScopeVisitor(sourceId) {
let parent = createTempScope("Global", null, null);
let savedParents = new WeakMap();
const traverseVisitor = {
enter(path) {
const tree = path.node;
const location = path.node.loc;
if (path.isProgram()) {
savedParents.set(path, parent);
parent = createTempScope("Script", parent, location);
return;
}
if (path.isFunctionDeclaration() || path.isFunctionExpression() || path.isArrowFunctionExpression()) {
savedParents.set(path, parent);
const scope = createTempScope("Function", parent, location);
if (isNode(tree.id, "Identifier")) {
const functionName = { type: "fn", refs: [] };
getFunctionScope(parent).names[tree.id.name] = functionName;
scope.names[tree.id.name] = functionName;
}
tree.params.forEach(param => parseDeclarator(param, scope, "param"));
parent = scope;
return;
}
if (path.isForInStatement() || path.isForStatement()) {
const init = tree.init || tree.left;
if (isNode(init, "VariableDeclaration") && isLetOrConst(init)) {
// Debugger will create new lexical environment for the for.
savedParents.set(path, parent);
parent = createTempScope("For", parent, location);
}
return;
}
if (path.isCatchClause()) {
savedParents.set(path, parent);
parent = createTempScope("Catch", parent, location);
parseDeclarator(tree.param, parent, "param");
return;
}
if (path.isBlockStatement()) {
if (hasLetOrConst(path)) {
// Debugger will create new lexical environment for the block.
savedParents.set(path, parent);
parent = createTempScope("Block", parent, location);
}
return;
}
if (path.isVariableDeclaration()) {
// Finds right lexical environment
const hoistAt = !isLetOrConst(tree) ? getFunctionScope(parent) : parent;
tree.declarations.forEach(declarator => {
parseDeclarator(declarator.id, hoistAt, tree.kind);
});
return;
}
if (path.isIdentifier()) {
const scope = findIdentifierInScopes(parent, tree.name);
if (scope) {
scope.names[tree.name].refs.push(tree.loc.start);
}
}
},
exit(path) {
const savedParent = savedParents.get(path);
if (savedParent) {
parent = savedParent;
savedParents.delete(path);
}
}
};
return {
traverseVisitor,
toParsedScopes() {
return toParsedScopes(parent.children, sourceId) || [];
}
};
}
function compareLocations(a, b) {
// According to type of Location.column can be undefined, if will not be the
// case here, ignoring flow error.
// $FlowIgnore
return a.line == b.line ? a.column - b.column : a.line - b.line;
}
/**
* Searches all scopes and their bindings at the specific location.
*/
function findScopes(scopes, location) {
// Find inner most in the tree structure.
let searchInScopes = scopes;
const found = [];
while (searchInScopes) {
let foundOne = searchInScopes.some(s => {
if (compareLocations(s.start, location) <= 0 && compareLocations(location, s.end) < 0) {
// Found the next scope, trying to search recusevly in its children.
found.unshift(s);
searchInScopes = s.children;
return true;
}
return false;
});
if (!foundOne) {
break;
}
}
return found.map(i => {
return {
type: i.type,
start: i.start,
end: i.end,
bindings: i.bindings
};
});
}
module.exports = {
createParseJSScopeVisitor,
findScopes
};
/***/ })
/******/ ]);
});

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

@ -600,6 +600,87 @@ module.exports = {
/***/ }),
/***/ 1172:
/***/ (function(module, exports, __webpack_require__) {
/* 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/. */
const md5 = __webpack_require__(248);
function originalToGeneratedId(originalId) {
const match = originalId.match(/(.*)\/originalSource/);
return match ? match[1] : "";
}
function generatedToOriginalId(generatedId, url) {
return `${generatedId}/originalSource-${md5(url)}`;
}
function isOriginalId(id) {
return !!id.match(/\/originalSource/);
}
function isGeneratedId(id) {
return !isOriginalId(id);
}
/**
* Trims the query part or reference identifier of a URL string, if necessary.
*/
function trimUrlQuery(url) {
let length = url.length;
let q1 = url.indexOf("?");
let q2 = url.indexOf("&");
let q3 = url.indexOf("#");
let q = Math.min(q1 != -1 ? q1 : length, q2 != -1 ? q2 : length, q3 != -1 ? q3 : length);
return url.slice(0, q);
}
// Map suffix to content type.
const contentMap = {
"js": "text/javascript",
"jsm": "text/javascript",
"ts": "text/typescript",
"tsx": "text/typescript-jsx",
"jsx": "text/jsx",
"coffee": "text/coffeescript",
"elm": "text/elm",
"cljs": "text/x-clojure"
};
/**
* Returns the content type for the specified URL. If no specific
* content type can be determined, "text/plain" is returned.
*
* @return String
* The content type.
*/
function getContentType(url) {
url = trimUrlQuery(url);
let dot = url.lastIndexOf(".");
if (dot >= 0) {
let name = url.substring(dot + 1);
if (name in contentMap) {
return contentMap[name];
}
}
return "text/plain";
}
module.exports = {
originalToGeneratedId,
generatedToOriginalId,
isOriginalId,
isGeneratedId,
getContentType,
contentMapForTesting: contentMap
};
/***/ }),
/***/ 1173:
/***/ (function(module, exports, __webpack_require__) {
@ -907,7 +988,7 @@ function shouldPrettyPrint(source) {
}
var _isPretty = isPretty(source);
var _isJavaScript = isJavaScript(source.url);
var _isJavaScript = isJavaScript(source);
var isOriginal = (0, _devtoolsSourceMap.isOriginalId)(source.id);
var hasSourceMap = source.sourceMapURL;
@ -928,10 +1009,8 @@ function shouldPrettyPrint(source) {
* @memberof utils/source
* @static
*/
function isJavaScript(url) {
var contentType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
return url && /\.(jsm|js)?$/.test(trimUrlQuery(url)) || contentType.includes("javascript");
function isJavaScript(source) {
return source.url && /\.(jsm|js)?$/.test(trimUrlQuery(source.url)) || !!(source.contentType && source.contentType.includes("javascript"));
}
/**
@ -2608,7 +2687,7 @@ const {
generatedToOriginalId,
isGeneratedId,
isOriginalId
} = __webpack_require__(899);
} = __webpack_require__(1172);
const { workerUtils: { WorkerDispatcher } } = __webpack_require__(1165);
@ -2617,6 +2696,7 @@ const dispatcher = new WorkerDispatcher();
const getOriginalURLs = dispatcher.task("getOriginalURLs");
const getGeneratedLocation = dispatcher.task("getGeneratedLocation");
const getOriginalLocation = dispatcher.task("getOriginalLocation");
const getLocationScopes = dispatcher.task("getLocationScopes");
const getOriginalSourceText = dispatcher.task("getOriginalSourceText");
const applySourceMap = dispatcher.task("applySourceMap");
const clearSourceMaps = dispatcher.task("clearSourceMaps");
@ -2631,6 +2711,7 @@ module.exports = {
getOriginalURLs,
getGeneratedLocation,
getOriginalLocation,
getLocationScopes,
getOriginalSourceText,
applySourceMap,
clearSourceMaps,
@ -2640,87 +2721,6 @@ module.exports = {
/***/ }),
/***/ 899:
/***/ (function(module, exports, __webpack_require__) {
/* 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/. */
const md5 = __webpack_require__(248);
function originalToGeneratedId(originalId) {
const match = originalId.match(/(.*)\/originalSource/);
return match ? match[1] : "";
}
function generatedToOriginalId(generatedId, url) {
return `${generatedId}/originalSource-${md5(url)}`;
}
function isOriginalId(id) {
return !!id.match(/\/originalSource/);
}
function isGeneratedId(id) {
return !isOriginalId(id);
}
/**
* Trims the query part or reference identifier of a URL string, if necessary.
*/
function trimUrlQuery(url) {
let length = url.length;
let q1 = url.indexOf("?");
let q2 = url.indexOf("&");
let q3 = url.indexOf("#");
let q = Math.min(q1 != -1 ? q1 : length, q2 != -1 ? q2 : length, q3 != -1 ? q3 : length);
return url.slice(0, q);
}
// Map suffix to content type.
const contentMap = {
"js": "text/javascript",
"jsm": "text/javascript",
"ts": "text/typescript",
"tsx": "text/typescript-jsx",
"jsx": "text/jsx",
"coffee": "text/coffeescript",
"elm": "text/elm",
"cljs": "text/x-clojure"
};
/**
* Returns the content type for the specified URL. If no specific
* content type can be determined, "text/plain" is returned.
*
* @return String
* The content type.
*/
function getContentType(url) {
url = trimUrlQuery(url);
let dot = url.lastIndexOf(".");
if (dot >= 0) {
let name = url.substring(dot + 1);
if (name in contentMap) {
return contentMap[name];
}
}
return "text/plain";
}
module.exports = {
originalToGeneratedId,
generatedToOriginalId,
isOriginalId,
isGeneratedId,
getContentType,
contentMapForTesting: contentMap
};
/***/ }),
/***/ 9:
/***/ (function(module, exports, __webpack_require__) {

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

@ -11,6 +11,11 @@ support-files =
examples/sourcemaps2/main.min.js
examples/sourcemaps2/main.js
examples/sourcemaps2/main.js.map
examples/wasm-sourcemaps/average.js
examples/wasm-sourcemaps/average.wasm
examples/wasm-sourcemaps/average.wasm.map
examples/wasm-sourcemaps/average.c
examples/wasm-sourcemaps/utils.js
examples/doc-async.html
examples/doc-asm.html
examples/doc-scripts.html
@ -26,6 +31,7 @@ support-files =
examples/doc-sourcemap-bogus.html
examples/doc-sources.html
examples/doc-return-values.html
examples/doc-wasm-sourcemaps.html
examples/asm.js
examples/async.js
examples/bogus-map.js
@ -44,6 +50,7 @@ support-files =
examples/script-switching-01.js
examples/times2.js
[browser_dbg-asm.js]
[browser_dbg-async-stepping.js]
[browser_dbg-breaking.js]
[browser_dbg-breaking-from-console.js]
@ -54,6 +61,7 @@ skip-if = true # Bug 1383576
[browser_dbg-breakpoints-cond.js]
[browser_dbg-call-stack.js]
[browser_dbg-expressions.js]
[browser_dbg-expressions-error.js]
[browser_dbg-scopes.js]
[browser_dbg-chrome-create.js]
[browser_dbg-chrome-debugging.js]
@ -89,3 +97,5 @@ skip-if = true # Bug 1393121, 1393299
[browser_dbg-sources.js]
[browser_dbg-tabs.js]
[browser_dbg-toggling-tools.js]
[browser_dbg-wasm-sourcemaps.js]
skip-if = true

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

@ -1,15 +1,25 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
add_task(async function() {
const dbg = await initDebugger("doc-asm.html");
await reload(dbg);
// Tests that asm.js AOT can be disabled and debugging of the asm.js code
// is working.
// After reload() we are getting getSources notifiction for old sources,
// using the debugger statement to really stop are reloaded page.
await waitForPaused(dbg);
await resume(dbg);
const {
setupTestRunner,
asm
} = require("devtools/client/debugger/new/integration-tests");
await waitForSources(dbg, "doc-asm.html", "asm.js");
add_task(function*() {
setupTestRunner(this);
yield asm(this);
// Expand nodes and make sure more sources appear.
is(findAllElements(dbg, "sourceNodes").length, 2);
await clickElement(dbg, "sourceArrow", 2);
is(findAllElements(dbg, "sourceNodes").length, 4);
await selectSource(dbg, "asm.js");
await addBreakpoint(dbg, "asm.js", 7);
invokeInTab("runAsm");
await waitForPaused(dbg);
assertPausedLocation(dbg, "asm.js", 7);
});

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

@ -39,21 +39,21 @@ add_task(async function() {
const dbg = await initDebugger("doc-scripts.html");
await selectSource(dbg, "simple2");
// Adding a conditional Breakpoint
dump('Adding a conditional Breakpoint\n')
await setConditionalBreakpoint(dbg, 5, "1");
await waitForDispatch(dbg, "ADD_BREAKPOINT");
let bp = findBreakpoint(dbg, "simple2", 5);
is(bp.condition, "1", "breakpoint is created with the condition");
assertEditorBreakpoint(dbg, 5, true);
// Editing a conditional Breakpoint
dump('Editing a conditional breakpoint\n')
await setConditionalBreakpoint(dbg, 5, "2");
await waitForDispatch(dbg, "SET_BREAKPOINT_CONDITION");
bp = findBreakpoint(dbg, "simple2", 5);
is(bp.condition, "12", "breakpoint is created with the condition");
assertEditorBreakpoint(dbg, 5, true);
// Removing a conditional breakpoint
dump("Removing a conditional breakpoint\n")
clickElement(dbg, "gutter", 5);
await waitForDispatch(dbg, "REMOVE_BREAKPOINT");
bp = findBreakpoint(dbg, "simple2", 5);

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

@ -23,7 +23,7 @@ add_task(async function() {
toggleCallStack(dbg);
const notPaused = findElement(dbg, "callStackBody").innerText;
is(notPaused, "Not Paused", "Not paused message is shown");
is(notPaused, "Not paused", "Not paused message is shown");
invokeInTab("firstCall");
await waitForPaused(dbg);
@ -47,13 +47,13 @@ add_task(async function() {
// check to make sure that the toggle button isn't there
let button = toggleButton(dbg);
let frames = findAllElements(dbg, "frames");
is(button.innerText, "Expand Rows", "toggle button should be expand");
is(button.innerText, "Expand rows", "toggle button should be expand");
is(frames.length, 7, "There should be at most seven frames");
button.click();
button = toggleButton(dbg);
frames = findAllElements(dbg, "frames");
is(button.innerText, "Collapse Rows", "toggle button should be collapsed");
is(button.innerText, "Collapse rows", "toggle button should be collapsed");
is(frames.length, 22, "All of the frames should be shown");
});

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

@ -0,0 +1,74 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* test pausing on an errored watch expression
* assert that you can:
* 1. resume
* 2. still evalutate expressions
*/
const expressionSelectors = {
input: "input.input-expression"
};
function getLabel(dbg, index) {
return findElement(dbg, "expressionNode", index).innerText;
}
function getValue(dbg, index) {
return findElement(dbg, "expressionValue", index).innerText;
}
function assertEmptyValue(dbg, index) {
const value = findElement(dbg, "expressionValue", index);
if (value) {
is(value.innerText, "");
return;
}
is(value, null);
}
function toggleExpression(dbg, index) {
findElement(dbg, "expressionNode", index).click();
}
async function addExpression(dbg, input) {
info("Adding an expression");
findElementWithSelector(dbg, expressionSelectors.input).focus();
type(dbg, input);
pressKey(dbg, "Enter");
await waitForDispatch(dbg, "EVALUATE_EXPRESSION");
}
async function editExpression(dbg, input) {
info("updating the expression");
dblClickElement(dbg, "expressionNode", 1);
// Position cursor reliably at the end of the text.
pressKey(dbg, "End");
type(dbg, input);
pressKey(dbg, "Enter");
await waitForDispatch(dbg, "EVALUATE_EXPRESSION");
}
add_task(async function() {
const dbg = await initDebugger("doc-script-switching.html");
await togglePauseOnExceptions(dbg, true, false);
await addExpression(dbg, "location");
const paused = waitForPaused(dbg);
addExpression(dbg, "foo.bar");
await paused;
ok(dbg.selectors.hasWatchExpressionErrored(dbg.getState()));
// Resume, and re-pause in the `foo.bar` exception
resume(dbg);
await waitForPaused(dbg);
toggleExpression(dbg, 1);
await waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES");
is(findAllElements(dbg, "expressionNodes").length, 18);
});

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

@ -6,6 +6,7 @@
* 1. add watch expressions
* 2. edit watch expressions
* 3. delete watch expressions
* 4. expanding properties when not paused
*/
const expressionSelectors = {
@ -61,7 +62,7 @@ add_task(async function() {
await addExpression(dbg, "f");
is(getLabel(dbg, 1), "f");
is(getValue(dbg, 1), `"ReferenceError: f is not defined"`);
is(getValue(dbg, 1), "(unavailable)");
await editExpression(dbg, "oo");
is(getLabel(dbg, 1), "foo()");
@ -79,6 +80,15 @@ add_task(async function() {
await deleteExpression(dbg, "foo");
await deleteExpression(dbg, "location");
is(findAllElements(dbg, "expressionNodes").length, 0);
// Test expanding properties when the debuggee is active
await resume(dbg);
await addExpression(dbg, "location");
toggleExpression(dbg, 1);
await waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES");
is(findAllElements(dbg, "expressionNodes").length, 17);
await deleteExpression(dbg, "location");
is(findAllElements(dbg, "expressionNodes").length, 0);
});

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

@ -10,7 +10,7 @@ async function waitFor(condition) {
return condition();
}
add_task(async function () {
add_task(async function() {
const dbg = await initDebugger("doc-minified.html");
invokeInTab("arithmetic");
@ -19,7 +19,9 @@ add_task(async function () {
const console = await toolbox.selectTool("webconsole");
const hud = console.hud;
let node = await waitFor(() => hud.ui.outputNode.querySelector(".frame-link-source"));
let node = await waitFor(() =>
hud.ui.outputNode.querySelector(".frame-link-source")
);
const initialLocation = "math.min.js:3:65";
is(node.textContent, initialLocation, "location is correct in minified code");
@ -43,5 +45,9 @@ add_task(async function () {
return found;
});
is(node.textContent, "math.min.js:formatted:22", "location is correct in minified code");
is(
node.textContent,
"math.min.js:formatted:22",
"location is correct in minified code"
);
});

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

@ -11,6 +11,10 @@ async function waitForSourceCount(dbg, i) {
});
}
function getLabel(dbg, index) {
return findElement(dbg, "sourceNode", index).textContent.trim();
}
add_task(async function() {
const dbg = await initDebugger("doc-sources.html");
const { selectors: { getSelectedSource }, getState } = dbg;
@ -53,11 +57,7 @@ add_task(async function() {
});
await waitForSourceCount(dbg, 9);
is(
findElement(dbg, "sourceNode", 7).textContent,
"math.min.js",
"The dynamic script exists"
);
is(getLabel(dbg, 7), "math.min.js", "The dynamic script exists");
// Make sure named eval sources appear in the list.
});
@ -72,20 +72,6 @@ add_task(async function() {
content.eval("window.evaledFunc = function() {} //# sourceURL=evaled.js");
});
await waitForSourceCount(dbg, 3);
is(
findElement(dbg, "sourceNode", 3).textContent,
"(no domain)",
"the folder exists"
);
// work around: the folder is rendered at the bottom, so we close the
// root folder and open the (no domain) folder
await clickElement(dbg, "sourceArrow", 3);
await waitForSourceCount(dbg, 4);
is(
findElement(dbg, "sourceNode", 4).textContent,
"evaled.js",
"the eval script exists"
);
is(getLabel(dbg, 3), "evaled.js", "the eval script exists");
});

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

@ -0,0 +1,30 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Test WebAssembly source maps
*/
add_task(async function() {
const dbg = await initDebugger("doc-wasm-sourcemaps.html");
await reload(dbg);
await waitForPaused(dbg);
assertPausedLocation(dbg);
await addBreakpoint(dbg, "wasm-sourcemaps/average.c", 12);
clickElement(dbg, "resume");
await waitForPaused(dbg);
assertPausedLocation(dbg);
const frames = findAllElements(dbg, "frames");
const firstFrameTitle = frames[0].querySelector(".title").textContent;
is(firstFrameTitle, "(wasmcall)", "It shall be a wasm call");
const firstFrameLocation = frames[0].querySelector(".location").textContent;
is(
firstFrameLocation.includes("average.c"),
true,
"It shall be to avarage.c source"
);
});

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

@ -0,0 +1,59 @@
<!-- Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Wasm+sourcemaps</title>
<script src="wasm-sourcemaps/utils.js"></script>
<script>
function test() {
// Create memory and populate int32 array with some data.
var buf = Module._malloc(16);
var arr = new Int32Array(Module['buffer'], buf, 4);
arr.set(new Int32Array([1, 2, 3, 4]));
var average = Module.ccall(
'average',
'i32',
['*', 'u32'],
[buf, arr.length]
);
console.log(average);
}
// WebAssembly module is part of the emscripten generated one,
// loading emscripten module via script tag.
var Module = {
wasmBinary: null,
postRun: [],
};
function loadWasm(emscriptenWrapper, wasmUrl, sourceMapUrl) {
return fetch(wasmUrl).then(res => res.arrayBuffer()).then(buffer => {
if (!sourceMapUrl) return buffer;
return updateSourceMappingURLSection(buffer, sourceMapUrl);
}).then(buffer => {
return new Promise(resolve => {
Module.wasmBinary = buffer;
Module.postRun.push(resolve);
let script = document.createElement('script');
script.src = emscriptenWrapper;
document.head.appendChild(script);
});
});
}
loadWasm('wasm-sourcemaps/average.js',
'wasm-sourcemaps/average.wasm',
new URL('wasm-sourcemaps/average.wasm.map', document.location).href).then(() => {
debugger;
test();
});
</script>
</head>
<body>
</body>
</html>

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

@ -0,0 +1,5 @@
# Building WebAssembly source and source maps
```
emcc average.c -O2 -g4 -o average.js -s WASM=1 -s EXPORTED_FUNCTIONS="['_average','_sum']"
```

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

@ -0,0 +1,21 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
extern float average(signed* numbers, unsigned length);
extern signed sum(signed* numbers, unsigned length);
signed __attribute__((noinline)) sum(signed* numbers, unsigned length)
{
signed result;
unsigned i;
result = 0;
for (i = 0; i < length; i++)
result += numbers[i];
return result;
}
float average(signed* numbers, unsigned length)
{
float s = (float)sum(numbers, length);
return s / length;
}

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

Двоичный файл не отображается.

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

@ -0,0 +1 @@
{"version":3,"sources":["average.c"],"names":[],"mappings":"u7BAWA,iBAEA,MADA,wBADA,eAEA,cAKA,aACA"}

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

@ -0,0 +1,75 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Simple wasm parser to replace "sourceMappingURL" section.
function updateSourceMappingURLSection(buffer, sourceMapUrl) {
function readVarUint8(buf, pos) {
let b = buf[pos++];
let shift = 0;
let result = 0;
while (b & 0x80) {
result |= (b & 0x7f) << shift;
shift += 7;
b = buf[pos++];
}
return {
value: result | (b << shift),
pos
};
}
function readWasmString(buf, pos) {
const { pos: next, value: len } = readVarUint8(buf, pos);
const result = String.fromCharCode.apply(
null,
buf.subarray(next, next + len)
);
return { value: result, pos: next + len };
}
function toVarUint(n) {
const buf = [];
while (n > 127) {
buf.push((n & 0x7f) | 0x80);
n >>>= 7;
}
buf.push(n);
return buf;
}
function toWasmString(s) {
const buf = toVarUint(s.length);
for (let i = 0; i < s.length; i++) {
buf.push(s.charCodeAt(i));
}
return buf;
}
// Appending/replacing sourceMappingURL section based on
// https://github.com/WebAssembly/design/pull/1051
const mappingSectionBody = toWasmString("sourceMappingURL").concat(
toWasmString(sourceMapUrl)
);
const mappingSection = toVarUint(0).concat(
toVarUint(mappingSectionBody.length),
mappingSectionBody
);
const data = new Uint8Array(buffer);
let start = data.length,
end = data.length;
for (let i = 8; i < data.length; ) {
const { pos: next, value: id } = readVarUint8(data, i);
const { pos: next2, value: size } = readVarUint8(data, next);
if (id == 0 && readWasmString(data, next2).value === "sourceMappingURL") {
start = i;
end = next2 + size;
break;
}
i = next2 + size;
}
const result = new Uint8Array(
start + (data.length - end) + mappingSection.length
);
result.set(data.subarray(0, start));
result.set(new Uint8Array(mappingSection), start);
result.set(data.subarray(end), start + mappingSection.length);
return result.buffer;
}

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

@ -20,7 +20,7 @@ Task.spawn(function* () {
info("Loaded, selecting the test script to debug");
// First expand the domain
let domain = [...document.querySelectorAll(".tree-node")].find(node => {
return node.textContent == "mozilla.org";
return node.textContent.trim() == "mozilla.org";
});
let arrow = domain.querySelector(".arrow");
arrow.click();

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

@ -21,17 +21,17 @@ copySource.accesskey=y
# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the
# context menu to copy the source URL of file open.
copySourceUrl=Copy Source URL
copySourceUrl=Copy source url
copySourceUrl.accesskey=u
# LOCALIZATION NOTE (copyFunction): This is the text that appears in the
# context menu to copy the function the user selected
copyFunction.label=Copy Function
copyFunction.label=Copy function
copyFunction.accesskey=F
# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the
# context menu to copy the stack trace methods, file names and row number.
copyStackTrace=Copy Stack Trace
copyStackTrace=Copy stack trace
copyStackTrace.accesskey=c
# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button
@ -52,15 +52,15 @@ resumeButtonTooltip=Resume %S
# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the
# button that steps over a function call.
stepOverTooltip=Step Over %S
stepOverTooltip=Step over %S
# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the
# button that steps into a function call.
stepInTooltip=Step In %S
stepInTooltip=Step in %S
# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the
# button that steps out of a function call.
stepOutTooltip=Step Out %S
stepOutTooltip=Step out %S
# LOCALIZATION NOTE (workersHeader): The text to display in the events
# header.
@ -76,11 +76,11 @@ noSourcesText=This page has no sources.
# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab
# when there are no events.
noEventListenersText=No event listeners to display
noEventListenersText=No event listeners to display.
# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events
# header.
eventListenersHeader=Event Listeners
eventListenersHeader=Event listeners
# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab
# when there are no stack frames.
@ -152,6 +152,30 @@ projectTextSearch.key=CmdOrCtrl+Shift+F
# modal for searching functions in a file.
functionSearch.key=CmdOrCtrl+Shift+O
# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle
# breakpoints.
toggleBreakpoint.key=CmdOrCtrl+B
# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle
# the conditional breakpoint panel.
toggleCondPanel.key=CmdOrCtrl+Shift+B
# LOCALIZATION NOTE (stepOut.key): A key shortcut to
# step out.
stepOut.key=Shift+F11
# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in
# the shortcuts modal for keyboard shortcuts related to editing.
shortcuts.header.editor=Editor
# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in
# the shortcuts modal for keyboard shortcuts related to stepping.
shortcuts.header.stepping=Stepping
# LOCALIZATION NOTE (shortcuts.header.search): Sections header in
# the shortcuts modal for keyboard shortcuts related to search.
shortcuts.header.search=Search
# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown
# when searching across all of the files in a project.
projectTextSearch.placeholder=Find in files…
@ -227,6 +251,30 @@ searchPanelVariable=Filter variables (%S)
# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that
# are displayed in the breakpoints menu item popup.
breakpointMenuItem.setConditional=Configure conditional breakpoint
breakpointMenuItem.enableSelf2.label=Enable
breakpointMenuItem.enableSelf2.accesskey=E
breakpointMenuItem.disableSelf2.label=Disable
breakpointMenuItem.disableSelf2.accesskey=D
breakpointMenuItem.deleteSelf2.label=Remove
breakpointMenuItem.deleteSelf2.accesskey=R
breakpointMenuItem.enableOthers2.label=Enable others
breakpointMenuItem.enableOthers2.accesskey=o
breakpointMenuItem.disableOthers2.label=Disable others
breakpointMenuItem.disableOthers2.accesskey=s
breakpointMenuItem.deleteOthers2.label=Remove others
breakpointMenuItem.deleteOthers2.accesskey=h
breakpointMenuItem.enableAll2.label=Enable all
breakpointMenuItem.enableAll2.accesskey=b
breakpointMenuItem.disableAll2.label=Disable all
breakpointMenuItem.disableAll2.accesskey=k
breakpointMenuItem.deleteAll2.label=Remove all
breakpointMenuItem.deleteAll2.accesskey=a
breakpointMenuItem.removeCondition2.label=Remove condition
breakpointMenuItem.removeCondition2.accesskey=c
breakpointMenuItem.addCondition2.label=Add condition
breakpointMenuItem.addCondition2.accesskey=A
breakpointMenuItem.editCondition2.label=Edit condition
breakpointMenuItem.editCondition2.accesskey=n
breakpointMenuItem.enableSelf=Enable breakpoint
breakpointMenuItem.enableSelf.accesskey=E
breakpointMenuItem.disableSelf=Disable breakpoint
@ -255,34 +303,34 @@ breakpoints.header=Breakpoints
# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are
# no breakpoints present
breakpoints.none=No Breakpoints
breakpoints.none=No breakpoints
# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip
# when hovering over the 'disable breakpoints' switch button in right sidebar
breakpoints.enable=Enable Breakpoints
breakpoints.enable=Enable breakpoints
# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip
# when hovering over the 'disable breakpoints' switch button in right sidebar
breakpoints.disable=Disable Breakpoints
breakpoints.disable=Disable breakpoints
# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed
# for remove breakpoint button in right sidebar
breakpoints.removeBreakpointTooltip=Remove Breakpoint
breakpoints.removeBreakpointTooltip=Remove breakpoint
# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.
callStack.header=Call Stack
callStack.header=Call stack
# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane
# message when not paused.
callStack.notPaused=Not Paused
callStack.notPaused=Not paused
# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane
# message to hide some of the frames that are shown.
callStack.collapse=Collapse Rows
callStack.collapse=Collapse rows
# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane
# message to show more of the frames.
callStack.expand=Expand Rows
callStack.expand=Expand rows
# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message
# for the summarizing the selected search result. e.g. 5 of 10 results.
@ -293,15 +341,15 @@ editor.singleResult=1 result
# LOCALIZATION NOTE (editor.noResults): Editor Search bar message
# for when no results found.
editor.noResults=no results
editor.noResults=No results
# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar
# tooltip for traversing to the Next Result
editor.searchResults.nextResult=Next Result
editor.searchResults.nextResult=Next result
# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar
# tooltip for traversing to the Previous Result
editor.searchResults.prevResult=Previous Result
editor.searchResults.prevResult=Previous result
# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for
# toggling search type buttons(function search, variable search)
@ -309,32 +357,32 @@ editor.searchTypeToggleTitle=Search for:
# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context
# menu item for jumping to a new paused location
editor.continueToHere.label=Continue To Here
editor.continueToHere.label=Continue to here
editor.continueToHere.accesskey=H
# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item
# for adding a breakpoint on a line.
editor.addBreakpoint=Add Breakpoint
editor.addBreakpoint=Add breakpoint
# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item
# for disabling a breakpoint on a line.
editor.disableBreakpoint=Disable Breakpoint
editor.disableBreakpoint=Disable breakpoint
# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item
# for enabling a breakpoint on a line.
editor.enableBreakpoint=Enable Breakpoint
editor.enableBreakpoint=Enable breakpoint
# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item
# for removing a breakpoint on a line.
editor.removeBreakpoint=Remove Breakpoint
editor.removeBreakpoint=Remove breakpoint
# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item
# for setting a breakpoint condition on a line.
editor.editBreakpoint=Edit Breakpoint
editor.editBreakpoint=Edit breakpoint
# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context
# menu item for adding a breakpoint condition on a line.
editor.addConditionalBreakpoint=Add Conditional Breakpoint
editor.addConditionalBreakpoint=Add conditional breakpoint
# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for
# input element inside ConditionalPanel component
@ -346,80 +394,80 @@ editor.conditionalPanel.close=Cancel edit breakpoint and close
# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item
# for navigating to a source mapped location
editor.jumpToMappedLocation1=Jump to %S Location
editor.jumpToMappedLocation1=Jump to %S location
# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the
# context menu to disable framework grouping.
framework.disableGrouping=Disable Framework Grouping
framework.disableGrouping=Disable framework grouping
framework.disableGrouping.accesskey=u
# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the
# context menu to enable framework grouping.
framework.enableGrouping=Enable Framework Grouping
framework.enableGrouping=Enable framework grouping
framework.enableGrouping.accesskey=u
# LOCALIZATION NOTE (generated): Source Map term for a server source location
generated=Generated
# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location
original=Original
original=original
# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression
# input element
expressions.placeholder=Add Watch Expression
expressions.placeholder=Add watch expression
# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item
# for closing the selected tab below the mouse.
sourceTabs.closeTab=Close Tab
sourceTabs.closeTab=Close tab
sourceTabs.closeTab.accesskey=c
# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item
# for closing the other tabs.
sourceTabs.closeOtherTabs=Close Other Tabs
sourceTabs.closeOtherTabs=Close other tabs
sourceTabs.closeOtherTabs.accesskey=o
# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item
# for closing the tabs to the end (the right for LTR languages) of the selected tab.
sourceTabs.closeTabsToEnd=Close Tabs to the Right
sourceTabs.closeTabsToEnd=Close tabs to the right
sourceTabs.closeTabsToEnd.accesskey=e
# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item
# for closing all tabs.
sourceTabs.closeAllTabs=Close All Tabs
sourceTabs.closeAllTabs=Close all tabs
sourceTabs.closeAllTabs.accesskey=a
# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item
# for revealing source in tree.
sourceTabs.revealInTree=Reveal in Tree
sourceTabs.revealInTree=Reveal in tree
sourceTabs.revealInTree.accesskey=r
# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item
# for copying a link address.
sourceTabs.copyLink=Copy Link Address
sourceTabs.copyLink=Copy link address
sourceTabs.copyLink.accesskey=l
# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item
# for pretty printing the source.
sourceTabs.prettyPrint=Pretty Print Source
sourceTabs.prettyPrint=Pretty print source
sourceTabs.prettyPrint.accesskey=p
# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated
# with the blackbox button
sourceFooter.blackbox=Blackbox Source
sourceFooter.blackbox=Blackbox source
sourceFooter.blackbox.accesskey=B
# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated
# with the blackbox button
sourceFooter.unblackbox=Unblackbox Source
sourceFooter.unblackbox=Unblackbox source
sourceFooter.unblackbox.accesskey=b
# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated
# with a blackboxed source
sourceFooter.blackboxed=Blackboxed Source
sourceFooter.blackboxed=Blackboxed source
# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated
# with a code coverage button
sourceFooter.codeCoverage=Code Coverage
sourceFooter.codeCoverage=Code coverage
# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed
# for close tab button in source tabs.
@ -434,11 +482,11 @@ scopes.header=Scopes
# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message
# for when the debugger is paused, but there isn't pause data.
scopes.notAvailable=Scopes Unavailable
scopes.notAvailable=Scopes unavailable
# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message
# for when the debugger is not paused.
scopes.notPaused=Not Paused
scopes.notPaused=Not paused
# LOCALIZATION NOTE (scopes.block): Refers to a block of code in
# the scopes pane when the debugger is paused.
@ -460,7 +508,7 @@ sources.search=%S to search
# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar
# pane header.
watchExpressions.header=Watch Expressions
watchExpressions.header=Watch expressions
# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header
# button for refreshing the expressions.
@ -507,7 +555,7 @@ loadingText=Loading\u2026
# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger
# viewer when there is an error loading a file
errorLoadingText2=Error loading this URL: %S
errorLoadingText2=Error loading this url: %S
# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the
# watch expressions list to add a new item.
@ -639,7 +687,7 @@ variablesViewOptimizedOut=(optimized away)
variablesViewUninitialized=(uninitialized)
variablesViewMissingArgs=(unavailable)
anonymousSourcesLabel=Anonymous Sources
anonymousSourcesLabel=Anonymous sources
experimental=This is an experimental feature
@ -698,3 +746,47 @@ whyPaused.other=Debugger paused
# LOCALIZATION NOTE (ctrl): The text that is used for documenting
# keyboard shortcuts that use the control key
ctrl=Ctrl
# LOCALIZATION NOTE (anonymous): The text that is displayed when the
# display name is null.
anonymous=(anonymous)
# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing
# keyboard shortcut action for toggling breakpoint
shortcuts.toggleBreakpoint=Toggle Breakpoint
# LOCALIZATION NOTE (shortcuts.toggleCondPanel): text describing
# keyboard shortcut action for toggling conditional panel keyboard
shortcuts.toggleCondPanel=Toggle Conditional Panel
# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing
# keyboard shortcut action for pause of resume
shortcuts.pauseOrResume=Pause/Resume
# LOCALIZATION NOTE (shortcuts.stepOver): text describing
# keyboard shortcut action for stepping over
shortcuts.stepOver=Step Over
# LOCALIZATION NOTE (shortcuts.stepIn): text describing
# keyboard shortcut action for stepping in
shortcuts.stepIn=Step In
# LOCALIZATION NOTE (shortcuts.stepOut): text describing
# keyboard shortcut action for stepping out
shortcuts.stepOut=Step Out
# LOCALIZATION NOTE (shortcuts.fileSearch): text describing
# keyboard shortcut action for source file search
shortcuts.fileSearch=Source File Search
# LOCALIZATION NOTE (shortcuts.searchAgain): text describing
# keyboard shortcut action for searching again
shortcuts.searchAgain=Search Again
# LOCALIZATION NOTE (shortcuts.projectSearch): text describing
# keyboard shortcut action for full project search
shortcuts.projectSearch=Full Project Search
# LOCALIZATION NOTE (shortcuts.functionSearch): text describing
# keyboard shortcut action for function search
shortcuts.functionSearch=Function Search

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

@ -12,6 +12,9 @@ pref("devtools.debugger.remote-timeout", 20000);
pref("devtools.debugger.pause-on-exceptions", false);
pref("devtools.debugger.ignore-caught-exceptions", false);
pref("devtools.debugger.source-maps-enabled", true);
// Temporarily leave this in place, even though it is unused, so the
// options pane doesn't break.
// https://bugzilla.mozilla.org/show_bug.cgi?id=1371849
pref("devtools.debugger.client-source-maps-enabled", true);
pref("devtools.debugger.pretty-print-enabled", true);
pref("devtools.debugger.auto-pretty-print", false);
@ -39,5 +42,5 @@ pref("devtools.debugger.file-search-case-sensitive", false);
pref("devtools.debugger.file-search-whole-word", false);
pref("devtools.debugger.file-search-regex-match", false);
pref("devtools.debugger.features.async-stepping", true);
pref("devtools.debugger.project-text-search-enabled", true);
pref("devtools.debugger.features.project-text-search", true);
pref("devtools.debugger.features.wasm", true);

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

@ -1235,7 +1235,6 @@ TimeoutManager::BudgetThrottlingEnabled(bool aIsBackground) const
{
// A window can be throttled using budget if
// * It isn't active
// * If it isn't using user media
// * If it isn't using WebRTC
// * If it hasn't got open WebSockets
// * If it hasn't got active IndexedDB databases
@ -1257,11 +1256,6 @@ TimeoutManager::BudgetThrottlingEnabled(bool aIsBackground) const
return false;
}
// Check if we have active GetUserMedia
if (mWindow.AsInner()->HasActiveUserMedia()) {
return false;
}
// Check if we have active PeerConnection
if (mWindow.AsInner()->HasActivePeerConnections()) {
return false;

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

@ -1012,8 +1012,7 @@ nsPIDOMWindow<T>::nsPIDOMWindow(nsPIDOMWindowOuter *aOuterWindow)
mLargeAllocStatus(LargeAllocStatus::NONE),
mHasTriedToCacheTopInnerWindow(false),
mNumOfIndexedDBDatabases(0),
mNumOfOpenWebSockets(0),
mNumOfActiveUserMedia(0)
mNumOfOpenWebSockets(0)
{
if (aOuterWindow) {
mTimeoutManager =
@ -4387,7 +4386,6 @@ nsGlobalWindow::UpdateTopInnerWindow()
}
mTopInnerWindow->UpdateWebSocketCount(-(int32_t)mNumOfOpenWebSockets);
mTopInnerWindow->UpdateUserMediaCount(-(int32_t)mNumOfActiveUserMedia);
}
void
@ -4548,32 +4546,6 @@ nsPIDOMWindowInner::HasOpenWebSockets() const
(mTopInnerWindow && mTopInnerWindow->mNumOfOpenWebSockets);
}
void
nsPIDOMWindowInner::UpdateUserMediaCount(int32_t aDelta)
{
MOZ_ASSERT(NS_IsMainThread());
if (aDelta == 0) {
return;
}
if (mTopInnerWindow && !IsTopInnerWindow()) {
mTopInnerWindow->UpdateUserMediaCount(aDelta);
}
MOZ_DIAGNOSTIC_ASSERT(
aDelta > 0 || ((aDelta + mNumOfActiveUserMedia) < mNumOfActiveUserMedia));
mNumOfActiveUserMedia += aDelta;
}
bool
nsPIDOMWindowInner::HasActiveUserMedia() const
{
return (mTopInnerWindow ? mTopInnerWindow->mNumOfActiveUserMedia
: mNumOfActiveUserMedia) > 0;
}
void
nsPIDOMWindowOuter::MaybeActiveMediaComponents()
{

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

@ -751,9 +751,6 @@ protected:
// The number of open WebSockets. Inner window only.
uint32_t mNumOfOpenWebSockets;
// The number of active user media. Inner window only.
uint32_t mNumOfActiveUserMedia;
};
#define NS_PIDOMWINDOWINNER_IID \
@ -942,12 +939,6 @@ public:
// timeout-throttling.
bool HasOpenWebSockets() const;
// Increase/Decrease the number of active user media.
void UpdateUserMediaCount(int32_t aDelta);
// Return true if there are any currently ongoing user media.
bool HasActiveUserMedia() const;
protected:
void CreatePerformanceObjectIfNeeded();
};

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

@ -401,15 +401,18 @@ protected:
MOZ_ASSERT(!wp->GetWindow());
AutoSafeJSContext cx;
AutoJSAPI jsapi;
jsapi.Init();
JSContext* cx = jsapi.cx();
JS::Rooted<JSObject*> global(cx, mConsole->GetOrCreateSandbox(cx, wp->GetPrincipal()));
if (NS_WARN_IF(!global)) {
return;
}
// The CreateSandbox call returns a proxy to the actual sandbox object. We
// don't need a proxy here.
// The GetOrCreateSandbox call returns a proxy to the actual sandbox object.
// We don't need a proxy here.
global = js::UncheckedUnwrap(global);
JSAutoCompartment ac(cx, global);

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

@ -413,7 +413,7 @@ MutableBlobStorage::~MutableBlobStorage()
}
}
uint64_t
void
MutableBlobStorage::GetBlobWhenReady(nsISupports* aParent,
const nsACString& aContentType,
MutableBlobStorageCallback* aCallback)
@ -433,7 +433,7 @@ MutableBlobStorage::GetBlobWhenReady(nsISupports* aParent,
RefPtr<Runnable> runnable =
new BlobCreationDoneRunnable(this, aCallback, nullptr, mErrorResult);
EventTarget()->Dispatch(runnable.forget(), NS_DISPATCH_NORMAL);
return 0;
return;
}
// We want to wait until all the WriteRunnable are completed. The way we do
@ -442,7 +442,7 @@ MutableBlobStorage::GetBlobWhenReady(nsISupports* aParent,
RefPtr<Runnable> runnable =
new LastRunnable(this, aParent, aContentType, aCallback);
DispatchToIOThread(runnable.forget());
return mDataLen;
return;
}
// If we are waiting for the temporary file, it's better to wait...
@ -450,7 +450,7 @@ MutableBlobStorage::GetBlobWhenReady(nsISupports* aParent,
mPendingParent = aParent;
mPendingContentType = aContentType;
mPendingCallback = aCallback;
return mDataLen;
return;
}
RefPtr<BlobImpl> blobImpl;
@ -472,10 +472,8 @@ MutableBlobStorage::GetBlobWhenReady(nsISupports* aParent,
nsresult error = EventTarget()->Dispatch(runnable.forget(), NS_DISPATCH_NORMAL);
if (NS_WARN_IF(NS_FAILED(error))) {
return 0;
return;
}
return mDataLen;
}
nsresult

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

@ -51,10 +51,9 @@ public:
// This method can be called just once.
// The callback will be called when the Blob is ready.
// The return value is the total size of the blob, when created.
uint64_t GetBlobWhenReady(nsISupports* aParent,
const nsACString& aContentType,
MutableBlobStorageCallback* aCallback);
void GetBlobWhenReady(nsISupports* aParent,
const nsACString& aContentType,
MutableBlobStorageCallback* aCallback);
void TemporaryFileCreated(PRFileDesc* aFD);

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

@ -1684,8 +1684,7 @@ TabChild::RecvRealMouseButtonEvent(const WidgetMouseEvent& aEvent,
aInputBlockId);
}
nsEventStatus unused;
InputAPZContext context(aGuid, aInputBlockId, unused);
InputAPZContext context(aGuid, aInputBlockId, nsEventStatus_eIgnore);
if (pendingLayerization) {
context.SetPendingLayerization();
}

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

@ -2933,11 +2933,6 @@ MediaManager::AddWindowID(uint64_t aWindowId,
return;
}
auto* window = nsGlobalWindow::GetInnerWindowWithId(aWindowId);
if (window) {
window->AsInner()->UpdateUserMediaCount(1);
}
GetActiveWindows()->Put(aWindowId, aListener);
}
@ -2953,8 +2948,6 @@ MediaManager::RemoveWindowID(uint64_t aWindowId)
return;
}
window->AsInner()->UpdateUserMediaCount(-1);
nsPIDOMWindowOuter* outer = window->AsInner()->GetOuterWindow();
if (!outer) {
LOG(("No outer window for inner %" PRIu64, aWindowId));

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

@ -158,11 +158,11 @@ NS_IMPL_RELEASE_INHERITED(MediaRecorder, DOMEventTargetHelper)
/**
* Session is an object to represent a single recording event.
* In original design, all recording context is stored in MediaRecorder, which causes
* a problem if someone calls MediaRecoder::Stop and MedaiRecorder::Start quickly.
* a problem if someone calls MediaRecorder::Stop and MediaRecorder::Start quickly.
* To prevent blocking main thread, media encoding is executed in a second thread,
* named as Read Thread. For the same reason, we do not wait Read Thread shutdown in
* MediaRecorder::Stop. If someone call MediaRecoder::Start before Read Thread shutdown,
* the same recording context in MediaRecoder might be access by two Reading Threads,
* MediaRecorder::Stop. If someone call MediaRecorder::Start before Read Thread shutdown,
* the same recording context in MediaRecorder might be access by two Reading Threads,
* which cause a problem.
* In the new design, we put recording context into Session object, including Read
* Thread. Each Session has its own recording context and Read Thread, problem is been
@ -1045,7 +1045,7 @@ private:
}
private:
// Hold reference to MediaRecoder that ensure MediaRecorder is alive
// Hold reference to MediaRecorder that ensure MediaRecorder is alive
// if there is an active session. Access ONLY on main thread.
RefPtr<MediaRecorder> mRecorder;

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

@ -562,7 +562,7 @@ AudioContext::DecodeAudioData(const ArrayBuffer& aBuffer,
successCallback = &aSuccessCallback.Value();
}
UniquePtr<WebAudioDecodeJob> job(
new WebAudioDecodeJob(contentType, this,
new WebAudioDecodeJob(this,
promise, successCallback, failureCallback));
AsyncDecodeWebAudio(contentType.get(), data, length, *job);
// Transfer the ownership to mDecodeJobs

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

@ -514,13 +514,11 @@ AsyncDecodeWebAudio(const char* aContentType, uint8_t* aBuffer,
}
}
WebAudioDecodeJob::WebAudioDecodeJob(const nsACString& aContentType,
AudioContext* aContext,
WebAudioDecodeJob::WebAudioDecodeJob(AudioContext* aContext,
Promise* aPromise,
DecodeSuccessCallback* aSuccessCallback,
DecodeErrorCallback* aFailureCallback)
: mContentType(aContentType)
, mContext(aContext)
: mContext(aContext)
, mPromise(aPromise)
, mSuccessCallback(aSuccessCallback)
, mFailureCallback(aFailureCallback)
@ -609,7 +607,6 @@ size_t
WebAudioDecodeJob::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
amount += mContentType.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
if (mSuccessCallback) {
amount += mSuccessCallback->SizeOfIncludingThis(aMallocSizeOf);
}

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

@ -31,8 +31,7 @@ struct WebAudioDecodeJob final
{
// You may omit both the success and failure callback, or you must pass both.
// The callbacks are only necessary for asynchronous operation.
WebAudioDecodeJob(const nsACString& aContentType,
dom::AudioContext* aContext,
WebAudioDecodeJob(dom::AudioContext* aContext,
dom::Promise* aPromise,
dom::DecodeSuccessCallback* aSuccessCallback = nullptr,
dom::DecodeErrorCallback* aFailureCallback = nullptr);
@ -57,7 +56,6 @@ struct WebAudioDecodeJob final
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
AudioChunk mBuffer;
nsCString mContentType;
RefPtr<dom::AudioContext> mContext;
RefPtr<dom::Promise> mPromise;
RefPtr<dom::DecodeSuccessCallback> mSuccessCallback;

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

@ -47,6 +47,7 @@ run-sequentially = This will delete all existing push subscriptions.
[test_unregister_not_found.js]
[test_unregister_success.js]
[test_updateRecordNoEncryptionKeys_ws.js]
skip-if = os == "linux" # Bug 1265233
[test_reconnect_retry.js]
[test_retry_ws.js]
[test_service_parent.js]

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

@ -8,6 +8,7 @@
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/PromiseWorkerProxy.h"
#include "mozilla/JSObjectHolder.h"
#include "ServiceWorkerClient.h"
#include "ServiceWorkerManager.h"
@ -670,6 +671,9 @@ private:
MOZ_DIAGNOSTIC_ASSERT(aWindow);
WorkerPrivate* workerPrivate = mPromiseProxy->GetWorkerPrivate();
nsCOMPtr<nsIPrincipal> triggeringPrincipal = workerPrivate->GetPrincipal();
MOZ_DIAGNOSTIC_ASSERT(triggeringPrincipal);
// [[1. Let url be the result of parsing url with entry settings object's API
// base URL.]]
nsCOMPtr<nsIURI> uri;
@ -694,6 +698,25 @@ private:
}
if (XRE_IsContentProcess()) {
// Let's create a sandbox in order to have a valid JSContext and correctly
// propagate the SubjectPrincipal.
AutoJSAPI jsapi;
jsapi.Init();
JSContext* cx = jsapi.cx();
nsIXPConnect* xpc = nsContentUtils::XPConnect();
MOZ_ASSERT(xpc, "This should never be null!");
JS::Rooted<JSObject*> sandbox(cx);
rv = xpc->CreateSandbox(cx, triggeringPrincipal, sandbox.address());
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
JSAutoCompartment ac(cx, sandbox);
// ContentProcess
nsCOMPtr<nsIWindowWatcher> wwatch =
do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv);
@ -754,9 +777,6 @@ private:
return NS_ERROR_FAILURE;
}
nsCOMPtr<nsIPrincipal> triggeringPrincipal = workerPrivate->GetPrincipal();
MOZ_DIAGNOSTIC_ASSERT(triggeringPrincipal);
nsCOMPtr<mozIDOMWindowProxy> win;
rv = bwin->OpenURI(uri, nullptr,
nsIBrowserDOMWindow::OPEN_DEFAULTWINDOW,

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

@ -5,10 +5,14 @@ support-files =
download/window.html
download/worker.js
file_multie10s_update.html
file_userContextId_openWindow.js
force_refresh_browser_worker.js
empty.html
server_multie10s_update.sjs
[browser_force_refresh.js]
[browser_download.js]
[browser_multie10s_update.js]
run-if=e10s
[browser_userContextId_openWindow.js]
run-if=e10s

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

@ -0,0 +1,131 @@
let { classes: Cc, interfaces: Ci, manager: Cm, results: Cr } = Components;
let swm = Cc["@mozilla.org/serviceworkers/manager;1"].
getService(Ci.nsIServiceWorkerManager);
const URI = "https://example.com/browser/dom/workers/test/serviceworkers/empty.html";
const MOCK_CID = Components.ID("{2a0f83c4-8818-4914-a184-f1172b4eaaa7}");
const ALERTS_SERVICE_CONTRACT_ID = "@mozilla.org/alerts-service;1";
const USER_CONTEXT_ID = 3
let mockAlertsService = {
showAlert: function(alert, alertListener) {
ok(true, "Showing alert");
setTimeout(function () {
alertListener.observe(null, "alertshow", alert.cookie);
}, 100);
setTimeout(function () {
alertListener.observe(null, "alertclickcallback", alert.cookie);
}, 100);
},
showAlertNotification: function(imageUrl, title, text, textClickable,
cookie, alertListener, name, dir, lang, data) {
this.showAlert();
},
QueryInterface: function(aIID) {
if (aIID.equals(Ci.nsISupports) || aIID.equals(Ci.nsIAlertsService)) {
return this;
}
throw Components.results.NS_ERROR_NO_INTERFACE;
},
createInstance: function(aOuter, aIID) {
if (aOuter != null) {
throw Cr.NS_ERROR_NO_AGGREGATION;
}
return this.QueryInterface(aIID);
}
};
registerCleanupFunction(() => {
Cm.QueryInterface(Ci.nsIComponentRegistrar).
unregisterFactory(MOCK_CID, mockAlertsService);
});
add_task(async function setup() {
// make sure userContext, SW and notifications are enabled.
await SpecialPowers.pushPrefEnv({"set": [
["privacy.userContext.enabled", true],
["dom.serviceWorkers.exemptFromPerDomainMax", true],
["dom.serviceWorkers.enabled", true],
["dom.serviceWorkers.testing.enabled", true],
["dom.webnotifications.workers.enabled", true],
["dom.webnotifications.serviceworker.enabled", true],
["notification.prompt.testing", true],
["dom.disable_open_click_delay", 1000],
["dom.serviceWorkers.idle_timeout", 299999],
["dom.serviceWorkers.idle_extended_timeout", 299999],
["browser.link.open_newwindow", 3],
]});
});
add_task(async function test() {
Cm.QueryInterface(Ci.nsIComponentRegistrar).
registerFactory(MOCK_CID, "alerts service", ALERTS_SERVICE_CONTRACT_ID,
mockAlertsService);
// open the tab in the correct userContextId
let tab = BrowserTestUtils.addTab(gBrowser, URI, {userContextId: USER_CONTEXT_ID});
let browser = gBrowser.getBrowserForTab(tab);
// select tab and make sure its browser is focused
gBrowser.selectedTab = tab;
tab.ownerGlobal.focus();
// wait for tab load
await BrowserTestUtils.browserLoaded(gBrowser.getBrowserForTab(tab));
// Waiting for new tab.
let newTabPromise = BrowserTestUtils.waitForNewTab(gBrowser, null, true);
// here the test.
let uci = await ContentTask.spawn(browser, URI, uri => {
let uci = content.document.nodePrincipal.userContextId;
// Registration of the SW
return content.navigator.serviceWorker.register("file_userContextId_openWindow.js")
// Activation
.then(swr => {
return new content.window.Promise(resolve => {
let worker = swr.installing;
worker.addEventListener('statechange', () => {
if (worker.state === 'activated') {
resolve(swr);
}
});
});
})
// Ask for an openWindow.
.then(swr => {
swr.showNotification("testPopup");
return uci;
});
});
is(uci, USER_CONTEXT_ID, "Tab runs with UCI " + USER_CONTEXT_ID);
let newTab = await newTabPromise;
is(newTab.getAttribute("usercontextid"), USER_CONTEXT_ID, "New tab has UCI equal " + USER_CONTEXT_ID);
// wait for SW unregistration
uci = await ContentTask.spawn(browser, null, () => {
let uci = content.document.nodePrincipal.userContextId;
return content.navigator.serviceWorker.getRegistration(".").then(registration => {
return registration.unregister();
})
.then(() => {
return uci;
});
});
is(uci, USER_CONTEXT_ID, "Tab runs with UCI " + USER_CONTEXT_ID);
await BrowserTestUtils.removeTab(newTab);
await BrowserTestUtils.removeTab(tab);
});

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

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

@ -0,0 +1,3 @@
onnotificationclick = event => {
clients.openWindow("empty.html");
}

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

@ -2430,12 +2430,30 @@ EditorBase::FindBetterInsertionPoint(nsCOMPtr<nsINode>& aNode,
// In some other cases, aNode is the anonymous DIV, and offset points to the
// terminating mozBR. In that case, we'll adjust aInOutNode and
// aInOutOffset to the preceding text node, if any.
if (offset > 0 && node->GetChildAt(offset - 1) &&
node->GetChildAt(offset - 1)->IsNodeOfType(nsINode::eTEXT)) {
NS_ENSURE_TRUE_VOID(node->Length() <= INT32_MAX);
aNode = node->GetChildAt(offset - 1);
aOffset = static_cast<int32_t>(aNode->Length());
return;
if (offset) {
if (offset == static_cast<int32_t>(node->GetChildCount())) {
// If offset points to the last child, use a fast path that avoids calling
// GetChildAt() which may perform a linear search.
nsIContent* child = node->GetLastChild();
while (child) {
if (child->IsNodeOfType(nsINode::eTEXT)) {
NS_ENSURE_TRUE_VOID(node->Length() <= INT32_MAX);
aNode = child;
aOffset = static_cast<int32_t>(aNode->Length());
return;
}
child = child->GetPreviousSibling();
}
} else {
// Fall back to a slow path that uses GetChildAt().
nsIContent* child = node->GetChildAt(offset - 1);
if (child && child->IsNodeOfType(nsINode::eTEXT)) {
NS_ENSURE_TRUE_VOID(node->Length() <= INT32_MAX);
aNode = child;
aOffset = static_cast<int32_t>(aNode->Length());
return;
}
}
}
}

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

@ -1728,7 +1728,6 @@ HTMLEditor::GetCSSBackgroundColorState(bool* aMixed,
// get selection location
nsCOMPtr<nsINode> parent = selection->GetRangeAt(0)->GetStartContainer();
int32_t offset = selection->GetRangeAt(0)->StartOffset();
NS_ENSURE_TRUE(parent, NS_ERROR_NULL_POINTER);
// is the selection collapsed?
@ -1739,7 +1738,7 @@ HTMLEditor::GetCSSBackgroundColorState(bool* aMixed,
} else {
// otherwise we want to look at the first editable node after
// {parent,offset} and its ancestors for divs with alignment on them
nodeToExamine = parent->GetChildAt(offset);
nodeToExamine = selection->GetRangeAt(0)->GetChildAtStartOffset();
//GetNextNode(parent, offset, true, address_of(nodeToExamine));
}
@ -2350,16 +2349,15 @@ HTMLEditor::GetSelectedElement(const nsAString& aTagName,
NS_ENSURE_STATE(range);
nsCOMPtr<nsINode> startContainer = range->GetStartContainer();
uint32_t startOffset = range->StartOffset();
nsIContent* startNode = range->GetChildAtStartOffset();
nsCOMPtr<nsINode> endContainer = range->GetEndContainer();
uint32_t endOffset = range->EndOffset();
nsIContent* endNode = range->GetChildAtEndOffset();
// Optimization for a single selected element
if (startContainer && startContainer == endContainer &&
endOffset - startOffset == 1) {
nsCOMPtr<nsINode> selectedNode =
startContainer->GetChildAt(static_cast<int32_t>(startOffset));
startNode && endNode && startNode->GetNextSibling() == endNode) {
nsCOMPtr<nsINode> selectedNode = startNode;
if (selectedNode) {
selectedNode->AsDOMNode()->GetNodeName(domTagName);
ToLowerCase(domTagName);

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

@ -9,11 +9,12 @@
#include "nsPkgInt.h"
typedef enum {
eStart = 0,
eError = 1,
eItsMe = 2
} nsSMState;
/* Apart from these 3 generic states, machine states are specific to
* each charset prober.
*/
#define eStart 0
#define eError 1
#define eItsMe 2
#define GETCLASS(c) GETFROMPCK(((unsigned char)(c)), mModel->classTable)
@ -33,7 +34,7 @@ typedef struct
class nsCodingStateMachine {
public:
explicit nsCodingStateMachine(const SMModel* sm) : mModel(sm) { mCurrentState = eStart; }
nsSMState NextState(char c){
uint32_t NextState(char c){
//for each byte we get its class , if it is first byte, we also get byte length
uint32_t byteCls = GETCLASS(c);
if (mCurrentState == eStart)
@ -43,8 +44,8 @@ public:
mCurrentCharLen = mModel->charLenTable[byteCls];
}
//from byte's class and stateTable, we get its next state
mCurrentState=(nsSMState)GETFROMPCK(mCurrentState*(mModel->classFactor)+byteCls,
mModel->stateTable);
mCurrentState = GETFROMPCK(mCurrentState * mModel->classFactor + byteCls,
mModel->stateTable);
mCurrentBytePos++;
return mCurrentState;
}
@ -53,7 +54,7 @@ public:
const char * GetCodingStateMachine() {return mModel->name;}
protected:
nsSMState mCurrentState;
uint32_t mCurrentState;
uint32_t mCurrentCharLen;
uint32_t mCurrentBytePos;

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

@ -22,7 +22,7 @@ void nsEUCJPProber::Reset(void)
nsProbingState nsEUCJPProber::HandleData(const char* aBuf, uint32_t aLen)
{
NS_ASSERTION(aLen, "HandleData called with empty buffer");
nsSMState codingState;
uint32_t codingState;
for (uint32_t i = 0; i < aLen; i++)
{

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

@ -27,7 +27,7 @@ void nsEscCharSetProber::Reset(void)
nsProbingState nsEscCharSetProber::HandleData(const char* aBuf, uint32_t aLen)
{
nsSMState codingState;
uint32_t codingState;
uint32_t i;
for ( i = 0; i < aLen && mState == eDetecting; i++)

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

@ -22,7 +22,7 @@ void nsSJISProber::Reset(void)
nsProbingState nsSJISProber::HandleData(const char* aBuf, uint32_t aLen)
{
NS_ASSERTION(aLen, "HandleData called with empty buffer");
nsSMState codingState;
uint32_t codingState;
for (uint32_t i = 0; i < aLen; i++)
{

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

@ -14,7 +14,7 @@ void nsUTF8Prober::Reset(void)
nsProbingState nsUTF8Prober::HandleData(const char* aBuf, uint32_t aLen)
{
nsSMState codingState;
uint32_t codingState;
for (uint32_t i = 0; i < aLen; i++)
{

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

@ -0,0 +1,67 @@
<!DOCTYPE html>
<head>
<script type="application/javascript" src="apz_test_native_event_utils.js"></script>
<script type="application/javascript" src="apz_test_utils.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/paint_listener.js"></script>
<script type="application/javascript">
function* test(testDriver) {
var subframe = document.getElementById('content-wrapper');
// scroll over the middle of the subframe, to make sure it scrolls,
// not the page
var scrollPos = subframe.scrollTop;
yield moveMouseAndScrollWheelOver(subframe, 100, 100, testDriver);
ok(subframe.scrollTop > scrollPos, "subframe scrolled after wheeling over it");
}
waitUntilApzStable()
.then(runContinuation(test))
.then(subtestDone);
</script>
<style>
html {
perspective:1000px;
overflow: hidden;
}
#fullscreen-wrapper {
display:table;
visibility:hidden;
width:100%;
height:100%;
position:fixed;
top:0;
left:0;
overflow:hidden;
z-index:9999;
perspective:1000px;
}
#content-wrapper {
overflow-y:auto;
height: 100vh;
}
#content-content {
min-height: 10000px;
}
</style>
</head>
<body>
<div id="fullscreen-wrapper">
<div></div>
</div>
<div id="content-wrapper">
<div id="content-content">
A<br>
B<br>
C<br>
D<br>
E<br>
f<br>
g<br>
h<br>
i<br>
j<br>
</div>
</div>
</body>
</head>

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

@ -25,6 +25,7 @@
helper_scroll_inactive_zindex.html
helper_scroll_on_position_fixed.html
helper_scroll_over_scrollbar.html
helper_scroll_tables_perspective.html
helper_scrollto_tap.html
helper_subframe_style.css
helper_tall.html

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

@ -31,7 +31,8 @@ var subtests = [
{'file': 'helper_bug1271432.html', 'prefs': prefs},
{'file': 'helper_scroll_inactive_perspective.html', 'prefs': prefs},
{'file': 'helper_scroll_inactive_zindex.html', 'prefs': prefs},
{'file': 'helper_scroll_over_scrollbar.html', 'prefs': scrollbar_prefs}
{'file': 'helper_scroll_over_scrollbar.html', 'prefs': scrollbar_prefs},
{'file': 'helper_scroll_tables_perspective.html', 'prefs': prefs},
];
if (isApzEnabled()) {

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

@ -142,6 +142,13 @@ if os_bsd or os_linux:
'src/base/message_pump_glib.cc',
]
if os_solaris:
SOURCES += [
'src/base/atomicops_internals_x86_gcc.cc',
'src/base/process_util_linux.cc',
'src/base/time_posix.cc',
]
ost = CONFIG['OS_TEST']
if '86' not in ost and 'arm' not in ost and 'aarch64' != ost and 'mips' not in ost:
SOURCES += [

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

@ -2431,7 +2431,7 @@ CopyArray(JSContext* cx, HandleArrayObject arr, MutableHandleValue result)
if (!nobj)
return false;
EnsureArrayGroupAnalyzed(cx, nobj); //XXX
CopyBoxedOrUnboxedDenseElements(cx, nobj, arr, 0, 0, length);
nobj->initDenseElements(arr, 0, length);
result.setObject(*nobj);
return true;

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

@ -8713,11 +8713,10 @@ CodeGenerator::visitFallibleStoreElementV(LFallibleStoreElementV* lir)
masm.bind(&isFrozen);
}
typedef bool (*SetDenseOrUnboxedArrayElementFn)(JSContext*, HandleObject, int32_t,
HandleValue, bool strict);
static const VMFunction SetDenseOrUnboxedArrayElementInfo =
FunctionInfo<SetDenseOrUnboxedArrayElementFn>(SetDenseOrUnboxedArrayElement,
"SetDenseOrUnboxedArrayElement");
typedef bool (*SetDenseElementFn)(JSContext*, HandleNativeObject, int32_t, HandleValue,
bool strict);
static const VMFunction SetDenseElementInfo =
FunctionInfo<SetDenseElementFn>(jit::SetDenseElement, "SetDenseElement");
void
CodeGenerator::visitOutOfLineStoreElementHole(OutOfLineStoreElementHole* ool)
@ -8826,7 +8825,7 @@ CodeGenerator::visitOutOfLineStoreElementHole(OutOfLineStoreElementHole* ool)
else
pushArg(ToRegister(index));
pushArg(object);
callVM(SetDenseOrUnboxedArrayElementInfo, ins);
callVM(SetDenseElementInfo, ins);
restoreLive(ins);
masm.jump(ool->rejoin());
@ -9015,7 +9014,7 @@ CodeGenerator::visitArrayPopShiftT(LArrayPopShiftT* lir)
emitArrayPopShift(lir, lir->mir(), obj, elements, length, out);
}
typedef bool (*ArrayPushDenseFn)(JSContext*, HandleObject, HandleValue, uint32_t*);
typedef bool (*ArrayPushDenseFn)(JSContext*, HandleArrayObject, HandleValue, uint32_t*);
static const VMFunction ArrayPushDenseInfo =
FunctionInfo<ArrayPushDenseFn>(jit::ArrayPushDense, "ArrayPushDense");

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

@ -350,21 +350,20 @@ ArrayPopDense(JSContext* cx, HandleObject obj, MutableHandleValue rval)
}
bool
ArrayPushDense(JSContext* cx, HandleObject obj, HandleValue v, uint32_t* length)
ArrayPushDense(JSContext* cx, HandleArrayObject arr, HandleValue v, uint32_t* length)
{
*length = obj->as<ArrayObject>().length();
DenseElementResult result =
SetOrExtendBoxedOrUnboxedDenseElements(cx, obj, *length, v.address(), 1,
ShouldUpdateTypes::DontUpdate);
*length = arr->length();
DenseElementResult result = arr->setOrExtendDenseElements(cx, *length, v.address(), 1,
ShouldUpdateTypes::DontUpdate);
if (result != DenseElementResult::Incomplete) {
(*length)++;
return result == DenseElementResult::Success;
}
// AutoDetectInvalidation uses GetTopJitJSScript(cx)->ionScript(), but it's
// possible the SetOrExtendAnyBoxedOrUnboxedDenseElements call already
// invalidated the IonScript. JSJitFrameIter::ionScript works when the
// script is invalidated so we use that instead.
// possible the setOrExtendDenseElements call already invalidated the
// IonScript. JSJitFrameIter::ionScript works when the script is invalidated
// so we use that instead.
JSJitFrameIter frame(cx);
MOZ_ASSERT(frame.type() == JitFrame_Exit);
++frame;
@ -373,7 +372,7 @@ ArrayPushDense(JSContext* cx, HandleObject obj, HandleValue v, uint32_t* length)
JS::AutoValueArray<3> argv(cx);
AutoDetectInvalidation adi(cx, argv[0], ionScript);
argv[0].setUndefined();
argv[1].setObject(*obj);
argv[1].setObject(*arr);
argv[2].set(v);
if (!js::array_push(cx, 1, argv.begin()))
return false;
@ -1050,8 +1049,7 @@ InitRestParameter(JSContext* cx, uint32_t length, Value* rest, HandleObject temp
if (length > 0) {
if (!arrRes->ensureElements(cx, length))
return nullptr;
arrRes->setDenseInitializedLength(length);
arrRes->initDenseElements(0, rest, length);
arrRes->initDenseElements(rest, length);
arrRes->setLengthInt32(length);
}
return arrRes;
@ -1297,16 +1295,15 @@ Recompile(JSContext* cx)
}
bool
SetDenseOrUnboxedArrayElement(JSContext* cx, HandleObject obj, int32_t index,
HandleValue value, bool strict)
SetDenseElement(JSContext* cx, HandleNativeObject obj, int32_t index, HandleValue value,
bool strict)
{
// This function is called from Ion code for StoreElementHole's OOL path.
// In this case we know the object is native or an unboxed array and that
// no type changes are needed.
// In this case we know the object is native and that no type changes are
// needed.
DenseElementResult result =
SetOrExtendBoxedOrUnboxedDenseElements(cx, obj, index, value.address(), 1,
ShouldUpdateTypes::DontUpdate);
DenseElementResult result = obj->setOrExtendDenseElements(cx, index, value.address(), 1,
ShouldUpdateTypes::DontUpdate);
if (result != DenseElementResult::Incomplete)
return result == DenseElementResult::Success;

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

@ -662,7 +662,8 @@ MOZ_MUST_USE bool StringSplitHelper(JSContext* cx, HandleString str, HandleStrin
MutableHandleValue result);
MOZ_MUST_USE bool ArrayPopDense(JSContext* cx, HandleObject obj, MutableHandleValue rval);
MOZ_MUST_USE bool ArrayPushDense(JSContext* cx, HandleObject obj, HandleValue v, uint32_t* length);
MOZ_MUST_USE bool ArrayPushDense(JSContext* cx, HandleArrayObject arr, HandleValue v,
uint32_t* length);
MOZ_MUST_USE bool ArrayShiftDense(JSContext* cx, HandleObject obj, MutableHandleValue rval);
JSString* ArrayJoin(JSContext* cx, HandleObject array, HandleString sep);
MOZ_MUST_USE bool SetArrayLength(JSContext* cx, HandleObject obj, HandleValue value, bool strict);
@ -796,8 +797,8 @@ ForcedRecompile(JSContext* cx);
JSString* StringReplace(JSContext* cx, HandleString string, HandleString pattern,
HandleString repl);
MOZ_MUST_USE bool SetDenseOrUnboxedArrayElement(JSContext* cx, HandleObject obj, int32_t index,
HandleValue value, bool strict);
MOZ_MUST_USE bool SetDenseElement(JSContext* cx, HandleNativeObject obj, int32_t index,
HandleValue value, bool strict);
void AssertValidObjectPtr(JSContext* cx, JSObject* obj);
void AssertValidObjectOrNullPtr(JSContext* cx, JSObject* obj);

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

@ -2272,24 +2272,44 @@ Assembler::PatchConstantPoolLoad(void* loadAddr, void* constPoolAddr)
// Atomic instruction stuff:
BufferOffset
Assembler::as_ldrexd(Register rt, Register rt2, Register rn, Condition c)
{
MOZ_ASSERT(!(rt.code() & 1) && rt2.code() == rt.code()+1);
MOZ_ASSERT(rt.code() != 14 && rn.code() != 15);
return writeInst(0x01b00f9f | (int)c | RT(rt) | RN(rn));
}
BufferOffset
Assembler::as_ldrex(Register rt, Register rn, Condition c)
{
MOZ_ASSERT(rt.code() != 15 && rn.code() != 15);
return writeInst(0x01900f9f | (int)c | RT(rt) | RN(rn));
}
BufferOffset
Assembler::as_ldrexh(Register rt, Register rn, Condition c)
{
MOZ_ASSERT(rt.code() != 15 && rn.code() != 15);
return writeInst(0x01f00f9f | (int)c | RT(rt) | RN(rn));
}
BufferOffset
Assembler::as_ldrexb(Register rt, Register rn, Condition c)
{
MOZ_ASSERT(rt.code() != 15 && rn.code() != 15);
return writeInst(0x01d00f9f | (int)c | RT(rt) | RN(rn));
}
BufferOffset
Assembler::as_strexd(Register rd, Register rt, Register rt2, Register rn, Condition c)
{
MOZ_ASSERT(!(rt.code() & 1) && rt2.code() == rt.code()+1);
MOZ_ASSERT(rt.code() != 14 && rn.code() != 15 && rd.code() != 15);
MOZ_ASSERT(rd != rn && rd != rt && rd != rt2);
return writeInst(0x01a00f90 | (int)c | RD(rd) | RN(rn) | rt.code());
}
BufferOffset
Assembler::as_strex(Register rd, Register rt, Register rn, Condition c)
{
@ -2311,6 +2331,12 @@ Assembler::as_strexb(Register rd, Register rt, Register rn, Condition c)
return writeInst(0x01c00f90 | (int)c | RD(rd) | RN(rn) | rt.code());
}
BufferOffset
Assembler::as_clrex()
{
return writeInst(0xf57ff01f);
}
// Memory barrier stuff:
BufferOffset

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

@ -1560,23 +1560,32 @@ class Assembler : public AssemblerShared
// Load a 32 bit floating point immediate from a pool into a register.
BufferOffset as_FImm32Pool(VFPRegister dest, float value, Condition c = Always);
// Atomic instructions: ldrex, ldrexh, ldrexb, strex, strexh, strexb.
// Atomic instructions: ldrexd, ldrex, ldrexh, ldrexb, strexd, strex, strexh, strexb.
//
// The halfword and byte versions are available from ARMv6K forward.
// The doubleword, halfword, and byte versions are available from ARMv6K forward.
//
// The word versions are available from ARMv6 forward and can be used to
// implement the halfword and byte versions on older systems.
// LDREXD rt, rt2, [rn]. Constraint: rt even register, rt2=rt+1.
BufferOffset as_ldrexd(Register rt, Register rt2, Register rn, Condition c = Always);
// LDREX rt, [rn]
BufferOffset as_ldrex(Register rt, Register rn, Condition c = Always);
BufferOffset as_ldrexh(Register rt, Register rn, Condition c = Always);
BufferOffset as_ldrexb(Register rt, Register rn, Condition c = Always);
// STREXD rd, rt, rt2, [rn]. Constraint: rt even register, rt2=rt+1.
BufferOffset as_strexd(Register rd, Register rt, Register rt2, Register rn, Condition c = Always);
// STREX rd, rt, [rn]. Constraint: rd != rn, rd != rt.
BufferOffset as_strex(Register rd, Register rt, Register rn, Condition c = Always);
BufferOffset as_strexh(Register rd, Register rt, Register rn, Condition c = Always);
BufferOffset as_strexb(Register rd, Register rt, Register rn, Condition c = Always);
// CLREX
BufferOffset as_clrex();
// Memory synchronization.
// These are available from ARMv7 forward.
BufferOffset as_dmb(BarrierOption option = BarrierSY);

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

@ -1986,33 +1986,33 @@ Simulator::writeDW(int32_t addr, int32_t value1, int32_t value2)
int32_t
Simulator::readExDW(int32_t addr, int32_t* hibits)
{
#if defined(__clang__) && defined(__i386)
// This is OK for now, we don't yet generate LDREXD.
MOZ_CRASH("Unimplemented - 8-byte atomics are unsupported in Clang on i386");
#else
if ((addr & 3) == 0) {
SharedMem<uint64_t*> ptr = SharedMem<uint64_t*>::shared(reinterpret_cast<uint64_t*>(addr));
// The spec says that the low part of value shall be read from addr and
// the high part shall be read from addr+4. On a little-endian system
// where we read a 64-bit quadword the low part of the value will be in
// the low part of the quadword, and the high part of the value in the
// high part of the quadword.
uint64_t value = loadRelaxed(ptr);
exclusiveMonitorSet(value);
*hibits = int32_t(value);
return int32_t(value >> 32);
*hibits = int32_t(value >> 32);
return int32_t(value);
}
printf("Unaligned read at 0x%08x\n", addr);
MOZ_CRASH();
return 0;
#endif
}
int32_t
Simulator::writeExDW(int32_t addr, int32_t value1, int32_t value2)
{
#if defined(__clang__) && defined(__i386)
// This is OK for now, we don't yet generate STREXD.
MOZ_CRASH("Unimplemented - 8-byte atomics are unsupported in Clang on i386");
#else
if ((addr & 3) == 0) {
SharedMem<uint64_t*> ptr = SharedMem<uint64_t*>::shared(reinterpret_cast<uint64_t*>(addr));
uint64_t value = (uint64_t(value1) << 32) | uint32_t(value2);
// The spec says that value1 shall be stored at addr and value2 at
// addr+4. On a little-endian system that means constructing a 64-bit
// value where value1 is in the low half of a 64-bit quadword and value2
// is in the high half of the quadword.
uint64_t value = (uint64_t(value2) << 32) | uint32_t(value1);
bool held;
uint64_t expected = exclusiveMonitorGetAndClear(&held);
if (!held)
@ -2023,7 +2023,6 @@ Simulator::writeExDW(int32_t addr, int32_t value1, int32_t value2)
printf("Unaligned write at 0x%08x\n", addr);
MOZ_CRASH();
}
#endif
}
uintptr_t
@ -4689,6 +4688,9 @@ Simulator::decodeSpecialCondition(SimInstruction* instr)
case 0xA:
if (instr->bits(31,20) == 0xf57) {
switch (instr->bits(7,4)) {
case 1: // CLREX
exclusiveMonitorClear();
break;
case 5: // DMB
AtomicOperations::fenceSeqCst();
break;

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

@ -1891,6 +1891,9 @@ Decoder::DecodeSpecialCondition(Instruction* instr)
case 15: option = "sy"; break;
}
switch (instr->Bits(7, 4)) {
case 1:
Print("clrex");
break;
case 4:
out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
"dsb %s", option);

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

@ -3677,7 +3677,7 @@ CloneFunctionObject(JSContext* cx, HandleObject funobj, HandleObject env, Handle
return nullptr;
}
if (IsAsmJSModule(fun)) {
if (IsAsmJSModule(fun) || wasm::IsExportedFunction(fun)) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_CANT_CLONE_OBJECT);
return nullptr;
}

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

@ -338,8 +338,8 @@ ElementAdder::append(JSContext* cx, HandleValue v)
{
MOZ_ASSERT(index_ < length_);
if (resObj_) {
DenseElementResult result =
SetOrExtendBoxedOrUnboxedDenseElements(cx, resObj_, index_, v.address(), 1);
NativeObject* resObj = &resObj_->as<NativeObject>();
DenseElementResult result = resObj->setOrExtendDenseElements(cx, index_, v.address(), 1);
if (result == DenseElementResult::Failure)
return false;
if (result == DenseElementResult::Incomplete) {
@ -1491,9 +1491,9 @@ SetArrayElements(JSContext* cx, HandleObject obj, uint64_t start,
return true;
if (!ObjectMayHaveExtraIndexedProperties(obj) && start <= UINT32_MAX) {
DenseElementResult result =
SetOrExtendBoxedOrUnboxedDenseElements(cx, obj, uint32_t(start), vector, count,
updateTypes);
NativeObject* nobj = &obj->as<NativeObject>();
DenseElementResult result = nobj->setOrExtendDenseElements(cx, uint32_t(start), vector,
count, updateTypes);
if (result != DenseElementResult::Incomplete)
return result == DenseElementResult::Success;
}
@ -2283,8 +2283,8 @@ js::array_push(JSContext* cx, unsigned argc, Value* vp)
if (!ObjectMayHaveExtraIndexedProperties(obj) && length <= UINT32_MAX) {
DenseElementResult result =
SetOrExtendBoxedOrUnboxedDenseElements(cx, obj, uint32_t(length),
args.array(), args.length());
obj->as<NativeObject>().setOrExtendDenseElements(cx, uint32_t(length),
args.array(), args.length());
if (result != DenseElementResult::Incomplete) {
if (result == DenseElementResult::Failure)
return false;
@ -2292,9 +2292,8 @@ js::array_push(JSContext* cx, unsigned argc, Value* vp)
uint32_t newlength = uint32_t(length) + args.length();
args.rval().setNumber(newlength);
// SetOrExtendAnyBoxedOrUnboxedDenseElements takes care of updating the
// length for boxed and unboxed arrays. Handle updates to the length of
// non-arrays here.
// setOrExtendDenseElements takes care of updating the length for
// arrays. Handle updates to the length of non-arrays here.
if (!obj->is<ArrayObject>()) {
MOZ_ASSERT(obj->is<NativeObject>());
return SetLengthProperty(cx, obj, newlength);
@ -2381,6 +2380,20 @@ SetInitializedLength(JSContext* cx, NativeObject* obj, size_t initlen)
obj->shrinkElements(cx, initlen);
}
static DenseElementResult
MoveDenseElements(JSContext* cx, NativeObject* obj, uint32_t dstStart, uint32_t srcStart,
uint32_t length)
{
if (obj->denseElementsAreFrozen())
return DenseElementResult::Incomplete;
if (!obj->maybeCopyElementsForWrite(cx))
return DenseElementResult::Failure;
obj->moveDenseElements(dstStart, srcStart, length);
return DenseElementResult::Success;
}
static DenseElementResult
ArrayShiftDenseKernel(JSContext* cx, HandleObject obj, MutableHandleValue rval)
{
@ -2401,7 +2414,7 @@ ArrayShiftDenseKernel(JSContext* cx, HandleObject obj, MutableHandleValue rval)
if (obj->as<NativeObject>().tryShiftDenseElements(1))
return DenseElementResult::Success;
DenseElementResult result = MoveBoxedOrUnboxedDenseElements(cx, obj, 0, 1, initlen - 1);
DenseElementResult result = MoveDenseElements(cx, &obj->as<NativeObject>(), 0, 1, initlen - 1);
if (result != DenseElementResult::Success)
return result;
@ -2661,14 +2674,12 @@ CopyDenseArrayElements(JSContext* cx, HandleNativeObject obj, uint32_t begin, ui
if (!narr)
return nullptr;
MOZ_ASSERT(count >= narr->as<ArrayObject>().length());
narr->as<ArrayObject>().setLength(cx, count);
MOZ_ASSERT(count >= narr->length());
narr->setLength(cx, count);
if (newlength > 0)
narr->initDenseElements(obj, begin, newlength);
if (newlength) {
DebugOnly<DenseElementResult> result =
CopyBoxedOrUnboxedDenseElements(cx, narr, obj, 0, begin, newlength);
MOZ_ASSERT(result.value == DenseElementResult::Success);
}
return narr;
}
@ -2856,16 +2867,16 @@ array_splice_impl(JSContext* cx, unsigned argc, Value* vp, bool returnValueIsUse
MOZ_ASSERT(sourceIndex <= len && targetIndex <= len && len <= UINT32_MAX,
"sourceIndex and targetIndex are uint32 array indices");
MOZ_ASSERT(finalLength < len, "finalLength is strictly less than len");
MOZ_ASSERT(obj->isNative());
/* Steps 15.a-b. */
if (targetIndex != 0 ||
!obj->is<NativeObject>() ||
!obj->as<NativeObject>().tryShiftDenseElements(sourceIndex))
{
DenseElementResult result =
MoveBoxedOrUnboxedDenseElements(cx, obj, uint32_t(targetIndex),
uint32_t(sourceIndex),
uint32_t(len - sourceIndex));
DenseElementResult result = MoveDenseElements(cx, &obj->as<NativeObject>(),
uint32_t(targetIndex),
uint32_t(sourceIndex),
uint32_t(len - sourceIndex));
MOZ_ASSERT(result != DenseElementResult::Incomplete);
if (result == DenseElementResult::Failure)
return false;
@ -2962,10 +2973,10 @@ array_splice_impl(JSContext* cx, unsigned argc, Value* vp, bool returnValueIsUse
uint32_t start = uint32_t(actualStart);
uint32_t length = uint32_t(len);
DenseElementResult result =
MoveBoxedOrUnboxedDenseElements(cx, obj, start + itemCount,
start + deleteCount,
length - (start + deleteCount));
DenseElementResult result = MoveDenseElements(cx, &obj->as<NativeObject>(),
start + itemCount,
start + deleteCount,
length - (start + deleteCount));
MOZ_ASSERT(result != DenseElementResult::Incomplete);
if (result == DenseElementResult::Failure)
return false;
@ -3336,10 +3347,10 @@ ArraySliceDenseKernel(JSContext* cx, ArrayObject* arr, int32_t beginArg, int32_t
size_t initlen = arr->getDenseInitializedLength();
if (initlen > begin) {
uint32_t newlength = Min<uint32_t>(initlen - begin, count);
if (newlength) {
if (newlength > 0) {
if (!result->ensureElements(cx, newlength))
return false;
CopyBoxedOrUnboxedDenseElements(cx, result, arr, 0, begin, newlength);
result->initDenseElements(arr, begin, newlength);
}
}
@ -3844,11 +3855,10 @@ js::NewDenseCopiedArray(JSContext* cx, uint32_t length, const Value* values,
return nullptr;
MOZ_ASSERT(arr->getDenseCapacity() >= length);
arr->setDenseInitializedLength(values ? length : 0);
MOZ_ASSERT(arr->getDenseInitializedLength() == 0);
if (values)
arr->initDenseElements(0, values, length);
arr->initDenseElements(values, length);
return arr;
}
@ -4005,8 +4015,7 @@ js::NewCopiedArrayTryUseGroup(JSContext* cx, HandleObjectGroup group,
if (!obj)
return nullptr;
DenseElementResult result =
SetOrExtendBoxedOrUnboxedDenseElements(cx, obj, 0, vp, length, updateTypes);
DenseElementResult result = obj->setOrExtendDenseElements(cx, 0, vp, length, updateTypes);
if (result == DenseElementResult::Failure)
return nullptr;

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

@ -102,12 +102,6 @@ NewFullyAllocatedArrayForCallingAllocationSite(JSContext* cx, size_t length,
extern ArrayObject*
NewPartlyAllocatedArrayForCallingAllocationSite(JSContext* cx, size_t length, HandleObject proto);
enum class ShouldUpdateTypes
{
Update,
DontUpdate
};
extern ArrayObject*
NewCopiedArrayTryUseGroup(JSContext* cx, HandleObjectGroup group,
const Value* vp, size_t length,

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

@ -646,6 +646,13 @@ if CONFIG['NIGHTLY_BUILD']:
if CONFIG['NIGHTLY_BUILD']:
DEFINES['ENABLE_WASM_THREAD_OPS'] = True
# Wasm code should use WASM_HUGE_MEMORY instead of JS_CODEGEN_X64
# so that it is easy to use the huge-mapping optimization for other
# 64-bit platforms in the future.
if CONFIG['JS_CODEGEN_X64']:
DEFINES['WASM_HUGE_MEMORY'] = True
if CONFIG['MOZ_DEBUG'] or CONFIG['NIGHTLY_BUILD']:
DEFINES['JS_CACHEIR_SPEW'] = True

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

@ -3047,14 +3047,13 @@ static bool
Clone(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
RootedObject parent(cx);
RootedObject funobj(cx);
if (!args.length()) {
if (args.length() == 0) {
JS_ReportErrorASCII(cx, "Invalid arguments to clone");
return false;
}
RootedObject funobj(cx);
{
Maybe<JSAutoCompartment> ac;
RootedObject obj(cx, args[0].isPrimitive() ? nullptr : &args[0].toObject());
@ -3074,19 +3073,20 @@ Clone(JSContext* cx, unsigned argc, Value* vp)
}
}
RootedObject env(cx);
if (args.length() > 1) {
if (!JS_ValueToObject(cx, args[1], &parent))
if (!JS_ValueToObject(cx, args[1], &env))
return false;
} else {
parent = js::GetGlobalForObjectCrossCompartment(&args.callee());
env = js::GetGlobalForObjectCrossCompartment(&args.callee());
}
// Should it worry us that we might be getting with wrappers
// around with wrappers here?
JS::AutoObjectVector scopeChain(cx);
if (!parent->is<GlobalObject>() && !scopeChain.append(parent))
JS::AutoObjectVector envChain(cx);
if (env && !env->is<GlobalObject>() && !envChain.append(env))
return false;
JSObject* clone = JS::CloneFunctionObject(cx, funobj, scopeChain);
JSObject* clone = JS::CloneFunctionObject(cx, funobj, envChain);
if (!clone)
return false;
args.rval().setObject(*clone);
@ -6213,6 +6213,10 @@ WasmLoop(JSContext* cx, unsigned argc, Value* vp)
}
static const JSFunctionSpecWithHelp shell_functions[] = {
JS_FN_HELP("clone", Clone, 1, 0,
"clone(fun[, scope])",
" Clone function object."),
JS_FN_HELP("version", Version, 0, 0,
"version([number])",
" Get or force a script compilation version number."),
@ -6694,10 +6698,6 @@ static const JSFunctionSpecWithHelp shell_functions[] = {
};
static const JSFunctionSpecWithHelp fuzzing_unsafe_functions[] = {
JS_FN_HELP("clone", Clone, 1, 0,
"clone(fun[, scope])",
" Clone function object."),
JS_FN_HELP("getSelfHostedValue", GetSelfHostedValue, 1, 0,
"getSelfHostedValue()",
" Get a self-hosted value by its name. Note that these values don't get \n"

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

@ -158,17 +158,31 @@ NativeObject::copyDenseElements(uint32_t dstStart, const Value* src, uint32_t co
}
inline void
NativeObject::initDenseElements(uint32_t dstStart, const Value* src, uint32_t count)
NativeObject::initDenseElements(NativeObject* src, uint32_t srcStart, uint32_t count)
{
MOZ_ASSERT(dstStart + count <= getDenseCapacity());
MOZ_ASSERT(src->getDenseInitializedLength() >= srcStart + count);
const Value* vp = src->getDenseElements() + srcStart;
initDenseElements(vp, count);
}
inline void
NativeObject::initDenseElements(const Value* src, uint32_t count)
{
MOZ_ASSERT(getDenseInitializedLength() == 0);
MOZ_ASSERT(count <= getDenseCapacity());
MOZ_ASSERT(!denseElementsAreCopyOnWrite());
MOZ_ASSERT(!denseElementsAreFrozen());
setDenseInitializedLength(count);
#ifdef DEBUG
for (uint32_t i = 0; i < count; ++i)
checkStoredValue(src[i]);
#endif
memcpy(&elements_[dstStart], src, count * sizeof(HeapSlot));
elementsRangeWriteBarrierPost(dstStart, count);
memcpy(elements_, src, count * sizeof(HeapSlot));
elementsRangeWriteBarrierPost(0, count);
}
inline bool
@ -382,6 +396,38 @@ NativeObject::ensureDenseElements(JSContext* cx, uint32_t index, uint32_t extra)
return DenseElementResult::Success;
}
inline DenseElementResult
NativeObject::setOrExtendDenseElements(JSContext* cx, uint32_t start, const Value* vp,
uint32_t count,
ShouldUpdateTypes updateTypes)
{
if (denseElementsAreFrozen())
return DenseElementResult::Incomplete;
if (is<ArrayObject>() &&
!as<ArrayObject>().lengthIsWritable() &&
start + count >= as<ArrayObject>().length())
{
return DenseElementResult::Incomplete;
}
DenseElementResult result = ensureDenseElements(cx, start, count);
if (result != DenseElementResult::Success)
return result;
if (is<ArrayObject>() && start + count >= as<ArrayObject>().length())
as<ArrayObject>().setLengthInt32(start + count);
if (updateTypes == ShouldUpdateTypes::DontUpdate && !shouldConvertDoubleElements()) {
copyDenseElements(start, vp, count);
} else {
for (size_t i = 0; i < count; i++)
setDenseElementWithType(cx, start + i, vp[i]);
}
return DenseElementResult::Success;
}
inline Value
NativeObject::getDenseOrTypedArrayElement(uint32_t idx)
{

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

@ -406,6 +406,11 @@ enum class DenseElementResult {
Incomplete
};
enum class ShouldUpdateTypes {
Update,
DontUpdate
};
/*
* NativeObject specifies the internal implementation of a native object.
*
@ -1224,10 +1229,15 @@ class NativeObject : public ShapedObject
inline Value getDenseOrTypedArrayElement(uint32_t idx);
inline void copyDenseElements(uint32_t dstStart, const Value* src, uint32_t count);
inline void initDenseElements(uint32_t dstStart, const Value* src, uint32_t count);
inline void initDenseElements(const Value* src, uint32_t count);
inline void initDenseElements(NativeObject* src, uint32_t srcStart, uint32_t count);
inline void moveDenseElements(uint32_t dstStart, uint32_t srcStart, uint32_t count);
inline void moveDenseElementsNoPreBarrier(uint32_t dstStart, uint32_t srcStart, uint32_t count);
inline DenseElementResult
setOrExtendDenseElements(JSContext* cx, uint32_t start, const Value* vp, uint32_t count,
ShouldUpdateTypes updateTypes = ShouldUpdateTypes::Update);
bool shouldConvertDoubleElements() {
return getElementsHeader()->shouldConvertDoubleElements();
}

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

@ -168,78 +168,6 @@ UnboxedPlainObject::layout() const
return group()->unboxedLayout();
}
/////////////////////////////////////////////////////////////////////
// Template methods for NativeObject and UnboxedArrayObject accesses.
/////////////////////////////////////////////////////////////////////
static inline DenseElementResult
SetOrExtendBoxedOrUnboxedDenseElements(JSContext* cx, JSObject* obj,
uint32_t start, const Value* vp, uint32_t count,
ShouldUpdateTypes updateTypes = ShouldUpdateTypes::Update)
{
NativeObject* nobj = &obj->as<NativeObject>();
if (nobj->denseElementsAreFrozen())
return DenseElementResult::Incomplete;
if (obj->is<ArrayObject>() &&
!obj->as<ArrayObject>().lengthIsWritable() &&
start + count >= obj->as<ArrayObject>().length())
{
return DenseElementResult::Incomplete;
}
DenseElementResult result = nobj->ensureDenseElements(cx, start, count);
if (result != DenseElementResult::Success)
return result;
if (obj->is<ArrayObject>() && start + count >= obj->as<ArrayObject>().length())
obj->as<ArrayObject>().setLengthInt32(start + count);
if (updateTypes == ShouldUpdateTypes::DontUpdate && !nobj->shouldConvertDoubleElements()) {
nobj->copyDenseElements(start, vp, count);
} else {
for (size_t i = 0; i < count; i++)
nobj->setDenseElementWithType(cx, start + i, vp[i]);
}
return DenseElementResult::Success;
}
static inline DenseElementResult
MoveBoxedOrUnboxedDenseElements(JSContext* cx, JSObject* obj, uint32_t dstStart, uint32_t srcStart,
uint32_t length)
{
MOZ_ASSERT(obj->isNative());
if (obj->as<NativeObject>().denseElementsAreFrozen())
return DenseElementResult::Incomplete;
if (!obj->as<NativeObject>().maybeCopyElementsForWrite(cx))
return DenseElementResult::Failure;
obj->as<NativeObject>().moveDenseElements(dstStart, srcStart, length);
return DenseElementResult::Success;
}
static inline DenseElementResult
CopyBoxedOrUnboxedDenseElements(JSContext* cx, JSObject* dst, JSObject* src,
uint32_t dstStart, uint32_t srcStart, uint32_t length)
{
MOZ_ASSERT(src->isNative());
MOZ_ASSERT(dst->isNative());
MOZ_ASSERT(dst->as<NativeObject>().getDenseInitializedLength() == dstStart);
MOZ_ASSERT(src->as<NativeObject>().getDenseInitializedLength() >= srcStart + length);
MOZ_ASSERT(dst->as<NativeObject>().getDenseCapacity() >= dstStart + length);
dst->as<NativeObject>().setDenseInitializedLength(dstStart + length);
const Value* vp = src->as<NativeObject>().getDenseElements() + srcStart;
dst->as<NativeObject>().initDenseElements(dstStart, vp, length);
return DenseElementResult::Success;
}
} // namespace js
#endif // vm_UnboxedObject_inl_h

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

@ -30,6 +30,13 @@ using namespace js::wasm;
using mozilla::IsPowerOfTwo;
// A sanity check. We have only tested WASM_HUGE_MEMORY on x64, and only tested
// x64 with WASM_HUGE_MEMORY.
#if defined(WASM_HUGE_MEMORY) != defined(JS_CODEGEN_X64)
# error "Not an expected configuration"
#endif
void
Val::writePayload(uint8_t* dst) const
{

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

@ -1650,12 +1650,7 @@ static const unsigned PageSize = 64 * 1024;
static const unsigned MaxMemoryAccessSize = sizeof(Val);
#ifdef JS_CODEGEN_X64
// All other code should use WASM_HUGE_MEMORY instead of JS_CODEGEN_X64 so that
// it is easy to use the huge-mapping optimization for other 64-bit platforms in
// the future.
# define WASM_HUGE_MEMORY
#ifdef WASM_HUGE_MEMORY
// On WASM_HUGE_MEMORY platforms, every asm.js or WebAssembly memory
// unconditionally allocates a huge region of virtual memory of size

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

@ -78,6 +78,12 @@ ExpectedOwnerForChild(const nsIFrame& aFrame)
return parent;
}
if (aFrame.IsLetterFrame()) {
// Ditto for ::first-letter. A first-letter always arrives here via its
// direct parent, except when it's parented to a ::first-line.
return parent->IsLineFrame() ? parent->GetParent() : parent;
}
parent = FirstContinuationOrPartOfIBSplit(parent);
// We've handled already anon boxes and bullet frames, so now we're looking at
@ -567,6 +573,8 @@ UpdateBackdropIfNeeded(nsIFrame* aFrame,
static void
UpdateFirstLetterIfNeeded(nsIFrame* aFrame, ServoRestyleState& aRestyleState)
{
MOZ_ASSERT(!aFrame->IsFrameOfType(nsIFrame::eBlockFrame),
"You're probably duplicating work with UpdatePseudoElementStyles!");
if (!aFrame->HasFirstLetterChild()) {
return;
}
@ -574,10 +582,11 @@ UpdateFirstLetterIfNeeded(nsIFrame* aFrame, ServoRestyleState& aRestyleState)
// We need to find the block the first-letter is associated with so we can
// find the right element for the first-letter's style resolution. Might as
// well just delegate the whole thing to that block.
nsIFrame* block = aFrame;
nsIFrame* block = aFrame->GetParent();
while (!block->IsFrameOfType(nsIFrame::eBlockFrame)) {
block = block->GetParent();
}
static_cast<nsBlockFrame*>(block->FirstContinuation())->
UpdateFirstLetterStyle(aRestyleState);
}
@ -638,12 +647,10 @@ static void
UpdateFramePseudoElementStyles(nsIFrame* aFrame,
ServoRestyleState& aRestyleState)
{
// first-letter needs to be updated before first-line, because first-line can
// change the style of the first-letter.
UpdateFirstLetterIfNeeded(aFrame, aRestyleState);
if (aFrame->IsFrameOfType(nsIFrame::eBlockFrame)) {
static_cast<nsBlockFrame*>(aFrame)->UpdatePseudoElementStyles(aRestyleState);
} else {
UpdateFirstLetterIfNeeded(aFrame, aRestyleState);
}
UpdateBackdropIfNeeded(

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

@ -7581,6 +7581,12 @@ nsBlockFrame::ResolveBidi()
void
nsBlockFrame::UpdatePseudoElementStyles(ServoRestyleState& aRestyleState)
{
// first-letter needs to be updated before first-line, because first-line can
// change the style of the first-letter.
if (HasFirstLetterChild()) {
UpdateFirstLetterStyle(aRestyleState);
}
if (nsBulletFrame* bullet = GetBullet()) {
CSSPseudoElementType type = bullet->StyleContext()->GetPseudoType();
RefPtr<nsStyleContext> newBulletStyle =

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

@ -0,0 +1,12 @@
<!doctype html>
<style>
text::first-letter {
font-size: 3em;
}
text {
font-size: 15px;
}
</style>
<svg width="500px" height="50px">
<text x="0" y="40">The first-letter size should be 45px</text>
</svg>

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

@ -0,0 +1,16 @@
<!doctype html>
<style>
text::first-letter {
font-size: 3em;
}
text {
font-size: 10px;
}
</style>
<svg width="500px" height="50px">
<text x="0" y="40">The first-letter size should be 45px</text>
</svg>
<script>
document.body.offsetTop;
document.querySelector('text').style.fontSize = "15px";
</script>

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

@ -0,0 +1,13 @@
<!doctype html>
<style>
td::first-letter {
border: inherit;
}
</style>
<table>
<tr>
<td style="border: 10px solid green">
This text should have a green border on the first letter.
</td>
</tr>
</table>

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

@ -0,0 +1,18 @@
<!doctype html>
<style>
td::first-letter {
border: inherit;
}
</style>
<table>
<tr>
<td style="border: 10px solid red">
This text should have a green border on the first letter.
</td>
</tr>
</table>
<script>
document.body.offsetTop;
document.querySelector('td').style.borderColor = "green";
document.body.offsetTop;
</script>

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

@ -0,0 +1,9 @@
<!doctype html>
<style>
fieldset::first-letter {
border: inherit;
}
</style>
<fieldset style="border: 10px solid green;">
This text should have a green border on the first letter.
</fieldset>

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

@ -0,0 +1,14 @@
<!doctype html>
<style>
fieldset::first-letter {
border: inherit;
}
</style>
<fieldset style="border: 10px solid red;">
This text should have a green border on the first letter.
</fieldset>
<script>
document.body.offsetTop;
document.querySelector('fieldset').style.borderColor = "green";
document.body.offsetTop;
</script>

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

@ -0,0 +1,11 @@
<!doctype html>
<style>
div::first-letter {
color: green;
}
div::first-line {
color: blue;
}
</style>
<div style="font-size: 20px">My first letter should be green, and the whole line 20px in size</div>

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

@ -0,0 +1,16 @@
<!doctype html>
<style>
div::first-letter {
color: green;
}
div::first-line {
color: blue;
}
</style>
<div>My first letter should be green, and the whole line 20px in size</div>
<script>
document.body.offsetTop;
document.querySelector('div').style.fontSize = "20px";
document.body.offsetTop;
</script>

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

@ -75,3 +75,7 @@ HTTP(..) == indic-clusters-1.html indic-clusters-1-ref.html
== overflow-inline-overflow.html overflow-inline-overflow-ref.html
== 1385656.html 1385656-ref.html
== 1404167-1.html 1404167-1-ref.html
== 1404167-2.html 1404167-2-ref.html
== 1404167-3.html 1404167-3-ref.html
== 1404167-4.html 1404167-4-ref.html

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

@ -6,6 +6,7 @@ from contextlib import closing
import sys
import logging
import os
import psutil
import signal
import time
import tempfile
@ -14,7 +15,6 @@ import urllib2
import mozdevice
import mozinfo
import mozprocess
from automation import Automation
from remoteautomation import RemoteAutomation, fennecLogcatFilters
@ -240,34 +240,25 @@ class RemoteReftest(RefTest):
def stopWebServer(self, options):
self.server.stop()
def killNamedProc(self, pname):
def killNamedProc(self, pname, orphans=True):
""" Kill processes matching the given command name """
self.log.info("Checking for %s processes..." % pname)
def _psInfo(line):
if pname in line:
self.log.info(line)
process = mozprocess.ProcessHandler(['ps', '-f'],
processOutputLine=_psInfo)
process.run()
process.wait()
def _psKill(line):
parts = line.split()
if len(parts) == 3 and parts[0].isdigit():
pid = int(parts[0])
if parts[2] == pname:
self.log.info("killing %s with pid %d" % (pname, pid))
try:
os.kill(
pid, getattr(signal, "SIGKILL", signal.SIGTERM))
except Exception as e:
self.log.info("Failed to kill process %d: %s" %
(pid, str(e)))
process = mozprocess.ProcessHandler(['ps', '-o', 'pid,ppid,comm'],
processOutputLine=_psKill)
process.run()
process.wait()
for proc in psutil.process_iter():
try:
if proc.name() == pname:
procd = proc.as_dict(attrs=['pid', 'ppid', 'name', 'username'])
if proc.ppid() == 1 or not orphans:
self.log.info("killing %s" % procd)
try:
os.kill(proc.pid, getattr(signal, "SIGKILL", signal.SIGTERM))
except Exception as e:
self.log.info("Failed to kill process %d: %s" % (proc.pid, str(e)))
else:
self.log.info("NOT killing %s (not an orphan?)" % procd)
except:
# may not be able to access process info for all processes
continue
def createReftestProfile(self, options, manifest, startAfter=None):
profile = RefTest.createReftestProfile(self,

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

@ -274,6 +274,8 @@ void PlatformUIThread::Stop() {
PostMessage(hwnd_, WM_CLOSE, 0, 0);
hwnd_ = NULL;
PlatformThread::Stop();
}
#endif

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

@ -563,14 +563,13 @@ private:
rbp_r_p->SetRight(rbp_r_t);
}
break;
} else {
/* This is the node we want to delete, but we
* will instead swap it with its successor
* and delete the successor. Record enough
* information to do the swap later.
* rbp_r_xp is aNode's parent. */
rbp_r_xp = rbp_r_p;
}
/* This is the node we want to delete, but we
* will instead swap it with its successor
* and delete the successor. Record enough
* information to do the swap later.
* rbp_r_xp is aNode's parent. */
rbp_r_xp = rbp_r_p;
}
rbp_r_t = rbp_r_c->Right();
rbp_r_u = rbp_r_t->Left();

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

@ -5906,5 +5906,9 @@ pref("toolkit.crashreporter.include_context_heap", true);
// Open noopener links in a new process
pref("dom.noopener.newprocess.enabled", true);
#ifdef XP_WIN
pref("layers.omtp.enabled", true);
#else
pref("layers.omtp.enabled", false);
#endif
pref("layers.omtp.force-sync", false);

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

@ -1140,4 +1140,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
static const int32_t kUnknownId = -1;
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1515000916175000);
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1515173442818000);

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

@ -13,7 +13,6 @@
#include "SharedSSLState.h"
#include "cert.h"
#include "certdb.h"
#include "mozStorageCID.h"
#include "mozilla/ArrayUtils.h"
#include "mozilla/Assertions.h"
#include "mozilla/Casting.h"
@ -2263,14 +2262,6 @@ nsNSSComponent::Init()
return NS_ERROR_NOT_AVAILABLE;
}
// To avoid a sqlite3_config race in NSS init, as a workaround for
// bug 730495, we require the storage service to get initialized first.
nsCOMPtr<nsISupports> storageService =
do_GetService(MOZ_STORAGE_SERVICE_CONTRACTID);
if (!storageService) {
return NS_ERROR_NOT_AVAILABLE;
}
MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("Beginning NSS initialization\n"));
nsresult rv = InitializePIPNSSBundle();

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

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

@ -8,7 +8,7 @@
/*****************************************************************************/
#include <stdint.h>
const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
const PRTime gPreloadListExpirationTime = INT64_C(1517592632694000);
%%
0-1.party, 1
0.me.uk, 1
@ -34,7 +34,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
040fitvitality.nl, 1
046569.com, 1
04sun.com, 1
050508.com, 1
050media.nl, 1
0513c.com, 1
0573wk.com, 1
@ -44,7 +43,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
0c3.de, 1
0cdn.ga, 1
0day.agency, 1
0day.su, 1
0fl.com, 1
0i0.nl, 1
0ik.de, 1
@ -116,7 +114,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
132kv.ch, 1
13318522.com, 1
1359826938.rsc.cdn77.org, 1
1391kj.com, 1
1395kj.com, 1
1396.cc, 1
1453914078.rsc.cdn77.org, 1
@ -186,7 +183,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
247a.co.uk, 1
247healthshop.com, 1
247medplan.com, 1
247quickbooks.com, 1
2488.ch, 1
24hrs.shopping, 1
24ip.com, 1
@ -230,7 +226,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
2ulcceria.nl, 1
300mbmovie24.com, 1
3133780x.com, 1
314166.com, 1
314chan.org, 1
31klabs.com, 1
31tv.ru, 1
@ -329,8 +324,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
500p.xyz, 1
50plusnet.nl, 1
513vpn.net, 1
517vpn.cn, 1
518maicai.com, 0
518maicai.com, 1
525.info, 1
52neptune.com, 1
5432.cc, 1
@ -593,7 +587,7 @@ aciksite.com, 1
acksoft.fr, 1
acksoftdemo.fr, 1
aclu.org, 0
acluva.org, 1
acluva.org, 0
acme.beer, 1
acmexyz123.info, 1
acnpacific.com, 1
@ -609,7 +603,6 @@ acsc.gov.au, 1
acsemb.org, 1
acsihostingsolutions.com, 1
acsports.ca, 1
actgruppe.de, 1
actilove.ch, 1
actionmadagascar.ch, 1
actionsack.com, 1
@ -856,6 +849,7 @@ agrekov.ru, 1
agreor.com, 1
agrias.com.br, 1
agridir.site, 1
agroglass.com.br, 1
agroline.by, 1
agroyard.com.ua, 1
agsb.ch, 1
@ -1384,7 +1378,6 @@ angelinahair.com, 1
angeloventuri.com, 1
anginf.de, 1
anglertanke.de, 1
anglesya.win, 1
anglictina-sojcak.cz, 1
anglictinasojcak.cz, 1
angrapa.ru, 1
@ -1396,12 +1389,14 @@ angusmak.com, 1
animacurse.moe, 1
animaemundi.be, 1
animal-liberation.com, 1
animal-nature-human.com, 1
animal-rights.com, 1
animalnet.de, 0
animalstropic.com, 1
animationsmusicales.ch, 1
anime.my, 0
anime1.me, 1
anime1.moe, 1
anime1.top, 1
animeai.com, 1
animefluxxx.com, 1
@ -1745,6 +1740,7 @@ armstrongsengineering.com, 1
army24.cz, 1
armyofbane.com, 1
armyprodej.cz, 1
arnaudb.net, 1
arnaudfeld.de, 1
arnaudminable.net, 1
arne-petersen.net, 1
@ -1899,6 +1895,7 @@ astec-informatica.com, 1
astengox.com, 1
astenretail.com, 1
asthon.cn, 1
astraalivankila.net, 1
astral.gq, 1
astrea-voetbal-groningen.nl, 1
astronomie-fulda.de, 1
@ -2486,6 +2483,7 @@ bearcosports.com.br, 1
bearded.sexy, 1
bearden.io, 1
bearingworks.com, 1
beasel.biz, 1
beastowner.li, 1
beatnikbreaks.com, 1
beaute-eternelle.ch, 1
@ -2633,7 +2631,6 @@ bentley.link, 1
bentrask.com, 1
benzou-space.com, 1
beoordelingen.be, 1
bep362.vn, 1
beranovi.com, 1
berasavocate.com, 1
beraten-entwickeln-steuern.de, 1
@ -2641,7 +2638,6 @@ berdu.id, 1
berduri.com, 1
bergenhave.nl, 1
bergevoet-fa.nl, 1
bergland-seefeld.at, 1
bergstoneware.com, 1
berlin-flirt.de, 1
berlin-kohlefrei.de, 1
@ -2752,7 +2748,6 @@ beyours.be, 1
bezoomnyville.com, 1
bezpecnostsiti.cf, 1
bfam.tv, 1
bfd.vodka, 1
bfi.wien, 0
bfrailwayclub.cf, 1
bftbradio.com, 1
@ -2862,7 +2857,6 @@ binaryabstraction.com, 1
binaryapparatus.com, 1
binaryappdev.com, 1
binaryevolved.com, 1
binaryfigments.com, 1
binarystud.io, 1
binding-problem.com, 1
binfind.com, 1
@ -3184,6 +3178,7 @@ bm-i.ch, 1
bm-immo.ch, 1
bmet.de, 1
bmoattachments.org, 1
bmone.net, 1
bmros.com.ar, 1
bn1digital.co.uk, 1
bnb-buddy.nl, 1
@ -3194,6 +3189,7 @@ boatme.de, 1
bobancoamigo.com, 1
bobazar.com, 1
bobcopeland.com, 1
bobep.ru, 1
bobiji.com, 0
bobisec.cz, 1
bobkoetsier.nl, 1
@ -3469,6 +3465,7 @@ brentacampbell.com, 1
bress.cloud, 1
bressier.fr, 1
bretcarmichael.com, 1
brettabel.com, 1
brettcornwall.com, 1
brettelliff.com, 1
bretzner.fr, 1
@ -3672,7 +3669,7 @@ burke.services, 1
burlapsac.ca, 1
burlesquemakeup.com, 1
burnerfitness.com, 1
burningflipside.com, 1
burningflipside.com, 0
burntfish.com, 1
burnworks.com, 1
buronwater.com, 1
@ -4091,6 +4088,7 @@ catmoose.ca, 1
catnet.dk, 0
catnmeow.com, 1
catsmagic.pp.ua, 1
cattivo.nl, 0
caughtredhanded.co.nz, 1
caulfieldeastapartments.com.au, 1
caulfieldracecourseapartments.com.au, 1
@ -4590,6 +4588,7 @@ cimballa.com, 1
cimfax.com, 1
cinafilm.com, 1
cine-music.de, 1
cinefilia.tk, 1
cinefilzonen.se, 1
cinema5.ru, 1
cinemaclub.co, 1
@ -4637,6 +4636,7 @@ cittadesign.com, 0
citya.com, 1
citybusexpress.com, 1
citylights.eu, 1
citymoobel.ee, 1
cityoftitans.com, 1
cityoftitansmmo.com, 1
citysportapp.com, 1
@ -4831,7 +4831,6 @@ cnwage.com, 1
co-factor.ro, 1
co-yutaka.com, 1
co.search.yahoo.com, 0
coach-sportif.paris, 1
coachezmoi.ch, 1
coaching-impulse.ch, 1
coachingconsultancy.com, 1
@ -4844,6 +4843,7 @@ cobalt.io, 1
cobaltgp.com, 1
cobaltlp.com, 1
cocaine-import.agency, 1
cocaine.ninja, 1
cocalc.com, 1
coccinellaskitchen.com, 1
coccinellaskitchen.de, 1
@ -4973,7 +4973,6 @@ collaboracloudsuite.com, 1
collaboraoffice.co.uk, 1
collaboraoffice.com, 1
collabornation.net, 1
collabra.email, 1
collaction.hk, 1
collada.org, 1
collbox.co, 1
@ -5399,7 +5398,6 @@ creditkarma.com, 1
creditos-rapidos.com, 1
creditproautos.com, 0
creditstar.es, 1
creditstar.lt, 1
creeks-coworking.com, 1
creep.im, 1
creepycraft.nl, 1
@ -5892,7 +5890,6 @@ dashboard.run, 1
dashboard.yt, 1
dashnearby.com, 1
data.gov, 1
data.qld.gov.au, 0
data.world, 1
databeam.de, 1
databionix.com, 1
@ -5906,6 +5903,7 @@ datacentrenews.eu, 1
datacubed.com, 1
datadit.hu, 1
datadyne.technology, 1
dataformers.at, 1
datahove.no, 0
dataisme.com, 1
datajapan.co.jp, 1
@ -6105,6 +6103,7 @@ dee.su, 1
deep.club, 1
deeparamaraj.com, 1
deepbluecrafting.co.uk, 1
deepcreampie.com, 1
deeprecce.com, 1
deepserve.info, 1
deepsouthsounds.com, 1
@ -6154,7 +6153,6 @@ dejure.org, 1
dejw.cz, 1
delahrzolder.nl, 1
delbecqvo.be, 1
delbrouck.ch, 1
deleidscheflesch.nl, 1
delfic.org, 1
delhionlinegifts.com, 1
@ -6513,6 +6511,7 @@ dimonb.com, 1
din-tools.com, 1
dineachook.com.au, 1
dinepont.fr, 1
dingcc.com, 1
dingcc.org, 1
dingcc.xyz, 1
dinge.xyz, 1
@ -6559,7 +6558,7 @@ discofitta.com, 1
disconformity.net, 1
discord-chan.net, 1
discordapp.com, 1
discotek.club, 0
discotek.club, 1
discountmetaux.fr, 1
discover-mercure.com, 1
discoverhealthage.com, 0
@ -6714,7 +6713,6 @@ dogfi.sh, 1
dogft.com, 1
doggroomingcourse.com, 1
dogmap.jp, 1
dognlife.com, 1
dogoo.com, 1
dogworld.com.br, 1
dohanews.co, 1
@ -6724,6 +6722,7 @@ doku-gilde.de, 1
dokuboard.com, 1
dokuraum.de, 1
dolarcanadense.com.br, 1
dolcevitatech.education, 1
doleta.gov, 1
doli.se, 1
dolice.net, 1
@ -6795,6 +6794,7 @@ donthedragonwilson.com, 1
dontpayfull.com, 1
donttrust.me, 1
donutcompany.co.jp, 1
dooby.fr, 1
doodlefinder.de, 1
dooleylabs.com, 1
dooleytackaberry.com, 1
@ -7074,6 +7074,7 @@ dustri.org, 1
dustygroove.com, 1
dustyspokesbnb.ca, 1
dutch1.nl, 1
dutchessuganda.com, 1
dutchrank.nl, 1
dutchwanderers.nl, 1
dutchweballiance.nl, 1
@ -8454,7 +8455,6 @@ feel.aero, 1
feelgood-workouts.de, 1
feen.us, 1
fefelovalex.ru, 1
fegans.org.uk, 1
fehngarten.de, 1
fehnladen.de, 1
feigling.net, 1
@ -8592,6 +8592,7 @@ film-tutorial.com, 1
film.photography, 1
film.photos, 1
filmatiporno.xxx, 1
filme-online.eu.com, 1
filme-onlines.com, 1
filmreviewonline.com, 1
filmserver.de, 1
@ -8625,7 +8626,6 @@ finsprings.org, 1
finstererlebnis.de, 1
finsterlebnis.de, 1
fintandunleavy.com, 1
fintechnics.com, 1
finvantage.com, 1
fionamcbride.com, 1
fire-wolf.com, 1
@ -9178,7 +9178,7 @@ frogatto.com, 1
frogeye.fr, 1
froggitt.com, 1
frogsonamission.de, 1
froh.co.jp, 0
froh.co.jp, 1
frokenblomma.se, 1
frolov.net, 1
frolova.org, 1
@ -9305,6 +9305,7 @@ futuresonline.com, 1
futurezone.at, 1
futuristarchitecture.com, 1
futurope.com, 1
fuwafuwa.moe, 1
fuyu.moe, 1
fuzoku-sodan.com, 1
fuzzing-project.org, 1
@ -9474,6 +9475,7 @@ gaytorrent.ru, 1
gayxsite.com, 1
gazee.net, 1
gazellegames.net, 1
gbc-radio.nl, 1
gbcsummercamps.com, 1
gbl.selfip.net, 1
gc-mc.de, 1
@ -9536,6 +9538,7 @@ geekzone.fr, 1
geertdegraaf.nl, 1
geertswei.nl, 1
gegeco.ch, 1
geh.li, 1
gehaowu.com, 1
gehreslaw.com, 1
gehrke.nrw, 1
@ -9842,6 +9845,7 @@ globalnomadvintage.com, 1
globalonetechnology.com, 1
globalperspectivescanada.com, 1
globalprojetores.com.br, 1
globaltennis.ca, 1
globalventil.com, 1
globalvisions-events.ch, 1
globalvisions-events.com, 1
@ -10965,7 +10969,6 @@ holoxplor.space, 1
holydragoon.jp, 1
holyhiphopdatabase.com, 1
holymolycasinos.com, 1
holytransaction.com, 1
holywhite.com, 1
holz.nu, 1
holzheizer-forum.de, 1
@ -11366,7 +11369,7 @@ iclinic.ua, 1
icmhd.ch, 1
icmp2018.org, 1
icodeconnect.com, 1
icodesign.me, 0
icodesign.me, 1
iconomi.net, 1
icpc.pp.ua, 1
icpc2016.in.th, 1
@ -11413,7 +11416,6 @@ idexxpublicationportal.com, 1
idgard.de, 1
idhosts.co.id, 1
idid.tk, 1
idinby.dk, 1
idiopolis.org, 1
idiotentruppe.de, 1
idmanagement.gov, 1
@ -11553,6 +11555,7 @@ imaginary.ca, 1
imaginarymakings.me, 1
imagine-programming.com, 1
imagr.io, 1
imanageproducts.uk, 1
imanhearts.com, 1
imanudin.net, 1
imawhale.com, 1
@ -11740,6 +11743,7 @@ initramfs.io, 1
initrd.net, 1
injust.eu.org, 1
ink.horse, 1
inkable.com.au, 1
inkbunny.net, 0
inkhor.se, 1
inkontriamoci.com, 1
@ -12057,6 +12061,7 @@ iskaron.de, 1
iskogen.nu, 1
islam.si, 1
islandhosting.com, 1
islandinthenet.com, 1
islandpumpandtank.com, 1
islandzero.net, 1
islazia.fr, 1
@ -12194,7 +12199,6 @@ ivanpolchenko.com, 1
ivaoru.org, 1
ivfausland.de, 1
ivfmeds.com, 1
ivi-co.com, 1
ivi-fertilite.fr, 1
ivi-fruchtbarkeit.de, 1
ivi.com.ar, 1
@ -12286,6 +12290,7 @@ jahner.xyz, 1
jahofmann.de, 1
jailbreakingisnotacrime.org, 1
jaimechanaga.com, 1
jaion.ml, 1
jaispirit.com, 1
jaitnetworking.com, 0
jakarta.dating, 1
@ -12400,7 +12405,6 @@ jayfreestone.com, 1
jayharris.ca, 1
jaymecd.rocks, 1
jayna.design, 1
jayxon.com, 1
jayxu.com, 1
jazz-alliance.com, 1
jazz-alliance.org, 1
@ -12570,7 +12574,6 @@ jlhmedia.com, 1
jlkhosting.com, 1
jlr-luxembourg.com, 1
jm-bea.net, 1
jm06.com, 1
jmarciniak.it, 1
jmb.lc, 1
jmbelloteau.com, 1
@ -12591,6 +12594,7 @@ jnjdj.com, 1
jnm-art.com, 1
joa-ebert.com, 1
joaosampaio.com.br, 1
job-offer.de, 1
jobbkk.com, 1
joblife.co.za, 1
jobmedic.com, 1
@ -12902,6 +12906,7 @@ kabat-fans.cz, 1
kabeuchi.com, 1
kaboom.pw, 1
kabu-abc.com, 1
kabus.org, 1
kachlikova2.cz, 1
kack.website, 1
kadmec.com, 1
@ -13310,7 +13315,6 @@ kinozal-tv.appspot.com, 1
kinsights.com, 0
kinsmenhomelottery.com, 1
kintawifi.com, 0
kintoandar.com, 1
kintone.com, 1
kintore.tv, 1
kintzingerfilm.de, 1
@ -13364,7 +13368,6 @@ kiwipayments.com, 1
kiwiplace.com, 1
kj1391.com, 1
kj1396.net, 1
kj1397.com, 1
kjaer.io, 1
kjarni.cc, 1
kjarrval.is, 1
@ -13852,7 +13855,6 @@ lampenwelt.ch, 1
lan2k.org, 1
lanbroa.eu, 1
lanbyte.se, 1
lancehoteis.com, 1
lancejames.com, 1
lancelafontaine.com, 1
lanceyip.com, 1
@ -13880,6 +13882,7 @@ lantian.pub, 1
lanuovariviera.it, 1
lanyang.tk, 1
lanzamientovirtual.es, 1
lanzarote-online.info, 1
laos.dating, 1
laospage.com, 1
laozhu.me, 1
@ -14002,7 +14005,6 @@ lbgconsultores.com, 1
lbihrhelpdesk.com, 1
lbs-logics.com, 1
lca-pv.de, 1
lcht.ch, 1
lcti.biz, 1
ld-begunjscica.si, 1
ldc.com.br, 0
@ -14615,7 +14617,6 @@ logostock.jp, 1
logue.be, 1
lohanaflores.com.br, 1
loichot.ch, 1
loisircreatif.net, 1
lojadamimo.com.br, 1
lojadanidrea.com.br, 1
lojadewhisky.com.br, 1
@ -14932,7 +14933,7 @@ maces-net.de, 1
mach-politik.ch, 1
macha.cloud, 1
machbach.com, 1
machikka.com, 1
machikka.com, 0
machon.biz, 0
macht-elektro.de, 1
machtweb.de, 1
@ -14999,6 +15000,7 @@ magenda.sk, 1
magentaize.net, 1
magi.systems, 1
magicball.co, 1
magicbroccoli.de, 0
magiclen.org, 1
magicspaceninjapirates.de, 0
magictable.com, 1
@ -15259,7 +15261,6 @@ markow.io, 1
markprof.ru, 1
markrego.com, 1
markri.nl, 0
markrobin.de, 1
marksouthall.com, 1
markspres.org, 1
markt-heiligenstadt.de, 0
@ -15411,6 +15412,7 @@ mattli.us, 1
mattmccutchen.net, 1
mattonline.me, 1
mattwb65.com, 1
mattwservices.co.uk, 1
matviet.vn, 1
matze.co, 1
matze.org, 1
@ -15538,7 +15540,6 @@ mdcloudps.com, 1
mdek.at, 1
mdewendt.de, 1
mdf-bis.com, 1
mdkr.nl, 1
mdma.net, 1
mdmed.clinic, 1
mdosch.de, 1
@ -15797,6 +15798,7 @@ mflodin.se, 1
mfrsgb45.org, 1
mft.global, 1
mghiorzi.com.ar, 0
mgknet.com, 1
mgoessel.de, 1
mgrossklaus.de, 1
mgrt.net, 1
@ -15895,6 +15897,7 @@ mikedugan.org, 1
mikegarnett.co.uk, 1
mikegerwitz.com, 1
mikehamburg.com, 1
mikek.work, 1
mikes.tk, 1
miketabor.com, 1
miketheuer.com, 1
@ -15970,7 +15973,6 @@ minenash.com, 1
minepay.net, 1
minepic.org, 1
minepod.fr, 1
minesouls.fr, 1
minez-nightswatch.com, 0
minf3-games.de, 1
mingo.nl, 1
@ -15978,6 +15980,7 @@ mingram.net, 1
mingwah.ch, 1
mingy.ddns.net, 1
minhanossasenhora.com.br, 1
mini2.fi, 1
minigolf-reisinger.com, 1
minikidz.es, 1
minikneet.com, 1
@ -16478,6 +16481,7 @@ mts-server.com, 1
mtsolar.es, 1
muabannhanh.com, 0
mubiflex.nl, 1
muchohentai.com, 1
muckingabout.eu, 1
muehlemann.net, 1
muellapp.com, 1
@ -17394,6 +17398,7 @@ nikksno.io, 1
niklasbabel.com, 1
nikobradshaw.com, 1
nikolaichik.photo, 1
nikolasbradshaw.com, 1
nikolasgrottendieck.com, 1
nikomo.fi, 0
nikz.in, 1
@ -17849,6 +17854,7 @@ oftamedic.com, 1
oftn.org, 1
oge.ch, 1
ogis.gov, 1
ogkw.de, 1
oglen.ca, 1
ogocare.com, 1
oguya.ch, 1
@ -18373,9 +18379,7 @@ panascais.com, 1
panascais.de, 1
panascais.eu, 1
panascais.host, 1
panascais.io, 1
panascais.me, 1
panascais.net, 1
panascais.pw, 1
panascais.site, 1
panascais.tech, 1
@ -18559,6 +18563,7 @@ pauladamsmith.com, 1
paulbakaus.com, 1
paulbdelaat.nl, 1
paulbramhall.uk, 1
paulchen.at, 1
pauldcox.com, 1
paulerhof.com, 1
paulewen.ca, 1
@ -19149,6 +19154,7 @@ playkh.com, 1
playmaza.live, 1
playmfe.com, 1
playpirates.com, 1
playsharp.com, 1
playsnake.org, 1
playsoundevents.be, 1
playsource.co, 1
@ -19570,6 +19576,8 @@ prodsim.ninja, 1
productbarcodes.com, 1
productdesignsoftware.com.au, 1
productgap.com, 1
productived.net, 1
productpeo.pl, 1
proefteksten.nl, 0
prof.ch, 1
profection.biz, 1
@ -19754,7 +19762,6 @@ public-g.de, 1
public-projects.com, 1
public-projects.de, 1
public-vocals.de, 1
publications.qld.gov.au, 0
publiccarauctionscalifornia.com, 1
publicintegrity.org, 1
publicintelligence.net, 1
@ -19979,7 +19986,6 @@ r-core.org, 1
r-cut.fr, 1
r-rwebdesign.com, 1
r0t.co, 1
r0uzic.net, 1
r2d2pc.com, 1
r3nt3r.com, 1
r3s1stanc3.me, 1
@ -20325,7 +20331,6 @@ regionale.org, 1
regiosalland.nl, 1
regiovertrieb.de, 0
register.gov.uk, 1
registertovoteflorida.gov, 1
registrar.io, 1
regmyr.se, 1
regnix.net, 1
@ -20837,7 +20842,6 @@ rothkranz.net, 1
rothnater.ch, 1
rotol.me, 1
rotozen.com, 1
rotter-dam.nl, 1
rotterdamjazz.info, 1
rottweil-hilft.de, 1
rotunneling.net, 1
@ -21333,7 +21337,6 @@ sbit.com.br, 1
sblum.de, 1
sbm.cloud, 1
sbo-dresden.de, 1
sbobetfun.com, 1
sbr.red, 1
sbsavings.bank, 1
sbssoft.ru, 1
@ -21359,6 +21362,7 @@ schaper-sport.com, 1
schatmeester.be, 1
schatzibaers.de, 1
schau-rein.co.at, 1
schawe.me, 1
schd.io, 1
scheduleme.io, 1
scheemadigital.com, 1
@ -21589,6 +21593,7 @@ seconfig.sytes.net, 1
secpatrol.de, 1
secretar.is, 1
secretofanah.com, 1
secretpanties.com, 1
secretsanta.fr, 1
secretserveronline.com, 1
secretum.tech, 1
@ -21762,6 +21767,7 @@ seosof.com, 1
seoul.dating, 1
seouniversity.org, 1
sep23.ru, 1
sepalandseed.com, 1
sephr.com, 1
sepie.gob.es, 1
seppelec.com, 1
@ -22463,6 +22469,7 @@ slrd-isperih.com, 1
slse.ca, 1
sluitkampzeist.nl, 0
sluplift.com, 1
slvh.fr, 1
slwilde.ca, 1
slxh.eu, 1
slxh.nl, 1
@ -22508,6 +22515,7 @@ smartpolicingplatform.com, 1
smartrade.tech, 1
smartshiftme.com, 1
smartship.co.jp, 1
smartshoppers.es, 1
smartsparrow.com, 1
smartvideo.io, 1
smartviewing.com, 1
@ -22981,6 +22989,7 @@ squido.ch, 1
squidparty.com, 1
squids.space, 1
squirtlesbians.net, 1
sqzryang.com, 1
sr-cs.net, 1
srandom.com, 1
srbija-nekretnine.org, 1
@ -23225,7 +23234,6 @@ stichtingliab.nl, 1
stichtingscholierenvervoerzeeland.nl, 1
stichtingsticky.nl, 1
stick2bike.de, 1
stickies.io, 1
stickswag.cf, 1
stift-kremsmuenster.at, 1
stig.io, 1
@ -23453,11 +23461,12 @@ sundaycooks.com, 1
sundayfundayjapan.com, 1
suneilpatel.com, 1
sunfireshop.com.br, 1
sunflyer.cn, 0
sunfox.cz, 1
sunfulong.me, 1
sungo.wtf, 1
sunjaydhama.com, 1
sunn.ie, 1
sunsetwx.com, 1
sunshinesf.org, 1
sunsmartresorts.com, 1
sunstar.bg, 1
@ -23597,7 +23606,6 @@ swissid.ch, 1
swisslinux.org, 1
swisswebhelp.ch, 1
swissxperts.ch, 1
swite.com, 1
swordfeng.xyz, 1
swuosa.org, 1
swvaux.com, 1
@ -24039,7 +24047,7 @@ tenberg.com, 1
tenbos.ch, 1
tendermaster.com.ua, 1
tenderstem.co.uk, 1
tendoryu-aikido.org, 0
tendoryu-aikido.org, 1
tenenz.com, 1
tengu.cloud, 1
tenispopular.com, 1
@ -24333,6 +24341,7 @@ theploughharborne.co.uk, 1
theposhfudgecompany.co.uk, 1
thepostoffice.ro, 1
theprincegame.com, 1
theprivacysolution.com, 1
thepromisemusic.com, 1
thequillmagazine.org, 1
theragran.co.id, 1
@ -24622,6 +24631,7 @@ tjl.rocks, 1
tjp.ch, 1
tjs.me, 1
tkacz.pro, 1
tkarstens.de, 0
tkat.ch, 1
tkgpm.com, 1
tkjg.fi, 1
@ -25719,7 +25729,6 @@ vacuumreviewcenter.com, 1
vadennissanofhiltonheadparts.com, 1
vadennissanofhinesvilleparts.com, 1
vadik.me, 1
vadodesign.nl, 1
vaeplatform.com, 1
vaew.com, 1
vagabond.fr, 1
@ -26140,6 +26149,7 @@ vm-0.com, 1
vm-co.ch, 1
vmc.co.id, 1
vmem.jp, 1
vmgirls.com, 1
vmis.nl, 1
vmoagents.com, 0
vmug.pl, 1
@ -26336,6 +26346,7 @@ wangql.net, 1
wangqr.tk, 1
wangyue.blog, 1
wantshow.com.br, 1
wanybug.cn, 1
wapking.live, 1
wardow.com, 1
warekon.com, 1
@ -26377,7 +26388,6 @@ waterfedpole.com, 1
watermonitor.gov, 1
watertrails.io, 1
watsonwork.me, 1
wattechweb.com, 1
wave-ola.es, 1
wavesboardshop.com, 1
wavesoftime.com, 1
@ -26387,6 +26397,7 @@ waylaydesign.com, 1
wayne.cloud, 0
wayohoo.com, 1
wayohoo.net, 1
waytt.cf, 1
waze.com, 1
wbci.us, 1
wbg-vs.de, 1
@ -26795,7 +26806,6 @@ wilane.org, 1
wild-emotion-events.de, 1
wildboaratvparts.com, 1
wildcard.hu, 1
wilddog.com, 1
wilddogdesign.co.uk, 1
wildewood.ca, 1
wildnisfamilie.net, 1
@ -27124,6 +27134,7 @@ www-8887999.com, 0
www.aclu.org, 0
www.airbnb.com, 1
www.amazon.ca, 1
www.amazon.cn, 1
www.amazon.co.jp, 1
www.amazon.co.uk, 1
www.amazon.com, 1
@ -27275,6 +27286,7 @@ xichuangke.com, 0
xicreative.net, 1
xight.org, 1
xilef.org, 1
xiliant.com, 1
xilkoi.net, 1
ximage.me, 0
ximbo.net, 1
@ -27661,7 +27673,6 @@ yourself.today, 1
yourticketbooking.com, 1
youruseragent.info, 1
yourznc.com, 1
youss.cc, 0
yout.com, 1
youtous.me, 1
youtubedownloader.com, 1
@ -27675,6 +27686,7 @@ ypid.de, 1
yplanapp.com, 1
yr166166.com, 1
yryz.net, 1
ys-shop.biz, 1
ysicorp.com, 1
yslbeauty.com, 1
ytec.ca, 1
@ -27685,6 +27697,7 @@ ytreza.fr, 1
ytuquelees.net, 1
yu.gg, 0
yu.vc, 1
yuan.ga, 1
yuanben.io, 1
yuanbenlian.com, 1
yubi.co, 1
@ -27734,6 +27747,8 @@ yukonlip.com, 1
yukontec.com, 1
yum.beer, 1
yumeconcert.com, 1
yuna.love, 1
yuna.tg, 1
yunity.org, 1
yunjishou.pro, 1
yuricarlenzoli.it, 1
@ -27875,7 +27890,6 @@ zfree.co.nz, 1
zgrep.org, 1
zhang-hao.com, 1
zhangfangzhou.com, 1
zhangge.net, 1
zhanghao.me, 1
zhangsidan.com, 1
zhangsir.net, 1
@ -27940,7 +27954,6 @@ zojadravai.com, 1
zoki.art, 1
zokster.net, 1
zolokar.xyz, 1
zolotoy-standart.com.ua, 1
zombiesecured.com, 1
zomerschoen.nl, 1
zone39.com, 1
@ -27967,6 +27980,7 @@ zor.com, 1
zorgclustertool.nl, 1
zorium.org, 1
zorntt.fr, 1
zorz.info, 1
zotero.org, 1
zouk.info, 1
zqwqz.com, 1
@ -28021,13 +28035,13 @@ zxity.co.uk, 1
zxity.ltd, 1
zxity.uk, 1
zxtcode.com, 1
zybbo.com, 1
zymmm.com, 1
zypern-firma.com, 1
zypr.pw, 1
zyria.de, 1
zyul.ddns.net, 1
zyx.im, 0
zyzardx.com, 1
zzb510.com, 1
zzb6688.com, 1
zzsec.org, 1

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

@ -834,6 +834,11 @@ xNextSystemCall(sqlite3_vfs *vfs, const char *zName)
namespace mozilla {
namespace storage {
const char *GetVFSName()
{
return "telemetry-vfs";
}
sqlite3_vfs* ConstructTelemetryVFS()
{
#if defined(XP_WIN)
@ -867,7 +872,7 @@ sqlite3_vfs* ConstructTelemetryVFS()
MOZ_ASSERT(vfs->iVersion <= LAST_KNOWN_VFS_VERSION);
tvfs->szOsFile = sizeof(telemetry_file) - sizeof(sqlite3_file) + vfs->szOsFile;
tvfs->mxPathname = vfs->mxPathname;
tvfs->zName = "telemetry-vfs";
tvfs->zName = GetVFSName();
tvfs->pAppData = vfs;
tvfs->xOpen = xOpen;
tvfs->xDelete = xDelete;

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

@ -73,6 +73,8 @@ namespace storage {
using mozilla::dom::quota::QuotaObject;
const char *GetVFSName();
namespace {
int
@ -627,7 +629,7 @@ Connection::initialize()
AUTO_PROFILER_LABEL("Connection::initialize", STORAGE);
// in memory database requested, sqlite uses a magic file name
int srv = ::sqlite3_open_v2(":memory:", &mDBConn, mFlags, nullptr);
int srv = ::sqlite3_open_v2(":memory:", &mDBConn, mFlags, GetVFSName());
if (srv != SQLITE_OK) {
mDBConn = nullptr;
return convertResultCode(srv);
@ -660,7 +662,7 @@ Connection::initialize(nsIFile *aDatabaseFile)
#else
static const char* sIgnoreLockingVFS = "unix-none";
#endif
const char* vfs = mIgnoreLockingMode ? sIgnoreLockingVFS : nullptr;
const char* vfs = mIgnoreLockingMode ? sIgnoreLockingVFS : GetVFSName();
int srv = ::sqlite3_open_v2(NS_ConvertUTF16toUTF8(path).get(), &mDBConn,
mFlags, vfs);
@ -694,7 +696,7 @@ Connection::initialize(nsIFileURL *aFileURL)
rv = aFileURL->GetSpec(spec);
NS_ENSURE_SUCCESS(rv, rv);
int srv = ::sqlite3_open_v2(spec.get(), &mDBConn, mFlags, nullptr);
int srv = ::sqlite3_open_v2(spec.get(), &mDBConn, mFlags, GetVFSName());
if (srv != SQLITE_OK) {
mDBConn = nullptr;
return convertResultCode(srv);

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

@ -24,6 +24,7 @@
#include "mozIStoragePendingStatement.h"
#include "sqlite3.h"
#include "mozilla/AutoSQLiteLifetime.h"
#ifdef SQLITE_OS_WIN
// "windows.h" was included and it can #define lots of things we care about...
@ -32,13 +33,6 @@
#include "nsIPromptService.h"
#ifdef MOZ_STORAGE_MEMORY
# include "mozmemory.h"
# ifdef MOZ_DMD
# include "DMD.h"
# endif
#endif
////////////////////////////////////////////////////////////////////////////////
//// Defines
@ -282,12 +276,6 @@ Service::~Service()
if (rc != SQLITE_OK)
NS_WARNING("Failed to unregister sqlite vfs wrapper.");
// Shutdown the sqlite3 API. Warn if shutdown did not turn out okay, but
// there is nothing actionable we can do in that case.
rc = ::sqlite3_shutdown();
if (rc != SQLITE_OK)
NS_WARNING("sqlite3 did not shutdown cleanly.");
shutdown(); // To release sXPConnect.
gService = nullptr;
@ -400,121 +388,7 @@ Service::shutdown()
}
sqlite3_vfs *ConstructTelemetryVFS();
#ifdef MOZ_STORAGE_MEMORY
namespace {
// By default, SQLite tracks the size of all its heap blocks by adding an extra
// 8 bytes at the start of the block to hold the size. Unfortunately, this
// causes a lot of 2^N-sized allocations to be rounded up by jemalloc
// allocator, wasting memory. For example, a request for 1024 bytes has 8
// bytes added, becoming a request for 1032 bytes, and jemalloc rounds this up
// to 2048 bytes, wasting 1012 bytes. (See bug 676189 for more details.)
//
// So we register jemalloc as the malloc implementation, which avoids this
// 8-byte overhead, and thus a lot of waste. This requires us to provide a
// function, sqliteMemRoundup(), which computes the actual size that will be
// allocated for a given request. SQLite uses this function before all
// allocations, and may be able to use any excess bytes caused by the rounding.
//
// Note: the wrappers for malloc, realloc and moz_malloc_usable_size are
// necessary because the sqlite_mem_methods type signatures differ slightly
// from the standard ones -- they use int instead of size_t. But we don't need
// a wrapper for free.
#ifdef MOZ_DMD
// sqlite does its own memory accounting, and we use its numbers in our memory
// reporters. But we don't want sqlite's heap blocks to show up in DMD's
// output as unreported, so we mark them as reported when they're allocated and
// mark them as unreported when they are freed.
//
// In other words, we are marking all sqlite heap blocks as reported even
// though we're not reporting them ourselves. Instead we're trusting that
// sqlite is fully and correctly accounting for all of its heap blocks via its
// own memory accounting. Well, we don't have to trust it entirely, because
// it's easy to keep track (while doing this DMD-specific marking) of exactly
// how much memory SQLite is using. And we can compare that against what
// SQLite reports it is using.
MOZ_DEFINE_MALLOC_SIZE_OF_ON_ALLOC(SqliteMallocSizeOfOnAlloc)
MOZ_DEFINE_MALLOC_SIZE_OF_ON_FREE(SqliteMallocSizeOfOnFree)
#endif
static void *sqliteMemMalloc(int n)
{
void* p = ::malloc(n);
#ifdef MOZ_DMD
gSqliteMemoryUsed += SqliteMallocSizeOfOnAlloc(p);
#endif
return p;
}
static void sqliteMemFree(void *p)
{
#ifdef MOZ_DMD
gSqliteMemoryUsed -= SqliteMallocSizeOfOnFree(p);
#endif
::free(p);
}
static void *sqliteMemRealloc(void *p, int n)
{
#ifdef MOZ_DMD
gSqliteMemoryUsed -= SqliteMallocSizeOfOnFree(p);
void *pnew = ::realloc(p, n);
if (pnew) {
gSqliteMemoryUsed += SqliteMallocSizeOfOnAlloc(pnew);
} else {
// realloc failed; undo the SqliteMallocSizeOfOnFree from above
gSqliteMemoryUsed += SqliteMallocSizeOfOnAlloc(p);
}
return pnew;
#else
return ::realloc(p, n);
#endif
}
static int sqliteMemSize(void *p)
{
return ::moz_malloc_usable_size(p);
}
static int sqliteMemRoundup(int n)
{
n = malloc_good_size(n);
// jemalloc can return blocks of size 2 and 4, but SQLite requires that all
// allocations be 8-aligned. So we round up sub-8 requests to 8. This
// wastes a small amount of memory but is obviously safe.
return n <= 8 ? 8 : n;
}
static int sqliteMemInit(void *p)
{
return 0;
}
static void sqliteMemShutdown(void *p)
{
}
const sqlite3_mem_methods memMethods = {
&sqliteMemMalloc,
&sqliteMemFree,
&sqliteMemRealloc,
&sqliteMemSize,
&sqliteMemRoundup,
&sqliteMemInit,
&sqliteMemShutdown,
nullptr
};
} // namespace
#endif // MOZ_STORAGE_MEMORY
const char *GetVFSName();
static const char* sObserverTopics[] = {
"memory-pressure",
@ -527,28 +401,13 @@ Service::initialize()
{
MOZ_ASSERT(NS_IsMainThread(), "Must be initialized on the main thread");
int rc;
#ifdef MOZ_STORAGE_MEMORY
rc = ::sqlite3_config(SQLITE_CONFIG_MALLOC, &memMethods);
if (rc != SQLITE_OK)
return convertResultCode(rc);
#endif
// TODO (bug 1191405): do not preallocate the connections caches until we
// have figured the impact on our consumers and memory.
sqlite3_config(SQLITE_CONFIG_PAGECACHE, NULL, 0, 0);
// Explicitly initialize sqlite3. Although this is implicitly called by
// various sqlite3 functions (and the sqlite3_open calls in our case),
// the documentation suggests calling this directly. So we do.
rc = ::sqlite3_initialize();
int rc = AutoSQLiteLifetime::getInitResult();
if (rc != SQLITE_OK)
return convertResultCode(rc);
mSqliteVFS = ConstructTelemetryVFS();
if (mSqliteVFS) {
rc = sqlite3_vfs_register(mSqliteVFS, 1);
rc = sqlite3_vfs_register(mSqliteVFS, 0);
if (rc != SQLITE_OK)
return convertResultCode(rc);
} else {

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше