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 target-tasks-method: nightly_file_update
run-on-projects: run-on-projects:
- mozilla-central - mozilla-central
when: when: [] # don't run for now due to unforeseen issues
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}

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

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

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

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

@ -55,6 +55,11 @@
/** Begin titlebar **/ /** Begin titlebar **/
#titlebar {
/* Centrally align content items vertically */
-moz-box-pack: center;
}
#titlebar-content { #titlebar-content {
/* Ensure the the content part of the titlebar does not shrink. */ /* Ensure the the content part of the titlebar does not shrink. */
min-height: inherit; min-height: inherit;
@ -69,6 +74,8 @@
#titlebar-secondary-buttonbox { #titlebar-secondary-buttonbox {
position: relative; position: relative;
z-index: 1; z-index: 1;
/* Centrally align indicators and full screen button vertically */
-moz-box-align: center;
} }
#titlebar-buttonbox-container { #titlebar-buttonbox-container {
@ -103,28 +110,6 @@
min-height: calc(var(--tab-min-height) + var(--space-above-tabbar) - var(--tab-toolbar-navbar-overlap)); 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 **/ /** End titlebar **/
#main-window[chromehidden~="toolbar"][chromehidden~="location"][chromehidden~="directories"] { #main-window[chromehidden~="toolbar"][chromehidden~="location"][chromehidden~="directories"] {

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

@ -15,6 +15,7 @@
"cxx": "/builds/worker/workspace/build/src/gcc/bin/g++", "cxx": "/builds/worker/workspace/build/src/gcc/bin/g++",
"as": "/builds/worker/workspace/build/src/gcc/bin/gcc", "as": "/builds/worker/workspace/build/src/gcc/bin/gcc",
"patches": [ "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 { :root.theme-dark .CodeMirror-scrollbar-filler {
background: transparent; 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,
:root .theme-light { :root .theme-light {
--search-overlays-semitransparent: rgba(221, 225, 228, 0.66); --search-overlays-semitransparent: rgba(221, 225, 228, 0.66);
@ -424,6 +496,17 @@ body {
box-sizing: border-box; box-sizing: border-box;
} }
button {
background: transparent;
outline: none;
border: none;
}
button:hover,
button:focus {
background-color: var(--theme-toolbar-background-hover);
}
.debugger { .debugger {
display: flex; display: flex;
flex: 1; flex: 1;
@ -793,6 +876,7 @@ menuseparator {
.file, .file,
.worker, .worker,
.refresh, .refresh,
.shortcut,
.add-button { .add-button {
fill: var(--theme-splitter-color); fill: var(--theme-splitter-color);
} }
@ -816,6 +900,7 @@ menuseparator {
.folder svg, .folder svg,
.worker svg, .worker svg,
.refresh svg, .refresh svg,
.shortcut svg,
.add-button svg { .add-button svg {
width: 15px; width: 15px;
} }
@ -828,6 +913,7 @@ menuseparator {
.domain svg, .domain svg,
.folder svg, .folder svg,
.refresh svg, .refresh svg,
.shortcut svg,
.worker svg { .worker svg {
margin-inline-end: 5px; margin-inline-end: 5px;
} }
@ -857,6 +943,17 @@ html .arrow.expanded svg {
.arrow.hidden { .arrow.hidden {
visibility: hidden; visibility: hidden;
} }
.webpack svg {
width: 15px;
height: 15px;
margin-right: 5px;
vertical-align: bottom;
}
.theme-dark .webpack {
opacity: 0.5;
}
.managed-tree .tree { .managed-tree .tree {
-webkit-user-select: none; -webkit-user-select: none;
-moz-user-select: none; -moz-user-select: none;
@ -1301,38 +1398,6 @@ html[dir="rtl"] .managed-tree .tree .node > div {
user-select: none; 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 { .sources-list {
flex: 1; flex: 1;
display: flex; display: flex;
@ -1347,6 +1412,14 @@ html[dir="rtl"] .managed-tree .tree .node > div {
overflow-y: auto; 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 { .theme-dark .sources-list .tree .node:not(.focused) svg {
fill: var(--theme-content-color3); fill: var(--theme-content-color3);
} }
@ -1355,6 +1428,15 @@ html[dir="rtl"] .managed-tree .tree .node > div {
background-color: var(--theme-tab-toolbar-background); 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 { .no-sources-message {
font-size: 12px; font-size: 12px;
color: var(--theme-comment-alt); color: var(--theme-comment-alt);
@ -1366,56 +1448,58 @@ html[dir="rtl"] .managed-tree .tree .node > div {
align-items: center; align-items: center;
} }
.sources-panel .source-footer {
position: relative;
}
.sources-panel .outline { .sources-panel .outline {
display: flex; display: flex;
flex: 1; flex: 1;
} }
.sources-panel .outline.hidden { .source-outline-tabs {
display: none;
}
.hidden {
display: none;
}
.source-footer {
width: 100%; 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; flex: 1;
justify-content: center; justify-content: center;
border: 1px solid transparent; border-bottom: 1px solid transparent;
border-bottom-left-radius: 2px; border-left: 1px solid transparent;
border-bottom-right-radius: 2px;
display: inline-flex; display: inline-flex;
position: relative; position: relative;
transition: all 0.25s ease; transition: all 0.25s ease;
overflow: hidden; overflow: hidden;
padding: 5px; padding: 6.5px;
margin-bottom: 0px; margin-bottom: 0px;
margin-top: -1px; margin-top: -1px;
cursor: default; 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); background-color: var(--theme-toolbar-background-alt);
border-color: var(--theme-splitter-color); border-color: var(--theme-splitter-color);
} }
.source-footer .tab.active { .source-outline-tabs .tab {
color: var(--theme-body-color); color: var(--theme-body-color);
background-color: var(--theme-toolbar-background); background-color: var(--theme-toolbar-background);
border-color: var(--theme-splitter-color); border-color: var(--theme-splitter-color);
} }
.source-footer .tab.active path, .source-outline-tabs .tab.active {
.source-footer .tab:hover path { 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); fill: var(--theme-body-color);
} }
.outline { .outline {
@ -1504,14 +1588,14 @@ html[dir="rtl"] .managed-tree .tree .node > div {
} }
.toggle-button-start, .toggle-button-start,
.toggle-button-end { .toggle-button-end {
transform: translate(0, 2px); transform: translate(0, 0px);
transition: transform 0.25s ease-in-out; transition: transform 0.25s ease-in-out;
padding: 5px 2px; padding: 5px 5px;
} }
.toggle-button-start.vertical, .toggle-button-start.vertical,
.toggle-button-end.vertical { .toggle-button-end.vertical {
padding: 4px 2px; padding: 2.5px 2.5px;
} }
.toggle-button-start svg, .toggle-button-start svg,
@ -1526,12 +1610,12 @@ html[dir="rtl"] .managed-tree .tree .node > div {
} }
.toggle-button-end { .toggle-button-end {
margin-inline-end: 5px; margin-inline-end: 0px;
margin-inline-start: auto; margin-inline-start: auto;
} }
.toggle-button-start { .toggle-button-start {
margin-inline-start: 5px; margin-inline-start: 0px;
} }
html:not([dir="rtl"]) .toggle-button-end svg, 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); --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-line,
.paused .CodeMirror-linenumber { .paused .CodeMirror-linenumber {
opacity: 0.7; opacity: 0.7;
@ -2262,7 +2341,7 @@ html[dir="rtl"] .arrow svg,
position: absolute; position: absolute;
height: calc(100% - 31px); height: calc(100% - 31px);
width: calc(100% - 1.5px); width: calc(100% - 1.5px);
top: 30px; top: 29px;
left: 0px; left: 0px;
--editor-footer-height: 24px; --editor-footer-height: 24px;
} }
@ -2457,7 +2536,6 @@ html[dir="rtl"] .editor-mount {
} }
.breakpoints-list * { .breakpoints-list * {
-moz-user-select: none;
user-select: none; user-select: none;
} }
@ -2621,8 +2699,8 @@ html .breakpoints-list .breakpoint.paused {
position: relative; position: relative;
} }
.expression-container .close-btn { .expression-content .tree-node {
display: none; overflow-x: hidden;
} }
.expression-container:hover .close-btn { .expression-container:hover .close-btn {
@ -2679,8 +2757,9 @@ html .breakpoints-list .breakpoint.paused {
.why-paused .message.warning { .why-paused .message.warning {
font-size: 10px; font-size: 10px;
color: var(--theme-graphs-full-red); color: var(--theme-graphs-red);
font-weight: bold; font-weight: bold;
font-style: normal;
} }
.frames ul { .frames ul {
list-style: none; list-style: none;
@ -2819,7 +2898,18 @@ html .breakpoints-list .breakpoint.paused {
.event-listeners .listener:hover .close { .event-listeners .listener:hover .close {
display: block; 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 { :root {
--accordion-header-background: var(--theme-toolbar-background); --accordion-header-background: var(--theme-toolbar-background);
} }
@ -2900,10 +2990,8 @@ html .breakpoints-list .breakpoint.paused {
flex: 0 0 29px; flex: 0 0 29px;
border-bottom: 1px solid var(--theme-splitter-color); border-bottom: 1px solid var(--theme-splitter-color);
display: flex; display: flex;
height: 29px;
overflow: hidden; overflow: hidden;
position: sticky; position: sticky;
top: 0;
z-index: 1; z-index: 1;
background-color: var(--theme-toolbar-background); background-color: var(--theme-toolbar-background);
} }
@ -2980,6 +3068,17 @@ html .command-bar > button:disabled {
.command-bar button.pause-exceptions.all { .command-bar button.pause-exceptions.all {
color: var(--theme-highlight-blue); 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 { .object-node.default-property {
opacity: 0.6; opacity: 0.6;
} }
@ -3062,7 +3161,7 @@ html .command-bar > button:disabled {
color: var(--theme-comment-alt); color: var(--theme-comment-alt);
background-color: var(--theme-toolbar-background); background-color: var(--theme-toolbar-background);
font-weight: lighter; font-weight: lighter;
z-index: 100; z-index: 10;
user-select: none; user-select: none;
} }
@ -3281,45 +3380,6 @@ html[dir="rtl"] .dropdown {
left: 0; left: 0;
top: 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 { .symbol-modal-wrapper {
position: fixed; position: fixed;
width: 100%; width: 100%;

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

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

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

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

@ -28903,6 +28903,10 @@ var _getSymbols2 = _interopRequireDefault(_getSymbols);
var _ast = __webpack_require__(1051); var _ast = __webpack_require__(1051);
var _getScopes = __webpack_require__(1186);
var _getScopes2 = _interopRequireDefault(_getScopes);
var _sources = __webpack_require__(1171); var _sources = __webpack_require__(1171);
var _getOutOfScopeLocations = __webpack_require__(1072); var _getOutOfScopeLocations = __webpack_require__(1072);
@ -28926,7 +28930,9 @@ self.onmessage = workerHandler({
getClosestExpression: _closest.getClosestExpression, getClosestExpression: _closest.getClosestExpression,
getOutOfScopeLocations: _getOutOfScopeLocations2.default, getOutOfScopeLocations: _getOutOfScopeLocations2.default,
getSymbols: _getSymbols2.default, getSymbols: _getSymbols2.default,
getScopes: _getScopes2.default,
clearSymbols: _getSymbols.clearSymbols, clearSymbols: _getSymbols.clearSymbols,
clearScopes: _getScopes.clearScopes,
clearASTs: _ast.clearASTs, clearASTs: _ast.clearASTs,
hasSource: _sources.hasSource, hasSource: _sources.hasSource,
setSource: _sources.setSource, 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) { function extractSymbols(source) {
var functions = []; var functions = [];
var variables = []; var variables = [];
@ -29414,6 +29429,7 @@ function extractSymbols(source) {
if ((0, _helpers.isFunction)(path)) { if ((0, _helpers.isFunction)(path)) {
functions.push({ functions.push({
name: (0, _getFunctionName2.default)(path), name: (0, _getFunctionName2.default)(path),
klass: getClassName(path),
location: path.node.loc, location: path.node.loc,
parameterNames: getFunctionParameterNames(path), parameterNames: getFunctionParameterNames(path),
identifier: path.node.id identifier: path.node.id
@ -29671,12 +29687,7 @@ function getSnippet(path, prevPath) {
} }
function formatSymbols(source) { function formatSymbols(source) {
var _getSymbols = getSymbols(source), var symbols = getSymbols(source);
objectProperties = _getSymbols.objectProperties,
memberExpressions = _getSymbols.memberExpressions,
callExpressions = _getSymbols.callExpressions,
identifiers = _getSymbols.identifiers,
variables = _getSymbols.variables;
function formatLocation(loc) { function formatLocation(loc) {
if (!loc) { if (!loc) {
@ -29696,10 +29707,11 @@ function formatSymbols(source) {
var exprLoc = formatLocation(symbol.expressionLocation); var exprLoc = formatLocation(symbol.expressionLocation);
var params = symbol.parameterNames ? symbol.parameterNames.join(", ") : ""; var params = symbol.parameterNames ? symbol.parameterNames.join(", ") : "";
var expression = symbol.expression || ""; 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() { function clearSymbols() {
@ -33056,6 +33068,301 @@ function clearSources() {
cachedSources = new Map(); 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: /***/ 1173:
/***/ (function(module, exports, __webpack_require__) { /***/ (function(module, exports, __webpack_require__) {
@ -907,7 +988,7 @@ function shouldPrettyPrint(source) {
} }
var _isPretty = isPretty(source); var _isPretty = isPretty(source);
var _isJavaScript = isJavaScript(source.url); var _isJavaScript = isJavaScript(source);
var isOriginal = (0, _devtoolsSourceMap.isOriginalId)(source.id); var isOriginal = (0, _devtoolsSourceMap.isOriginalId)(source.id);
var hasSourceMap = source.sourceMapURL; var hasSourceMap = source.sourceMapURL;
@ -928,10 +1009,8 @@ function shouldPrettyPrint(source) {
* @memberof utils/source * @memberof utils/source
* @static * @static
*/ */
function isJavaScript(url) { function isJavaScript(source) {
var contentType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; return source.url && /\.(jsm|js)?$/.test(trimUrlQuery(source.url)) || !!(source.contentType && source.contentType.includes("javascript"));
return url && /\.(jsm|js)?$/.test(trimUrlQuery(url)) || contentType.includes("javascript");
} }
/** /**
@ -2608,7 +2687,7 @@ const {
generatedToOriginalId, generatedToOriginalId,
isGeneratedId, isGeneratedId,
isOriginalId isOriginalId
} = __webpack_require__(899); } = __webpack_require__(1172);
const { workerUtils: { WorkerDispatcher } } = __webpack_require__(1165); const { workerUtils: { WorkerDispatcher } } = __webpack_require__(1165);
@ -2617,6 +2696,7 @@ const dispatcher = new WorkerDispatcher();
const getOriginalURLs = dispatcher.task("getOriginalURLs"); const getOriginalURLs = dispatcher.task("getOriginalURLs");
const getGeneratedLocation = dispatcher.task("getGeneratedLocation"); const getGeneratedLocation = dispatcher.task("getGeneratedLocation");
const getOriginalLocation = dispatcher.task("getOriginalLocation"); const getOriginalLocation = dispatcher.task("getOriginalLocation");
const getLocationScopes = dispatcher.task("getLocationScopes");
const getOriginalSourceText = dispatcher.task("getOriginalSourceText"); const getOriginalSourceText = dispatcher.task("getOriginalSourceText");
const applySourceMap = dispatcher.task("applySourceMap"); const applySourceMap = dispatcher.task("applySourceMap");
const clearSourceMaps = dispatcher.task("clearSourceMaps"); const clearSourceMaps = dispatcher.task("clearSourceMaps");
@ -2631,6 +2711,7 @@ module.exports = {
getOriginalURLs, getOriginalURLs,
getGeneratedLocation, getGeneratedLocation,
getOriginalLocation, getOriginalLocation,
getLocationScopes,
getOriginalSourceText, getOriginalSourceText,
applySourceMap, applySourceMap,
clearSourceMaps, 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: /***/ 9:
/***/ (function(module, exports, __webpack_require__) { /***/ (function(module, exports, __webpack_require__) {

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

@ -11,6 +11,11 @@ support-files =
examples/sourcemaps2/main.min.js examples/sourcemaps2/main.min.js
examples/sourcemaps2/main.js examples/sourcemaps2/main.js
examples/sourcemaps2/main.js.map 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-async.html
examples/doc-asm.html examples/doc-asm.html
examples/doc-scripts.html examples/doc-scripts.html
@ -26,6 +31,7 @@ support-files =
examples/doc-sourcemap-bogus.html examples/doc-sourcemap-bogus.html
examples/doc-sources.html examples/doc-sources.html
examples/doc-return-values.html examples/doc-return-values.html
examples/doc-wasm-sourcemaps.html
examples/asm.js examples/asm.js
examples/async.js examples/async.js
examples/bogus-map.js examples/bogus-map.js
@ -44,6 +50,7 @@ support-files =
examples/script-switching-01.js examples/script-switching-01.js
examples/times2.js examples/times2.js
[browser_dbg-asm.js]
[browser_dbg-async-stepping.js] [browser_dbg-async-stepping.js]
[browser_dbg-breaking.js] [browser_dbg-breaking.js]
[browser_dbg-breaking-from-console.js] [browser_dbg-breaking-from-console.js]
@ -54,6 +61,7 @@ skip-if = true # Bug 1383576
[browser_dbg-breakpoints-cond.js] [browser_dbg-breakpoints-cond.js]
[browser_dbg-call-stack.js] [browser_dbg-call-stack.js]
[browser_dbg-expressions.js] [browser_dbg-expressions.js]
[browser_dbg-expressions-error.js]
[browser_dbg-scopes.js] [browser_dbg-scopes.js]
[browser_dbg-chrome-create.js] [browser_dbg-chrome-create.js]
[browser_dbg-chrome-debugging.js] [browser_dbg-chrome-debugging.js]
@ -89,3 +97,5 @@ skip-if = true # Bug 1393121, 1393299
[browser_dbg-sources.js] [browser_dbg-sources.js]
[browser_dbg-tabs.js] [browser_dbg-tabs.js]
[browser_dbg-toggling-tools.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. add_task(async function() {
* http://creativecommons.org/publicdomain/zero/1.0/ */ 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 // After reload() we are getting getSources notifiction for old sources,
// is working. // using the debugger statement to really stop are reloaded page.
await waitForPaused(dbg);
await resume(dbg);
const { await waitForSources(dbg, "doc-asm.html", "asm.js");
setupTestRunner,
asm
} = require("devtools/client/debugger/new/integration-tests");
add_task(function*() { // Expand nodes and make sure more sources appear.
setupTestRunner(this); is(findAllElements(dbg, "sourceNodes").length, 2);
yield asm(this);
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"); const dbg = await initDebugger("doc-scripts.html");
await selectSource(dbg, "simple2"); await selectSource(dbg, "simple2");
// Adding a conditional Breakpoint dump('Adding a conditional Breakpoint\n')
await setConditionalBreakpoint(dbg, 5, "1"); await setConditionalBreakpoint(dbg, 5, "1");
await waitForDispatch(dbg, "ADD_BREAKPOINT"); await waitForDispatch(dbg, "ADD_BREAKPOINT");
let bp = findBreakpoint(dbg, "simple2", 5); let bp = findBreakpoint(dbg, "simple2", 5);
is(bp.condition, "1", "breakpoint is created with the condition"); is(bp.condition, "1", "breakpoint is created with the condition");
assertEditorBreakpoint(dbg, 5, true); assertEditorBreakpoint(dbg, 5, true);
// Editing a conditional Breakpoint dump('Editing a conditional breakpoint\n')
await setConditionalBreakpoint(dbg, 5, "2"); await setConditionalBreakpoint(dbg, 5, "2");
await waitForDispatch(dbg, "SET_BREAKPOINT_CONDITION"); await waitForDispatch(dbg, "SET_BREAKPOINT_CONDITION");
bp = findBreakpoint(dbg, "simple2", 5); bp = findBreakpoint(dbg, "simple2", 5);
is(bp.condition, "12", "breakpoint is created with the condition"); is(bp.condition, "12", "breakpoint is created with the condition");
assertEditorBreakpoint(dbg, 5, true); assertEditorBreakpoint(dbg, 5, true);
// Removing a conditional breakpoint dump("Removing a conditional breakpoint\n")
clickElement(dbg, "gutter", 5); clickElement(dbg, "gutter", 5);
await waitForDispatch(dbg, "REMOVE_BREAKPOINT"); await waitForDispatch(dbg, "REMOVE_BREAKPOINT");
bp = findBreakpoint(dbg, "simple2", 5); bp = findBreakpoint(dbg, "simple2", 5);

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

@ -23,7 +23,7 @@ add_task(async function() {
toggleCallStack(dbg); toggleCallStack(dbg);
const notPaused = findElement(dbg, "callStackBody").innerText; 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"); invokeInTab("firstCall");
await waitForPaused(dbg); await waitForPaused(dbg);
@ -47,13 +47,13 @@ add_task(async function() {
// check to make sure that the toggle button isn't there // check to make sure that the toggle button isn't there
let button = toggleButton(dbg); let button = toggleButton(dbg);
let frames = findAllElements(dbg, "frames"); 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"); is(frames.length, 7, "There should be at most seven frames");
button.click(); button.click();
button = toggleButton(dbg); button = toggleButton(dbg);
frames = findAllElements(dbg, "frames"); 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"); 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 * 1. add watch expressions
* 2. edit watch expressions * 2. edit watch expressions
* 3. delete watch expressions * 3. delete watch expressions
* 4. expanding properties when not paused
*/ */
const expressionSelectors = { const expressionSelectors = {
@ -61,7 +62,7 @@ add_task(async function() {
await addExpression(dbg, "f"); await addExpression(dbg, "f");
is(getLabel(dbg, 1), "f"); is(getLabel(dbg, 1), "f");
is(getValue(dbg, 1), `"ReferenceError: f is not defined"`); is(getValue(dbg, 1), "(unavailable)");
await editExpression(dbg, "oo"); await editExpression(dbg, "oo");
is(getLabel(dbg, 1), "foo()"); is(getLabel(dbg, 1), "foo()");
@ -79,6 +80,15 @@ add_task(async function() {
await deleteExpression(dbg, "foo"); await deleteExpression(dbg, "foo");
await deleteExpression(dbg, "location"); 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); is(findAllElements(dbg, "expressionNodes").length, 0);
}); });

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

@ -19,7 +19,9 @@ add_task(async function () {
const console = await toolbox.selectTool("webconsole"); const console = await toolbox.selectTool("webconsole");
const hud = console.hud; 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"; const initialLocation = "math.min.js:3:65";
is(node.textContent, initialLocation, "location is correct in minified code"); is(node.textContent, initialLocation, "location is correct in minified code");
@ -43,5 +45,9 @@ add_task(async function () {
return found; 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() { add_task(async function() {
const dbg = await initDebugger("doc-sources.html"); const dbg = await initDebugger("doc-sources.html");
const { selectors: { getSelectedSource }, getState } = dbg; const { selectors: { getSelectedSource }, getState } = dbg;
@ -53,11 +57,7 @@ add_task(async function() {
}); });
await waitForSourceCount(dbg, 9); await waitForSourceCount(dbg, 9);
is( is(getLabel(dbg, 7), "math.min.js", "The dynamic script exists");
findElement(dbg, "sourceNode", 7).textContent,
"math.min.js",
"The dynamic script exists"
);
// Make sure named eval sources appear in the list. // 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"); content.eval("window.evaledFunc = function() {} //# sourceURL=evaled.js");
}); });
await waitForSourceCount(dbg, 3); 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 is(getLabel(dbg, 3), "evaled.js", "the eval script exists");
// 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"
);
}); });

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

@ -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"); info("Loaded, selecting the test script to debug");
// First expand the domain // First expand the domain
let domain = [...document.querySelectorAll(".tree-node")].find(node => { let domain = [...document.querySelectorAll(".tree-node")].find(node => {
return node.textContent == "mozilla.org"; return node.textContent.trim() == "mozilla.org";
}); });
let arrow = domain.querySelector(".arrow"); let arrow = domain.querySelector(".arrow");
arrow.click(); arrow.click();

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

@ -21,17 +21,17 @@ copySource.accesskey=y
# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the # LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the
# context menu to copy the source URL of file open. # context menu to copy the source URL of file open.
copySourceUrl=Copy Source URL copySourceUrl=Copy source url
copySourceUrl.accesskey=u copySourceUrl.accesskey=u
# LOCALIZATION NOTE (copyFunction): This is the text that appears in the # LOCALIZATION NOTE (copyFunction): This is the text that appears in the
# context menu to copy the function the user selected # context menu to copy the function the user selected
copyFunction.label=Copy Function copyFunction.label=Copy function
copyFunction.accesskey=F copyFunction.accesskey=F
# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the # LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the
# context menu to copy the stack trace methods, file names and row number. # context menu to copy the stack trace methods, file names and row number.
copyStackTrace=Copy Stack Trace copyStackTrace=Copy stack trace
copyStackTrace.accesskey=c copyStackTrace.accesskey=c
# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button # 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 # LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the
# button that steps over a function call. # 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 # LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the
# button that steps into a function call. # 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 # LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the
# button that steps out of a function call. # 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 # LOCALIZATION NOTE (workersHeader): The text to display in the events
# header. # header.
@ -76,11 +76,11 @@ noSourcesText=This page has no sources.
# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab # LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab
# when there are no events. # 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 # LOCALIZATION NOTE (eventListenersHeader): The text to display in the events
# header. # header.
eventListenersHeader=Event Listeners eventListenersHeader=Event listeners
# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab # LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab
# when there are no stack frames. # when there are no stack frames.
@ -152,6 +152,30 @@ projectTextSearch.key=CmdOrCtrl+Shift+F
# modal for searching functions in a file. # modal for searching functions in a file.
functionSearch.key=CmdOrCtrl+Shift+O 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 # LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown
# when searching across all of the files in a project. # when searching across all of the files in a project.
projectTextSearch.placeholder=Find in files… projectTextSearch.placeholder=Find in files…
@ -227,6 +251,30 @@ searchPanelVariable=Filter variables (%S)
# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that # LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that
# are displayed in the breakpoints menu item popup. # are displayed in the breakpoints menu item popup.
breakpointMenuItem.setConditional=Configure conditional breakpoint 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=Enable breakpoint
breakpointMenuItem.enableSelf.accesskey=E breakpointMenuItem.enableSelf.accesskey=E
breakpointMenuItem.disableSelf=Disable breakpoint breakpointMenuItem.disableSelf=Disable breakpoint
@ -255,34 +303,34 @@ breakpoints.header=Breakpoints
# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are # LOCALIZATION NOTE (breakpoints.none): The text that appears when there are
# no breakpoints present # no breakpoints present
breakpoints.none=No Breakpoints breakpoints.none=No breakpoints
# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip # LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip
# when hovering over the 'disable breakpoints' switch button in right sidebar # 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 # LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip
# when hovering over the 'disable breakpoints' switch button in right sidebar # 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 # LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed
# for remove breakpoint button in right sidebar # 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. # 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 # LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane
# message when not paused. # message when not paused.
callStack.notPaused=Not Paused callStack.notPaused=Not paused
# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane # LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane
# message to hide some of the frames that are shown. # 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 # LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane
# message to show more of the frames. # message to show more of the frames.
callStack.expand=Expand Rows callStack.expand=Expand rows
# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message # LOCALIZATION NOTE (editor.searchResults): Editor Search bar message
# for the summarizing the selected search result. e.g. 5 of 10 results. # 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 # LOCALIZATION NOTE (editor.noResults): Editor Search bar message
# for when no results found. # for when no results found.
editor.noResults=no results editor.noResults=No results
# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar # LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar
# tooltip for traversing to the Next Result # 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 # LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar
# tooltip for traversing to the Previous Result # 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 # LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for
# toggling search type buttons(function search, variable search) # toggling search type buttons(function search, variable search)
@ -309,32 +357,32 @@ editor.searchTypeToggleTitle=Search for:
# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context # LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context
# menu item for jumping to a new paused location # 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 editor.continueToHere.accesskey=H
# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item # LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item
# for adding a breakpoint on a line. # for adding a breakpoint on a line.
editor.addBreakpoint=Add Breakpoint editor.addBreakpoint=Add breakpoint
# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item # LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item
# for disabling a breakpoint on a line. # for disabling a breakpoint on a line.
editor.disableBreakpoint=Disable Breakpoint editor.disableBreakpoint=Disable breakpoint
# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item # LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item
# for enabling a breakpoint on a line. # for enabling a breakpoint on a line.
editor.enableBreakpoint=Enable Breakpoint editor.enableBreakpoint=Enable breakpoint
# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item # LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item
# for removing a breakpoint on a line. # for removing a breakpoint on a line.
editor.removeBreakpoint=Remove Breakpoint editor.removeBreakpoint=Remove breakpoint
# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item # LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item
# for setting a breakpoint condition on a line. # for setting a breakpoint condition on a line.
editor.editBreakpoint=Edit Breakpoint editor.editBreakpoint=Edit breakpoint
# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context # LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context
# menu item for adding a breakpoint condition on a line. # 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 # LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for
# input element inside ConditionalPanel component # input element inside ConditionalPanel component
@ -346,80 +394,80 @@ editor.conditionalPanel.close=Cancel edit breakpoint and close
# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item # LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item
# for navigating to a source mapped location # 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 # LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the
# context menu to disable framework grouping. # context menu to disable framework grouping.
framework.disableGrouping=Disable Framework Grouping framework.disableGrouping=Disable framework grouping
framework.disableGrouping.accesskey=u framework.disableGrouping.accesskey=u
# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the # LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the
# context menu to enable framework grouping. # context menu to enable framework grouping.
framework.enableGrouping=Enable Framework Grouping framework.enableGrouping=Enable framework grouping
framework.enableGrouping.accesskey=u framework.enableGrouping.accesskey=u
# LOCALIZATION NOTE (generated): Source Map term for a server source location # LOCALIZATION NOTE (generated): Source Map term for a server source location
generated=Generated generated=Generated
# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location # LOCALIZATION NOTE (original): Source Map term for a debugger UI source location
original=Original original=original
# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression # LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression
# input element # input element
expressions.placeholder=Add Watch Expression expressions.placeholder=Add watch expression
# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item # LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item
# for closing the selected tab below the mouse. # for closing the selected tab below the mouse.
sourceTabs.closeTab=Close Tab sourceTabs.closeTab=Close tab
sourceTabs.closeTab.accesskey=c sourceTabs.closeTab.accesskey=c
# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item # LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item
# for closing the other tabs. # for closing the other tabs.
sourceTabs.closeOtherTabs=Close Other Tabs sourceTabs.closeOtherTabs=Close other tabs
sourceTabs.closeOtherTabs.accesskey=o sourceTabs.closeOtherTabs.accesskey=o
# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item # 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. # 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 sourceTabs.closeTabsToEnd.accesskey=e
# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item # LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item
# for closing all tabs. # for closing all tabs.
sourceTabs.closeAllTabs=Close All Tabs sourceTabs.closeAllTabs=Close all tabs
sourceTabs.closeAllTabs.accesskey=a sourceTabs.closeAllTabs.accesskey=a
# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item # LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item
# for revealing source in tree. # for revealing source in tree.
sourceTabs.revealInTree=Reveal in Tree sourceTabs.revealInTree=Reveal in tree
sourceTabs.revealInTree.accesskey=r sourceTabs.revealInTree.accesskey=r
# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item # LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item
# for copying a link address. # for copying a link address.
sourceTabs.copyLink=Copy Link Address sourceTabs.copyLink=Copy link address
sourceTabs.copyLink.accesskey=l sourceTabs.copyLink.accesskey=l
# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item # LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item
# for pretty printing the source. # for pretty printing the source.
sourceTabs.prettyPrint=Pretty Print Source sourceTabs.prettyPrint=Pretty print source
sourceTabs.prettyPrint.accesskey=p sourceTabs.prettyPrint.accesskey=p
# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated # LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated
# with the blackbox button # with the blackbox button
sourceFooter.blackbox=Blackbox Source sourceFooter.blackbox=Blackbox source
sourceFooter.blackbox.accesskey=B sourceFooter.blackbox.accesskey=B
# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated # LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated
# with the blackbox button # with the blackbox button
sourceFooter.unblackbox=Unblackbox Source sourceFooter.unblackbox=Unblackbox source
sourceFooter.unblackbox.accesskey=b sourceFooter.unblackbox.accesskey=b
# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated # LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated
# with a blackboxed source # with a blackboxed source
sourceFooter.blackboxed=Blackboxed Source sourceFooter.blackboxed=Blackboxed source
# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated # LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated
# with a code coverage button # with a code coverage button
sourceFooter.codeCoverage=Code Coverage sourceFooter.codeCoverage=Code coverage
# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed # LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed
# for close tab button in source tabs. # for close tab button in source tabs.
@ -434,11 +482,11 @@ scopes.header=Scopes
# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message # LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message
# for when the debugger is paused, but there isn't pause data. # 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 # LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message
# for when the debugger is not paused. # 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 # LOCALIZATION NOTE (scopes.block): Refers to a block of code in
# the scopes pane when the debugger is paused. # 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 # LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar
# pane header. # pane header.
watchExpressions.header=Watch Expressions watchExpressions.header=Watch expressions
# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header # LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header
# button for refreshing the expressions. # button for refreshing the expressions.
@ -507,7 +555,7 @@ loadingText=Loading\u2026
# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger # LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger
# viewer when there is an error loading a file # 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 # LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the
# watch expressions list to add a new item. # watch expressions list to add a new item.
@ -639,7 +687,7 @@ variablesViewOptimizedOut=(optimized away)
variablesViewUninitialized=(uninitialized) variablesViewUninitialized=(uninitialized)
variablesViewMissingArgs=(unavailable) variablesViewMissingArgs=(unavailable)
anonymousSourcesLabel=Anonymous Sources anonymousSourcesLabel=Anonymous sources
experimental=This is an experimental feature experimental=This is an experimental feature
@ -698,3 +746,47 @@ whyPaused.other=Debugger paused
# LOCALIZATION NOTE (ctrl): The text that is used for documenting # LOCALIZATION NOTE (ctrl): The text that is used for documenting
# keyboard shortcuts that use the control key # keyboard shortcuts that use the control key
ctrl=Ctrl 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.pause-on-exceptions", false);
pref("devtools.debugger.ignore-caught-exceptions", false); pref("devtools.debugger.ignore-caught-exceptions", false);
pref("devtools.debugger.source-maps-enabled", true); 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.client-source-maps-enabled", true);
pref("devtools.debugger.pretty-print-enabled", true); pref("devtools.debugger.pretty-print-enabled", true);
pref("devtools.debugger.auto-pretty-print", false); 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-whole-word", false);
pref("devtools.debugger.file-search-regex-match", false); pref("devtools.debugger.file-search-regex-match", false);
pref("devtools.debugger.features.async-stepping", true); 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); pref("devtools.debugger.features.wasm", true);

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

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

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

@ -1012,8 +1012,7 @@ nsPIDOMWindow<T>::nsPIDOMWindow(nsPIDOMWindowOuter *aOuterWindow)
mLargeAllocStatus(LargeAllocStatus::NONE), mLargeAllocStatus(LargeAllocStatus::NONE),
mHasTriedToCacheTopInnerWindow(false), mHasTriedToCacheTopInnerWindow(false),
mNumOfIndexedDBDatabases(0), mNumOfIndexedDBDatabases(0),
mNumOfOpenWebSockets(0), mNumOfOpenWebSockets(0)
mNumOfActiveUserMedia(0)
{ {
if (aOuterWindow) { if (aOuterWindow) {
mTimeoutManager = mTimeoutManager =
@ -4387,7 +4386,6 @@ nsGlobalWindow::UpdateTopInnerWindow()
} }
mTopInnerWindow->UpdateWebSocketCount(-(int32_t)mNumOfOpenWebSockets); mTopInnerWindow->UpdateWebSocketCount(-(int32_t)mNumOfOpenWebSockets);
mTopInnerWindow->UpdateUserMediaCount(-(int32_t)mNumOfActiveUserMedia);
} }
void void
@ -4548,32 +4546,6 @@ nsPIDOMWindowInner::HasOpenWebSockets() const
(mTopInnerWindow && mTopInnerWindow->mNumOfOpenWebSockets); (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 void
nsPIDOMWindowOuter::MaybeActiveMediaComponents() nsPIDOMWindowOuter::MaybeActiveMediaComponents()
{ {

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

@ -751,9 +751,6 @@ protected:
// The number of open WebSockets. Inner window only. // The number of open WebSockets. Inner window only.
uint32_t mNumOfOpenWebSockets; uint32_t mNumOfOpenWebSockets;
// The number of active user media. Inner window only.
uint32_t mNumOfActiveUserMedia;
}; };
#define NS_PIDOMWINDOWINNER_IID \ #define NS_PIDOMWINDOWINNER_IID \
@ -942,12 +939,6 @@ public:
// timeout-throttling. // timeout-throttling.
bool HasOpenWebSockets() const; 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: protected:
void CreatePerformanceObjectIfNeeded(); void CreatePerformanceObjectIfNeeded();
}; };

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

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

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

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

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

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

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

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

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

@ -2933,11 +2933,6 @@ MediaManager::AddWindowID(uint64_t aWindowId,
return; return;
} }
auto* window = nsGlobalWindow::GetInnerWindowWithId(aWindowId);
if (window) {
window->AsInner()->UpdateUserMediaCount(1);
}
GetActiveWindows()->Put(aWindowId, aListener); GetActiveWindows()->Put(aWindowId, aListener);
} }
@ -2953,8 +2948,6 @@ MediaManager::RemoveWindowID(uint64_t aWindowId)
return; return;
} }
window->AsInner()->UpdateUserMediaCount(-1);
nsPIDOMWindowOuter* outer = window->AsInner()->GetOuterWindow(); nsPIDOMWindowOuter* outer = window->AsInner()->GetOuterWindow();
if (!outer) { if (!outer) {
LOG(("No outer window for inner %" PRIu64, aWindowId)); 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. * Session is an object to represent a single recording event.
* In original design, all recording context is stored in MediaRecorder, which causes * 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, * 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 * 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, * MediaRecorder::Stop. If someone call MediaRecorder::Start before Read Thread shutdown,
* the same recording context in MediaRecoder might be access by two Reading Threads, * the same recording context in MediaRecorder might be access by two Reading Threads,
* which cause a problem. * which cause a problem.
* In the new design, we put recording context into Session object, including Read * 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 * Thread. Each Session has its own recording context and Read Thread, problem is been
@ -1045,7 +1045,7 @@ private:
} }
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. // if there is an active session. Access ONLY on main thread.
RefPtr<MediaRecorder> mRecorder; RefPtr<MediaRecorder> mRecorder;

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

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

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

@ -514,13 +514,11 @@ AsyncDecodeWebAudio(const char* aContentType, uint8_t* aBuffer,
} }
} }
WebAudioDecodeJob::WebAudioDecodeJob(const nsACString& aContentType, WebAudioDecodeJob::WebAudioDecodeJob(AudioContext* aContext,
AudioContext* aContext,
Promise* aPromise, Promise* aPromise,
DecodeSuccessCallback* aSuccessCallback, DecodeSuccessCallback* aSuccessCallback,
DecodeErrorCallback* aFailureCallback) DecodeErrorCallback* aFailureCallback)
: mContentType(aContentType) : mContext(aContext)
, mContext(aContext)
, mPromise(aPromise) , mPromise(aPromise)
, mSuccessCallback(aSuccessCallback) , mSuccessCallback(aSuccessCallback)
, mFailureCallback(aFailureCallback) , mFailureCallback(aFailureCallback)
@ -609,7 +607,6 @@ size_t
WebAudioDecodeJob::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const WebAudioDecodeJob::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{ {
size_t amount = 0; size_t amount = 0;
amount += mContentType.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
if (mSuccessCallback) { if (mSuccessCallback) {
amount += mSuccessCallback->SizeOfIncludingThis(aMallocSizeOf); 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. // You may omit both the success and failure callback, or you must pass both.
// The callbacks are only necessary for asynchronous operation. // The callbacks are only necessary for asynchronous operation.
WebAudioDecodeJob(const nsACString& aContentType, WebAudioDecodeJob(dom::AudioContext* aContext,
dom::AudioContext* aContext,
dom::Promise* aPromise, dom::Promise* aPromise,
dom::DecodeSuccessCallback* aSuccessCallback = nullptr, dom::DecodeSuccessCallback* aSuccessCallback = nullptr,
dom::DecodeErrorCallback* aFailureCallback = nullptr); dom::DecodeErrorCallback* aFailureCallback = nullptr);
@ -57,7 +56,6 @@ struct WebAudioDecodeJob final
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const; size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
AudioChunk mBuffer; AudioChunk mBuffer;
nsCString mContentType;
RefPtr<dom::AudioContext> mContext; RefPtr<dom::AudioContext> mContext;
RefPtr<dom::Promise> mPromise; RefPtr<dom::Promise> mPromise;
RefPtr<dom::DecodeSuccessCallback> mSuccessCallback; RefPtr<dom::DecodeSuccessCallback> mSuccessCallback;

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

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

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

@ -8,6 +8,7 @@
#include "mozilla/dom/Promise.h" #include "mozilla/dom/Promise.h"
#include "mozilla/dom/PromiseWorkerProxy.h" #include "mozilla/dom/PromiseWorkerProxy.h"
#include "mozilla/JSObjectHolder.h"
#include "ServiceWorkerClient.h" #include "ServiceWorkerClient.h"
#include "ServiceWorkerManager.h" #include "ServiceWorkerManager.h"
@ -670,6 +671,9 @@ private:
MOZ_DIAGNOSTIC_ASSERT(aWindow); MOZ_DIAGNOSTIC_ASSERT(aWindow);
WorkerPrivate* workerPrivate = mPromiseProxy->GetWorkerPrivate(); 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 // [[1. Let url be the result of parsing url with entry settings object's API
// base URL.]] // base URL.]]
nsCOMPtr<nsIURI> uri; nsCOMPtr<nsIURI> uri;
@ -694,6 +698,25 @@ private:
} }
if (XRE_IsContentProcess()) { 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 // ContentProcess
nsCOMPtr<nsIWindowWatcher> wwatch = nsCOMPtr<nsIWindowWatcher> wwatch =
do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv); do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv);
@ -754,9 +777,6 @@ private:
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
nsCOMPtr<nsIPrincipal> triggeringPrincipal = workerPrivate->GetPrincipal();
MOZ_DIAGNOSTIC_ASSERT(triggeringPrincipal);
nsCOMPtr<mozIDOMWindowProxy> win; nsCOMPtr<mozIDOMWindowProxy> win;
rv = bwin->OpenURI(uri, nullptr, rv = bwin->OpenURI(uri, nullptr,
nsIBrowserDOMWindow::OPEN_DEFAULTWINDOW, nsIBrowserDOMWindow::OPEN_DEFAULTWINDOW,

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

@ -5,10 +5,14 @@ support-files =
download/window.html download/window.html
download/worker.js download/worker.js
file_multie10s_update.html file_multie10s_update.html
file_userContextId_openWindow.js
force_refresh_browser_worker.js force_refresh_browser_worker.js
empty.html
server_multie10s_update.sjs server_multie10s_update.sjs
[browser_force_refresh.js] [browser_force_refresh.js]
[browser_download.js] [browser_download.js]
[browser_multie10s_update.js] [browser_multie10s_update.js]
run-if=e10s 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,13 +2430,31 @@ EditorBase::FindBetterInsertionPoint(nsCOMPtr<nsINode>& aNode,
// In some other cases, aNode is the anonymous DIV, and offset points to the // In some other cases, aNode is the anonymous DIV, and offset points to the
// terminating mozBR. In that case, we'll adjust aInOutNode and // terminating mozBR. In that case, we'll adjust aInOutNode and
// aInOutOffset to the preceding text node, if any. // aInOutOffset to the preceding text node, if any.
if (offset > 0 && node->GetChildAt(offset - 1) && if (offset) {
node->GetChildAt(offset - 1)->IsNodeOfType(nsINode::eTEXT)) { 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); NS_ENSURE_TRUE_VOID(node->Length() <= INT32_MAX);
aNode = node->GetChildAt(offset - 1); aNode = child;
aOffset = static_cast<int32_t>(aNode->Length()); aOffset = static_cast<int32_t>(aNode->Length());
return; 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;
}
}
}
} }
// Sometimes, aNode is the mozBR element itself. In that case, we'll adjust // Sometimes, aNode is the mozBR element itself. In that case, we'll adjust

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

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

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

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

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

@ -22,7 +22,7 @@ void nsEUCJPProber::Reset(void)
nsProbingState nsEUCJPProber::HandleData(const char* aBuf, uint32_t aLen) nsProbingState nsEUCJPProber::HandleData(const char* aBuf, uint32_t aLen)
{ {
NS_ASSERTION(aLen, "HandleData called with empty buffer"); NS_ASSERTION(aLen, "HandleData called with empty buffer");
nsSMState codingState; uint32_t codingState;
for (uint32_t i = 0; i < aLen; i++) 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) nsProbingState nsEscCharSetProber::HandleData(const char* aBuf, uint32_t aLen)
{ {
nsSMState codingState; uint32_t codingState;
uint32_t i; uint32_t i;
for ( i = 0; i < aLen && mState == eDetecting; 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) nsProbingState nsSJISProber::HandleData(const char* aBuf, uint32_t aLen)
{ {
NS_ASSERTION(aLen, "HandleData called with empty buffer"); NS_ASSERTION(aLen, "HandleData called with empty buffer");
nsSMState codingState; uint32_t codingState;
for (uint32_t i = 0; i < aLen; i++) 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) nsProbingState nsUTF8Prober::HandleData(const char* aBuf, uint32_t aLen)
{ {
nsSMState codingState; uint32_t codingState;
for (uint32_t i = 0; i < aLen; i++) 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_inactive_zindex.html
helper_scroll_on_position_fixed.html helper_scroll_on_position_fixed.html
helper_scroll_over_scrollbar.html helper_scroll_over_scrollbar.html
helper_scroll_tables_perspective.html
helper_scrollto_tap.html helper_scrollto_tap.html
helper_subframe_style.css helper_subframe_style.css
helper_tall.html helper_tall.html

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

@ -31,7 +31,8 @@ var subtests = [
{'file': 'helper_bug1271432.html', 'prefs': prefs}, {'file': 'helper_bug1271432.html', 'prefs': prefs},
{'file': 'helper_scroll_inactive_perspective.html', 'prefs': prefs}, {'file': 'helper_scroll_inactive_perspective.html', 'prefs': prefs},
{'file': 'helper_scroll_inactive_zindex.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()) { if (isApzEnabled()) {

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

@ -142,6 +142,13 @@ if os_bsd or os_linux:
'src/base/message_pump_glib.cc', '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'] ost = CONFIG['OS_TEST']
if '86' not in ost and 'arm' not in ost and 'aarch64' != ost and 'mips' not in ost: if '86' not in ost and 'arm' not in ost and 'aarch64' != ost and 'mips' not in ost:
SOURCES += [ SOURCES += [

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

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

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

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

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

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

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

@ -662,7 +662,8 @@ MOZ_MUST_USE bool StringSplitHelper(JSContext* cx, HandleString str, HandleStrin
MutableHandleValue result); MutableHandleValue result);
MOZ_MUST_USE bool ArrayPopDense(JSContext* cx, HandleObject obj, MutableHandleValue rval); 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); MOZ_MUST_USE bool ArrayShiftDense(JSContext* cx, HandleObject obj, MutableHandleValue rval);
JSString* ArrayJoin(JSContext* cx, HandleObject array, HandleString sep); JSString* ArrayJoin(JSContext* cx, HandleObject array, HandleString sep);
MOZ_MUST_USE bool SetArrayLength(JSContext* cx, HandleObject obj, HandleValue value, bool strict); MOZ_MUST_USE bool SetArrayLength(JSContext* cx, HandleObject obj, HandleValue value, bool strict);
@ -796,7 +797,7 @@ ForcedRecompile(JSContext* cx);
JSString* StringReplace(JSContext* cx, HandleString string, HandleString pattern, JSString* StringReplace(JSContext* cx, HandleString string, HandleString pattern,
HandleString repl); HandleString repl);
MOZ_MUST_USE bool SetDenseOrUnboxedArrayElement(JSContext* cx, HandleObject obj, int32_t index, MOZ_MUST_USE bool SetDenseElement(JSContext* cx, HandleNativeObject obj, int32_t index,
HandleValue value, bool strict); HandleValue value, bool strict);
void AssertValidObjectPtr(JSContext* cx, JSObject* obj); void AssertValidObjectPtr(JSContext* cx, JSObject* obj);

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

@ -2272,24 +2272,44 @@ Assembler::PatchConstantPoolLoad(void* loadAddr, void* constPoolAddr)
// Atomic instruction stuff: // 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 BufferOffset
Assembler::as_ldrex(Register rt, Register rn, Condition c) 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)); return writeInst(0x01900f9f | (int)c | RT(rt) | RN(rn));
} }
BufferOffset BufferOffset
Assembler::as_ldrexh(Register rt, Register rn, Condition c) 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)); return writeInst(0x01f00f9f | (int)c | RT(rt) | RN(rn));
} }
BufferOffset BufferOffset
Assembler::as_ldrexb(Register rt, Register rn, Condition c) 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)); 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 BufferOffset
Assembler::as_strex(Register rd, Register rt, Register rn, Condition c) 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()); return writeInst(0x01c00f90 | (int)c | RD(rd) | RN(rn) | rt.code());
} }
BufferOffset
Assembler::as_clrex()
{
return writeInst(0xf57ff01f);
}
// Memory barrier stuff: // Memory barrier stuff:
BufferOffset BufferOffset

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

@ -1560,23 +1560,32 @@ class Assembler : public AssemblerShared
// Load a 32 bit floating point immediate from a pool into a register. // Load a 32 bit floating point immediate from a pool into a register.
BufferOffset as_FImm32Pool(VFPRegister dest, float value, Condition c = Always); 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 // The word versions are available from ARMv6 forward and can be used to
// implement the halfword and byte versions on older systems. // 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] // LDREX rt, [rn]
BufferOffset as_ldrex(Register rt, Register rn, Condition c = Always); BufferOffset as_ldrex(Register rt, Register rn, Condition c = Always);
BufferOffset as_ldrexh(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); 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. // STREX rd, rt, [rn]. Constraint: rd != rn, rd != rt.
BufferOffset as_strex(Register rd, Register rt, Register rn, Condition c = Always); 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_strexh(Register rd, Register rt, Register rn, Condition c = Always);
BufferOffset as_strexb(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. // Memory synchronization.
// These are available from ARMv7 forward. // These are available from ARMv7 forward.
BufferOffset as_dmb(BarrierOption option = BarrierSY); BufferOffset as_dmb(BarrierOption option = BarrierSY);

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

@ -1986,33 +1986,33 @@ Simulator::writeDW(int32_t addr, int32_t value1, int32_t value2)
int32_t int32_t
Simulator::readExDW(int32_t addr, int32_t* hibits) 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) { if ((addr & 3) == 0) {
SharedMem<uint64_t*> ptr = SharedMem<uint64_t*>::shared(reinterpret_cast<uint64_t*>(addr)); 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); uint64_t value = loadRelaxed(ptr);
exclusiveMonitorSet(value); exclusiveMonitorSet(value);
*hibits = int32_t(value); *hibits = int32_t(value >> 32);
return int32_t(value >> 32); return int32_t(value);
} }
printf("Unaligned read at 0x%08x\n", addr); printf("Unaligned read at 0x%08x\n", addr);
MOZ_CRASH(); MOZ_CRASH();
return 0; return 0;
#endif
} }
int32_t int32_t
Simulator::writeExDW(int32_t addr, int32_t value1, int32_t value2) 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) { if ((addr & 3) == 0) {
SharedMem<uint64_t*> ptr = SharedMem<uint64_t*>::shared(reinterpret_cast<uint64_t*>(addr)); 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; bool held;
uint64_t expected = exclusiveMonitorGetAndClear(&held); uint64_t expected = exclusiveMonitorGetAndClear(&held);
if (!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); printf("Unaligned write at 0x%08x\n", addr);
MOZ_CRASH(); MOZ_CRASH();
} }
#endif
} }
uintptr_t uintptr_t
@ -4689,6 +4688,9 @@ Simulator::decodeSpecialCondition(SimInstruction* instr)
case 0xA: case 0xA:
if (instr->bits(31,20) == 0xf57) { if (instr->bits(31,20) == 0xf57) {
switch (instr->bits(7,4)) { switch (instr->bits(7,4)) {
case 1: // CLREX
exclusiveMonitorClear();
break;
case 5: // DMB case 5: // DMB
AtomicOperations::fenceSeqCst(); AtomicOperations::fenceSeqCst();
break; break;

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

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

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

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

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

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

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

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

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

@ -646,6 +646,13 @@ if CONFIG['NIGHTLY_BUILD']:
if CONFIG['NIGHTLY_BUILD']: if CONFIG['NIGHTLY_BUILD']:
DEFINES['ENABLE_WASM_THREAD_OPS'] = True 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']: if CONFIG['MOZ_DEBUG'] or CONFIG['NIGHTLY_BUILD']:
DEFINES['JS_CACHEIR_SPEW'] = True DEFINES['JS_CACHEIR_SPEW'] = True

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

@ -3047,14 +3047,13 @@ static bool
Clone(JSContext* cx, unsigned argc, Value* vp) Clone(JSContext* cx, unsigned argc, Value* vp)
{ {
CallArgs args = CallArgsFromVp(argc, 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"); JS_ReportErrorASCII(cx, "Invalid arguments to clone");
return false; return false;
} }
RootedObject funobj(cx);
{ {
Maybe<JSAutoCompartment> ac; Maybe<JSAutoCompartment> ac;
RootedObject obj(cx, args[0].isPrimitive() ? nullptr : &args[0].toObject()); 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 (args.length() > 1) {
if (!JS_ValueToObject(cx, args[1], &parent)) if (!JS_ValueToObject(cx, args[1], &env))
return false; return false;
} else { } else {
parent = js::GetGlobalForObjectCrossCompartment(&args.callee()); env = js::GetGlobalForObjectCrossCompartment(&args.callee());
} }
// Should it worry us that we might be getting with wrappers // Should it worry us that we might be getting with wrappers
// around with wrappers here? // around with wrappers here?
JS::AutoObjectVector scopeChain(cx); JS::AutoObjectVector envChain(cx);
if (!parent->is<GlobalObject>() && !scopeChain.append(parent)) if (env && !env->is<GlobalObject>() && !envChain.append(env))
return false; return false;
JSObject* clone = JS::CloneFunctionObject(cx, funobj, scopeChain); JSObject* clone = JS::CloneFunctionObject(cx, funobj, envChain);
if (!clone) if (!clone)
return false; return false;
args.rval().setObject(*clone); args.rval().setObject(*clone);
@ -6213,6 +6213,10 @@ WasmLoop(JSContext* cx, unsigned argc, Value* vp)
} }
static const JSFunctionSpecWithHelp shell_functions[] = { 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, JS_FN_HELP("version", Version, 0, 0,
"version([number])", "version([number])",
" Get or force a script compilation 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[] = { 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, JS_FN_HELP("getSelfHostedValue", GetSelfHostedValue, 1, 0,
"getSelfHostedValue()", "getSelfHostedValue()",
" Get a self-hosted value by its name. Note that these values don't get \n" " 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 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(!denseElementsAreCopyOnWrite());
MOZ_ASSERT(!denseElementsAreFrozen()); MOZ_ASSERT(!denseElementsAreFrozen());
setDenseInitializedLength(count);
#ifdef DEBUG #ifdef DEBUG
for (uint32_t i = 0; i < count; ++i) for (uint32_t i = 0; i < count; ++i)
checkStoredValue(src[i]); checkStoredValue(src[i]);
#endif #endif
memcpy(&elements_[dstStart], src, count * sizeof(HeapSlot));
elementsRangeWriteBarrierPost(dstStart, count); memcpy(elements_, src, count * sizeof(HeapSlot));
elementsRangeWriteBarrierPost(0, count);
} }
inline bool inline bool
@ -382,6 +396,38 @@ NativeObject::ensureDenseElements(JSContext* cx, uint32_t index, uint32_t extra)
return DenseElementResult::Success; 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 inline Value
NativeObject::getDenseOrTypedArrayElement(uint32_t idx) NativeObject::getDenseOrTypedArrayElement(uint32_t idx)
{ {

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

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

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

@ -168,78 +168,6 @@ UnboxedPlainObject::layout() const
return group()->unboxedLayout(); 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 } // namespace js
#endif // vm_UnboxedObject_inl_h #endif // vm_UnboxedObject_inl_h

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

@ -30,6 +30,13 @@ using namespace js::wasm;
using mozilla::IsPowerOfTwo; 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 void
Val::writePayload(uint8_t* dst) const Val::writePayload(uint8_t* dst) const
{ {

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

@ -1650,12 +1650,7 @@ static const unsigned PageSize = 64 * 1024;
static const unsigned MaxMemoryAccessSize = sizeof(Val); static const unsigned MaxMemoryAccessSize = sizeof(Val);
#ifdef JS_CODEGEN_X64 #ifdef WASM_HUGE_MEMORY
// 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
// On WASM_HUGE_MEMORY platforms, every asm.js or WebAssembly memory // On WASM_HUGE_MEMORY platforms, every asm.js or WebAssembly memory
// unconditionally allocates a huge region of virtual memory of size // unconditionally allocates a huge region of virtual memory of size

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

@ -78,6 +78,12 @@ ExpectedOwnerForChild(const nsIFrame& aFrame)
return parent; 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); parent = FirstContinuationOrPartOfIBSplit(parent);
// We've handled already anon boxes and bullet frames, so now we're looking at // We've handled already anon boxes and bullet frames, so now we're looking at
@ -567,6 +573,8 @@ UpdateBackdropIfNeeded(nsIFrame* aFrame,
static void static void
UpdateFirstLetterIfNeeded(nsIFrame* aFrame, ServoRestyleState& aRestyleState) UpdateFirstLetterIfNeeded(nsIFrame* aFrame, ServoRestyleState& aRestyleState)
{ {
MOZ_ASSERT(!aFrame->IsFrameOfType(nsIFrame::eBlockFrame),
"You're probably duplicating work with UpdatePseudoElementStyles!");
if (!aFrame->HasFirstLetterChild()) { if (!aFrame->HasFirstLetterChild()) {
return; 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 // 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 // find the right element for the first-letter's style resolution. Might as
// well just delegate the whole thing to that block. // well just delegate the whole thing to that block.
nsIFrame* block = aFrame; nsIFrame* block = aFrame->GetParent();
while (!block->IsFrameOfType(nsIFrame::eBlockFrame)) { while (!block->IsFrameOfType(nsIFrame::eBlockFrame)) {
block = block->GetParent(); block = block->GetParent();
} }
static_cast<nsBlockFrame*>(block->FirstContinuation())-> static_cast<nsBlockFrame*>(block->FirstContinuation())->
UpdateFirstLetterStyle(aRestyleState); UpdateFirstLetterStyle(aRestyleState);
} }
@ -638,12 +647,10 @@ static void
UpdateFramePseudoElementStyles(nsIFrame* aFrame, UpdateFramePseudoElementStyles(nsIFrame* aFrame,
ServoRestyleState& aRestyleState) 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)) { if (aFrame->IsFrameOfType(nsIFrame::eBlockFrame)) {
static_cast<nsBlockFrame*>(aFrame)->UpdatePseudoElementStyles(aRestyleState); static_cast<nsBlockFrame*>(aFrame)->UpdatePseudoElementStyles(aRestyleState);
} else {
UpdateFirstLetterIfNeeded(aFrame, aRestyleState);
} }
UpdateBackdropIfNeeded( UpdateBackdropIfNeeded(

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

@ -7581,6 +7581,12 @@ nsBlockFrame::ResolveBidi()
void void
nsBlockFrame::UpdatePseudoElementStyles(ServoRestyleState& aRestyleState) 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()) { if (nsBulletFrame* bullet = GetBullet()) {
CSSPseudoElementType type = bullet->StyleContext()->GetPseudoType(); CSSPseudoElementType type = bullet->StyleContext()->GetPseudoType();
RefPtr<nsStyleContext> newBulletStyle = 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 == overflow-inline-overflow.html overflow-inline-overflow-ref.html
== 1385656.html 1385656-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 sys
import logging import logging
import os import os
import psutil
import signal import signal
import time import time
import tempfile import tempfile
@ -14,7 +15,6 @@ import urllib2
import mozdevice import mozdevice
import mozinfo import mozinfo
import mozprocess
from automation import Automation from automation import Automation
from remoteautomation import RemoteAutomation, fennecLogcatFilters from remoteautomation import RemoteAutomation, fennecLogcatFilters
@ -240,34 +240,25 @@ class RemoteReftest(RefTest):
def stopWebServer(self, options): def stopWebServer(self, options):
self.server.stop() self.server.stop()
def killNamedProc(self, pname): def killNamedProc(self, pname, orphans=True):
""" Kill processes matching the given command name """ """ Kill processes matching the given command name """
self.log.info("Checking for %s processes..." % pname) self.log.info("Checking for %s processes..." % pname)
def _psInfo(line): for proc in psutil.process_iter():
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: try:
os.kill( if proc.name() == pname:
pid, getattr(signal, "SIGKILL", signal.SIGTERM)) 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: except Exception as e:
self.log.info("Failed to kill process %d: %s" % self.log.info("Failed to kill process %d: %s" % (proc.pid, str(e)))
(pid, str(e))) else:
process = mozprocess.ProcessHandler(['ps', '-o', 'pid,ppid,comm'], self.log.info("NOT killing %s (not an orphan?)" % procd)
processOutputLine=_psKill) except:
process.run() # may not be able to access process info for all processes
process.wait() continue
def createReftestProfile(self, options, manifest, startAfter=None): def createReftestProfile(self, options, manifest, startAfter=None):
profile = RefTest.createReftestProfile(self, profile = RefTest.createReftestProfile(self,

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

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

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

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

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

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

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

@ -1140,4 +1140,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
static const int32_t kUnknownId = -1; 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 "SharedSSLState.h"
#include "cert.h" #include "cert.h"
#include "certdb.h" #include "certdb.h"
#include "mozStorageCID.h"
#include "mozilla/ArrayUtils.h" #include "mozilla/ArrayUtils.h"
#include "mozilla/Assertions.h" #include "mozilla/Assertions.h"
#include "mozilla/Casting.h" #include "mozilla/Casting.h"
@ -2263,14 +2262,6 @@ nsNSSComponent::Init()
return NS_ERROR_NOT_AVAILABLE; 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")); MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("Beginning NSS initialization\n"));
nsresult rv = InitializePIPNSSBundle(); nsresult rv = InitializePIPNSSBundle();

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

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

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

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

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

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

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

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

@ -24,6 +24,7 @@
#include "mozIStoragePendingStatement.h" #include "mozIStoragePendingStatement.h"
#include "sqlite3.h" #include "sqlite3.h"
#include "mozilla/AutoSQLiteLifetime.h"
#ifdef SQLITE_OS_WIN #ifdef SQLITE_OS_WIN
// "windows.h" was included and it can #define lots of things we care about... // "windows.h" was included and it can #define lots of things we care about...
@ -32,13 +33,6 @@
#include "nsIPromptService.h" #include "nsIPromptService.h"
#ifdef MOZ_STORAGE_MEMORY
# include "mozmemory.h"
# ifdef MOZ_DMD
# include "DMD.h"
# endif
#endif
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
//// Defines //// Defines
@ -282,12 +276,6 @@ Service::~Service()
if (rc != SQLITE_OK) if (rc != SQLITE_OK)
NS_WARNING("Failed to unregister sqlite vfs wrapper."); 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. shutdown(); // To release sXPConnect.
gService = nullptr; gService = nullptr;
@ -400,121 +388,7 @@ Service::shutdown()
} }
sqlite3_vfs *ConstructTelemetryVFS(); sqlite3_vfs *ConstructTelemetryVFS();
const char *GetVFSName();
#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
static const char* sObserverTopics[] = { static const char* sObserverTopics[] = {
"memory-pressure", "memory-pressure",
@ -527,28 +401,13 @@ Service::initialize()
{ {
MOZ_ASSERT(NS_IsMainThread(), "Must be initialized on the main thread"); MOZ_ASSERT(NS_IsMainThread(), "Must be initialized on the main thread");
int rc; int rc = AutoSQLiteLifetime::getInitResult();
#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();
if (rc != SQLITE_OK) if (rc != SQLITE_OK)
return convertResultCode(rc); return convertResultCode(rc);
mSqliteVFS = ConstructTelemetryVFS(); mSqliteVFS = ConstructTelemetryVFS();
if (mSqliteVFS) { if (mSqliteVFS) {
rc = sqlite3_vfs_register(mSqliteVFS, 1); rc = sqlite3_vfs_register(mSqliteVFS, 0);
if (rc != SQLITE_OK) if (rc != SQLITE_OK)
return convertResultCode(rc); return convertResultCode(rc);
} else { } else {

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