зеркало из https://github.com/mozilla/gecko-dev.git
Merge m-c to autoland, a=merge
MozReview-Commit-ID: Al9lnfQMbTU
This commit is contained in:
Коммит
ef10ff52f7
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,7 +10,7 @@ async function waitFor(condition) {
|
||||||
return condition();
|
return condition();
|
||||||
}
|
}
|
||||||
|
|
||||||
add_task(async function () {
|
add_task(async function() {
|
||||||
const dbg = await initDebugger("doc-minified.html");
|
const dbg = await initDebugger("doc-minified.html");
|
||||||
invokeInTab("arithmetic");
|
invokeInTab("arithmetic");
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Двоичные данные
devtools/client/debugger/new/test/mochitest/examples/wasm-sourcemaps/average.wasm
Normal file
Двоичные данные
devtools/client/debugger/new/test/mochitest/examples/wasm-sourcemaps/average.wasm
Normal file
Двоичный файл не отображается.
|
@ -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,10 +51,9 @@ 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);
|
|
||||||
|
|
||||||
void TemporaryFileCreated(PRFileDesc* aFD);
|
void TemporaryFileCreated(PRFileDesc* aFD);
|
||||||
|
|
||||||
|
|
|
@ -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,12 +2430,30 @@ 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())) {
|
||||||
NS_ENSURE_TRUE_VOID(node->Length() <= INT32_MAX);
|
// If offset points to the last child, use a fast path that avoids calling
|
||||||
aNode = node->GetChildAt(offset - 1);
|
// GetChildAt() which may perform a linear search.
|
||||||
aOffset = static_cast<int32_t>(aNode->Length());
|
nsIContent* child = node->GetLastChild();
|
||||||
return;
|
while (child) {
|
||||||
|
if (child->IsNodeOfType(nsINode::eTEXT)) {
|
||||||
|
NS_ENSURE_TRUE_VOID(node->Length() <= INT32_MAX);
|
||||||
|
aNode = child;
|
||||||
|
aOffset = static_cast<int32_t>(aNode->Length());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
child = child->GetPreviousSibling();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Fall back to a slow path that uses GetChildAt().
|
||||||
|
nsIContent* child = node->GetChildAt(offset - 1);
|
||||||
|
if (child && child->IsNodeOfType(nsINode::eTEXT)) {
|
||||||
|
NS_ENSURE_TRUE_VOID(node->Length() <= INT32_MAX);
|
||||||
|
aNode = child;
|
||||||
|
aOffset = static_cast<int32_t>(aNode->Length());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1728,7 +1728,6 @@ HTMLEditor::GetCSSBackgroundColorState(bool* aMixed,
|
||||||
|
|
||||||
// get selection location
|
// 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,8 +44,8 @@ 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,21 +350,20 @@ 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)++;
|
||||||
return result == DenseElementResult::Success;
|
return result == DenseElementResult::Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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,16 +1295,15 @@ 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,8 +797,8 @@ 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);
|
||||||
void AssertValidObjectOrNullPtr(JSContext* cx, JSObject* obj);
|
void AssertValidObjectOrNullPtr(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,8 +2283,8 @@ 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)
|
||||||
return false;
|
return false;
|
||||||
|
@ -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,16 +2867,16 @@ 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);
|
||||||
if (result == DenseElementResult::Failure)
|
if (result == DenseElementResult::Failure)
|
||||||
return false;
|
return false;
|
||||||
|
@ -2962,10 +2973,10 @@ array_splice_impl(JSContext* cx, unsigned argc, Value* vp, bool returnValueIsUse
|
||||||
uint32_t start = uint32_t(actualStart);
|
uint32_t 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);
|
||||||
if (result == DenseElementResult::Failure)
|
if (result == DenseElementResult::Failure)
|
||||||
return false;
|
return false;
|
||||||
|
@ -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:
|
try:
|
||||||
self.log.info(line)
|
if proc.name() == pname:
|
||||||
process = mozprocess.ProcessHandler(['ps', '-f'],
|
procd = proc.as_dict(attrs=['pid', 'ppid', 'name', 'username'])
|
||||||
processOutputLine=_psInfo)
|
if proc.ppid() == 1 or not orphans:
|
||||||
process.run()
|
self.log.info("killing %s" % procd)
|
||||||
process.wait()
|
try:
|
||||||
|
os.kill(proc.pid, getattr(signal, "SIGKILL", signal.SIGTERM))
|
||||||
def _psKill(line):
|
except Exception as e:
|
||||||
parts = line.split()
|
self.log.info("Failed to kill process %d: %s" % (proc.pid, str(e)))
|
||||||
if len(parts) == 3 and parts[0].isdigit():
|
else:
|
||||||
pid = int(parts[0])
|
self.log.info("NOT killing %s (not an orphan?)" % procd)
|
||||||
if parts[2] == pname:
|
except:
|
||||||
self.log.info("killing %s with pid %d" % (pname, pid))
|
# may not be able to access process info for all processes
|
||||||
try:
|
continue
|
||||||
os.kill(
|
|
||||||
pid, getattr(signal, "SIGKILL", signal.SIGTERM))
|
|
||||||
except Exception as e:
|
|
||||||
self.log.info("Failed to kill process %d: %s" %
|
|
||||||
(pid, str(e)))
|
|
||||||
process = mozprocess.ProcessHandler(['ps', '-o', 'pid,ppid,comm'],
|
|
||||||
processOutputLine=_psKill)
|
|
||||||
process.run()
|
|
||||||
process.wait()
|
|
||||||
|
|
||||||
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,14 +563,13 @@ 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
|
|
||||||
* will instead swap it with its successor
|
|
||||||
* and delete the successor. Record enough
|
|
||||||
* information to do the swap later.
|
|
||||||
* rbp_r_xp is aNode's parent. */
|
|
||||||
rbp_r_xp = rbp_r_p;
|
|
||||||
}
|
}
|
||||||
|
/* This is the node we want to delete, but we
|
||||||
|
* will instead swap it with its successor
|
||||||
|
* and delete the successor. Record enough
|
||||||
|
* information to do the swap later.
|
||||||
|
* rbp_r_xp is aNode's parent. */
|
||||||
|
rbp_r_xp = rbp_r_p;
|
||||||
}
|
}
|
||||||
rbp_r_t = rbp_r_c->Right();
|
rbp_r_t = rbp_r_c->Right();
|
||||||
rbp_r_u = rbp_r_t->Left();
|
rbp_r_u = rbp_r_t->Left();
|
||||||
|
|
|
@ -5906,5 +5906,9 @@ pref("toolkit.crashreporter.include_context_heap", true);
|
||||||
// Open noopener links in a new process
|
// 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 {
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче